以下の内容はhttps://tech.excite.co.jp/entry/2024/07/30/120819より取得しました。


AWS Copilot CLIのサイドカーのログドライバーにFireLensを適用させる

はじめに

エキサイト株式会社 バックエンドエンジニアの山縣(@zsp2088dev)です。 現在、既存サービスのリビルドにあたり、AWS Copilot CLIを使用してコンテナ環境を構築しています。 コンテナ環境には、サイドカーコンテナにnginxを使用しており、またログをFireLensで管理しています。 この時、Manifestにloggingセクションを定義し、メインコンテナのログドライバにFireLensを適用できたものの、サイドカーコンテナにはFireLensを適用できない問題がありました。

本記事では、上記の原因と解決策についてまとめます。 また、本記事内で扱うAWS Copilot CLIのバージョンはv1.34.0です。

概要

以下の画像は、今回扱うコンテナ環境の全体図です。 ALBからのリクエストを、サイドカーコンテナであるnginxコンテナで受けるような構成にしています。 Manifestにhttp.target_containerセクションを定義することで、サイドカーコンテナでもリクエストを受け付けることができるようになります。

ログの設定では、Manifestにloggingセクションを定義することで、FireLensを使用することができます。 これにより、アクセスログはS3に、エラーログはS3とCloudWatchに流すといった柔軟なログの管理ができるようになります。

logging:
  image: example-fluentbit
  configFilePath: /fluent-bit/etc/fluent-custom.conf

この時、メインコンテナのログドライバと、サイドカーコンテナのログドライバを見てみると、メインコンテナではawsfirelensサイドカーコンテナではawslogsが適用されていることが確認できました。 loggingセクションを定義しているので、サイドカーコンテナでもFireLensが適用されることを期待していたため、なぜ適用されないのか調査することになりました。

原因

aws/copilot-cliリポジトリを見てみると、サイドカーコンテナの場合、ログドライバはawslogsに固定されてるようです。 そのため、Manifestにloggingセクションを定義したとしても、サイドカーコンテナのログドライバはawsfirelensに変更することができませんでした。

{{- if $sidecar.Secrets}}
  Secrets:
  {{- range $name, $secret := $sidecar.Secrets}}
  - Name: {{$name}}
  {{- if $secret.RequiresImport}}
    ValueFrom:
      Fn::ImportValue: {{ quote $secret.ValueFrom }}
  {{- else}}
    ValueFrom: {{if not $secret.RequiresSub }} {{$secret.ValueFrom}} {{- else}} !Sub 'arn:${AWS::Partition}:{{$secret.Service}}:${AWS::Region}:${AWS::AccountId}:{{$secret.ValueFrom}}' {{- end}}
  {{- end}}
  {{- end}}
{{- end}}
  LogConfiguration:
    LogDriver: awslogs
    Options:
      awslogs-region: !Ref AWS::Region
      awslogs-group: !Ref LogGroup
      awslogs-stream-prefix: copilot

github.com

解決策

AWS Copilot CLIの生成するCloudFormationテンプレートに対して、YAMLパッチを当てることで、サイドカーコンテナのログドライバをawsfirelensに変更することができます。

生成されたCloudFormationのテンプレートを見ると、サイドカーコンテナは、メインコンテナ、firelens_log_routerコンテナの次に位置します。 そのため、配列の2番目を指定してログドライバにawsfirelensを指定することで、サイドカーコンテナのログドライバをawsfirelensに変更できます。

# ログドライバをawsfirelensに置き換える。
- op: replace
  path: /Resources/TaskDefinition/Properties/ContainerDefinitions/2/LogConfiguration/LogDriver
  value: awsfirelens

# 不要なオプションを除去する。除去しない場合はエラーになる。
- op: remove
  path: /Resources/TaskDefinition/Properties/ContainerDefinitions/2/LogConfiguration/Options

YAMLパッチの詳細については、以下のドキュメントをご参照ください。

aws.github.io

おわりに

AWS Copilot CLIを使用することで、手っ取り早くコンテナ環境を構築できます。 一方で、より踏み込んだ設定をしたい場合は、YAMLパッチを当てるためにCloudFormationのテンプレートと向き合う必要があります。 本記事がお役に立てれば幸いです。

採用アナウンス

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しています。 また、長期インターンも歓迎しています。 少しでもご興味がございましたら、お気軽にご連絡頂ければ幸いです。

▼ 募集職種一覧 ▼ recruit.jobcan.jp




以上の内容はhttps://tech.excite.co.jp/entry/2024/07/30/120819より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14