1923

都内と業界の隅っこで生活しているエンジニアのノート

Azure Container Instances のGoアプリから Fluentd 経由で Azure Monitor にログ出力

Azure Container Instances(ACI)で動いているGoアプリのログをAzure Monitorに送信してみます。今回はGoアプリから直接送らずに同じコンテナグループ内のFluentd経由でAzure Monitorにログを転送しています

アプリの準備

fluent-logger-golangを使って、GoアプリからFluentdへのログを転送します。README.mdに書かれている通りに使ってみます。

package main

import (
    "fmt"
    "github.com/fluent/fluent-logger-golang/fluent"
    "github.com/gin-gonic/gin"
)

func main() {
    logger, err := fluent.New(fluent.Config{})
    if err != nil {
        fmt.Println(err)
    }
    defer logger.Close()
    tag := "azure-loganalytics.access"

    router := gin.Default()
    router.LoadHTMLGlob("templates/*.html")
    router.GET("/", func(ctx *gin.Context){
        message := "Hello World"
        var data = map[string]string{
            "message": message,
        }
        if err := logger.Post(tag, data); err != nil {
            panic(err)
        }
        ctx.HTML(200, "index.html", gin.H{
            "message": message,
        })
    })
    router.Run()
}

fluentdの準備

fluent-plugin-azure-loganalyticsをインストールしたコンテナを準備します。こちらもREADME.mdに書かれている通りです。

fluent.conf

<source>
  @type  forward
  @id    input1
  port  24224
  tag azure-loganalytics.access
</source>

<match azure-loganalytics.**>
    @type azure-loganalytics
    customer_id XXX
    shared_key XXX
    log_type ApplicationLog
</match>

Dockerfile

FROM fluent/fluentd:v1.12-1

USER root

RUN apk add --no-cache --update --virtual .build-deps \
 sudo build-base ruby-dev \
 # cutomize following instruction as you wish
 && sudo gem install fluent-plugin-azure-loganalytics \
 && sudo gem sources --clear-all \
 && apk del .build-deps \
 && rm -rf /home/fluent/.gem/ruby/2.5.0/cache/*.gem

COPY fluent.conf /fluentd/etc/
COPY entrypoint.sh /bin/

USER fluent

実行

準備完了。適当にローカルで動かして問題なさそうでしたので、Azure Container Registry(ACR)にイメージをプッシュして、ACI でアプリケーションを起動。

docker compose up -f docker-compose.aci.yml

docker-compose.aci.yml

version: '3'
services:
  web:
    image: <ACRNAME>.azurecr.io/fluent-go
    ports:
      - 8080:8080
  fluentd:
    image: <ACRNAME>.azurecr.io/fluent-loganalytics
    ports:
      - "24224:24224"

出力出来ました。

f:id:taka1923:20210117133325p:plain

ACI以外でGoアプリからAzure Monitorへのログ送信する場合は、Web Apps for ContainerはAzure Monitor にログを送信する (プレビュー)。Virtual MachinesはLogging Driverの方がシンプルですね。