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"
出力出来ました。
ACI以外でGoアプリからAzure Monitorへのログ送信する場合は、Web Apps for ContainerはAzure Monitor にログを送信する (プレビュー)。Virtual MachinesはLogging Driverの方がシンプルですね。