概要
コンテナのログを外部にルーティングする機能
TaskDefinition のパラメータで作成する
必要な要素
- ログ収集:FireLens コンテナ
- ログ対象:LogDriver に awsfirelens を指定したコンテナ
- ログ送信先:Kinesis Data Firehose や CloudWatch Logs 等
FireLens コンテナの動作
ログ転送ツールとして Fluentd か Fluent Bit を使用
- Fluentd 多機能 自由度高
- Fluent Bit 簡易的 軽量
Role
TaskRole と ExecutionRole が必要
- TaskRole
- タスクで定義したコンテナからのアクセス権限
→ コンテナ内のアプリケーションが使用する
- タスクで定義したコンテナからのアクセス権限
- ExecutionRole
- タスクの展開実行のためのアクセス権限
→ ログ送信先の CloudWatch LogGroup を作成する
- タスクの展開実行のためのアクセス権限
作成
ECS/Fargate を利用
環境
Windows 10
AWS CLI 1.16.191
AWS CLI のインストール - AWS
構成図
Nginx のログは FireLens と Firehose を通して S3 へ
FireLens のログは CloudWatch Logs へ送信する
Kinesis Data Firehose
下記を参考にログの送信先の配信ストリームを作成
Amazon Kinesis Data Firehose 配信ストリームの作成 - AWS
Role
TaskRole
Kinesis Firehose への書き込み権限
Amazon Kinesis Firehose のアクション、リソース、および条件キー - AWS
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"firehose:PutRecord",
"firehose:PutRecordBatch"
],
"Resource": "*"
}
]
}
ExecutionRole
公式の AmazonECSTaskExecutionRolePolicy に CreateLogGroup を追記
Amazon ECS タスク実行 IAM ロール - AWS
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
CFn で作成
コンテナ定義と注意点だけ記述
ContainerDefinitions:
- Name: nginx
Image: 'nginx:latest'
Essential: true
PortMappings:
- Protocol: tcp
ContainerPort: 80
LogConfiguration:
LogDriver: awsfirelens
Option:
Name: firehose
region: ap-northeast-1
delivery_stream: firelens-stream
- Name: firelens
Image: '906394416424.dkr.ecr.ap-northeast-1.amazonaws.com/aws-for-fluent-bit:latest'
Essential: true
FirelensConfiguration:
Type: fluentbit
LogConfiguration:
LogDraiver: awslogs
Option:
awslogs-create-group: true
awslogs-region: ap-northeast-1
awslogs-group: /ecs/firelens-container
awslogs-stream-prefix: firelens
Nginx コンテナ
- LogDriver に awsfirelens を指定
- Option で東京リージョンの firehose の firelens-stream に送信する設定
→ delivery_stream キーは yaml であっても 'snake_case' で記述
- Option で東京リージョンの firehose の firelens-stream に送信する設定
FireLens コンテナ
- FirelensConfiguration キーを追加
- Type キーの方に fluentbit を指定
→ 階層に注意
- Type キーの方に fluentbit を指定
- LogDriver に awslogs を指定
- Option で東京リージョンの /ecs/firelens-container の firelens ストリームを作成し送信
→ 用意していなければ LogGroup は明示的に作る必要がある
- Option で東京リージョンの /ecs/firelens-container の firelens ストリームを作成し送信
確認
総括
新しめのサービスなので試すだけでも割と楽しかった
delivery_stream キーと LogGroup 作成忘れでハマったのでもっと CFn 書き慣れていくべきだなという気持ち