
はじめに
エキサイト株式会社 バックエンドエンジニアの山縣(@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
解決策
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 Copilot CLIを使用することで、手っ取り早くコンテナ環境を構築できます。 一方で、より踏み込んだ設定をしたい場合は、YAMLパッチを当てるためにCloudFormationのテンプレートと向き合う必要があります。 本記事がお役に立てれば幸いです。
採用アナウンス
エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しています。 また、長期インターンも歓迎しています。 少しでもご興味がございましたら、お気軽にご連絡頂ければ幸いです。
▼ 募集職種一覧 ▼ recruit.jobcan.jp