【AWS】ECSコンテナのロギング手段まとめ | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

今日もAWSの勉強を進めていきます。

今回は、ECSでログを取得・収集・管理する手法にどんなものがあるか、まとめていきます。

(2023年4月時点の情報です)

 

もくじ

1.ECSでの主なログ取得方法

2.ログドライバを利用したログ取得

 ・利用できるログドライバ

 ・ECSタスク定義のパラメータ設定

3.AWS CloudWatch Logsを利用したログ取得

 ・AWS CloudWatch Logsとは

 ・CloudWatch LogsによるECSコンテナのロギング方法

4.FireLens for Amazon ECSを利用したログ取得

 ・FireLens for Amazon ECSとは

 ・ECSタスク定義のパラメータ設定

 

1.ECSでの主なログ取得方法

Amazon ECSでログを取得・管理する方法は複数ある。

以下に、主なログ取得・管理方法の概要を示す。

 

方法 説明
ログドライバ ロギングアプリケーションにログを転送・集約・管理する方法。
ECSタスク定義にて、当該ロギングアプリケーションのログドライバを指定する必要。
AWS CloudWatch Logs AWSのサービスであるCloudWatch Logsに、ログを転送・集約・管理する方法。
FireLens for Amazon ECS FireLens for Amazon ECSを利用して、AWSのサービス等にログを転送・集約・管理する方法。
AWS CloudTrail AWS CloudTrailで、ECSからのAPIコールなどのイベントを記録する方法。
ログ内容を作りこみたい時は不向きだが、
無料かつデフォルトで有効になっているサービスのため、
必要に応じてイベント履歴を参照・利用すると良い。
記録したイベントの確認や履歴保存期間設定などの操作は、CloudTrail側で行う。
コンテナ内でのログ出力 コンテナ内に直接ログを出力する方法。
ただしこの方法では、ログの集約や解析が困難になることがある。

 

以降、本記事では、

ログドライバ、AWS CloudWatch Logs、FireLens for Amazon ECSを利用する各方法について、

詳細を見ていく。

 

2.ログドライバを利用したログ取得

◎利用できるログドライバ

Dockerコンテナでは、ログの集約や管理をコンテナ自身で行わず、

専用のロギングアプリケーションに任せることが一般的である。

その際、利用するロギングアプリケーションのドライバを設定することが必要となる。

 

デフォルトでは、ECSのコンテナは、

Dockerデーモンで使用されるのと同じログドライバを使用するが、

設定次第で別のドライバを利用することもできる。

ホストがFargateかEC2かによって、利用可能なログドライバは以下の通り異なる。

 

ホスト 利用可能なドライバ 備考
Fargate awslogs
splunk
awsfirelens
ロギングのために追加のソフトウェアがいる場合、
タスクの外でインストールする必要あり。
EC2 awslogs
fluentd
gelf
json-file
journald
logentries
syslog
splunk
awsfirelens

ホストの環境変数"ECS_AVAILABLE_LOGGING_DRIVERS"に

ログドライバを登録しておく必要あり。

 

◎ECSタスク定義のパラメータ設定

ECSでログドライバを利用する場合は、

ECSタスク定義にて、オブジェクト型のパラメータ"logConfiguration"を設定する必要がある。

"logConfiguration"オブジェクトは以下のパラメータを持つ。

 

パラメータ 説明
logDriver 使用するログドライバを設定する。
options ログドライバに送信する構成情報のキーと値ペア。
例えばawslogsをログドライバとする時に、
awslogsに渡す、ログストリーム送信先となるロググループの情報などを指定できる。
secretOptions ログドライバに送信する、機密情報へのアクセス情報。
認証情報などをログドライバに渡したいときに指定する。

 

 

 

3.AWS CloudWatch Logsを利用したログ取得

◎AWS CloudWatch Logsとは

AWS CloudWatchは、AWSの各種サービスやオンプレミスのリソースに対して、

モニタリング(監視)や、モニタリングデータの活用を行えるサービスである。

 

CloudWatch Logsはその中でも代表的な機能の1つであり、

ECSコンテナに限らず、各種AWSサービスやアプリケーションのログを、

収集・監視・保存・アクセス・分析するサービスを提供している。

 

※AWS CloudWatchのその他の機能は、以前の記事↓に概要をまとめています。

 

ECSのログ収集において、AWS CloudWatch Logsを利用するケースは、

よくある事例の1つとなっている。

 

◎CloudWatch LogsによるECSコンテナのロギング方法

ECSのコンテナのロギングにCloudWatch Logsを用いるには、

ホストの種別によって、以下の設定・条件を全て満たすことが必要となる。

 

ホスト 必要な設定・前提条件
Fargate ①ECSタスク定義のパラメータ設定
EC2 ①コンテナエージェントのバージョンが1.9.0以降であること
②ECSタスク定義のパラメータ設定
③IAMロールの設定

 

*ECSタスク定義のパラメータ設定

ECSでログドライバを利用する場合と同様、

ECSタスク定義にて、オブジェクト型のパラメータ"logConfiguration"を設定する必要がある。

設定内容は以下の通り。

※"logConfiguration"オブジェクトの各パラメータの説明は2.ログドライバを利用したログ取得を参照。

 

 ・logConfigurationオブジェクトの"logDriver"パラメータに、"awslogs"を指定。

 ・logConfigurationオブジェクトの"options"パラメータに、以下の値を指定。

 

設定項目 説明 必須
awslogs-create-group ロググループを自動的に作成する(true)か否(false)か。
デフォルトはfalse。
※ロググループ:CloudWatch Logsのログの管理単位。
×
awslogs-region ログ送信先となるAWSのリージョン。
awslogs-group ログストリームを送信する先のロググループ。
awslogs-stream-prefix ログストリームがどのコンテナのものか、対応関係を分かりやすくするためのプレフィックス値。
ホストがFargateの場合は必須、EC2の場合は必須でないが設定推奨。
awslogs-datetime-format ログが複数行に渡るとき、行開始とするパターン。Python strftime形式で指定する。
awslogs-multiline-patternとの併用不可。
×
awslogs-multiline-pattern ログが複数行に渡るとき、行開始とするパターン。
正規表現で指定する。

awslogs-datetime-formatとの併用不可。
×
mode コンテナからawslogsドライバへの、ログ配信モード。
blocking:コンテナから直接ドライバへログを配信する。
non-blocking:ログをコンテナ毎の中間バッファ領域に保存する。
×
max-buffer-size modeをnon-blockingとした場合の、中間バッファ領域のサイズ。 ×

 

*IAMロールの設定

ホストがEC2の場合、ホストのIAMロールに、以下の権限を含める必要がある。

 ・logs:CreateLogStream

 ・logs:PutLogEvents


 

 

4.FireLens for Amazon ECSを利用したログ取得

◎FireLens for Amazon ECSとは

FireLensとは、OSSのロギングアプリケーションであるFluentdFluent Bitと連携し、

コンテナのログの収集および、様々なAWS内外のサービスへ出力・活用を簡単に行えるようにしたサービスである。

Fargate、EC2の両ホストで利用できるが、Windwosコンテナでは利用できない。

 

前章で紹介したAWS CloudWatch Logsと、FireLens for Amazon ECSは、

いずれもAWSのロギングサービスと言えるが、

両者には以下のような違いがある。

 

  CloudWatch Logs FireLens
ログ出力先 CloudWatchだけ
※CloudWatchから更に
別の宛先(S3など)に転送は可能。
AWSのサービスおよび、
AWSパートナーの各種宛先
※複数指定可能。
ログの内容によって出力先を分けることもできる

 

FireLensは、AWSサービス外含めて、複数箇所にログを送信でき、

カスタマイズ性に優れているのが長所である。

なお、ログの送信先などの詳細は、タスク定義のパラメータ設定値で柔軟に指定できる。

 

またFireLensを利用する際は、サイドカー構成(メインのコンテナとは別で、補助的な処理(ここではロギング)を行うコンテナを設ける構成)を取ることが一般的である。

 

以上を図にまとめると、以下のようになる。

 

サイドカー構成をとる場合は、メインのコンテナのlogDriverをawsfirelensにする必要がある。

 

 

◎ECSタスク定義のパラメータ設定

FireLens for Amazon ECSを利用してロギングするコンテナを作成するには、

ECSタスク定義にて、オブジェクト型パラメータ"firelensConfiguration"を設定する必要がある。

 

※コンテナがたくさん出てきてややこしいが、

firelensConfigurationの設定対象となるコンテナは赤枠で囲ったやつ。↓

ちなみによくある事例としてサイドカー構成の図を載せているが、

Firelensを利用するコンテナが必ずしもサイドカーコンテナである必要はない。

 

"firelensConfiguration"オブジェクトのパラメータは以下の通り。

 

パラメータ 説明
type FireLensの裏で使用するログルータ。
fluentd または fluentbit のいずれかを指定する。
options ログルータを設定するときに使用するオプション。
ログのカスタム設定ファイルパス情報や、
ログに追加するメタデータ(タスク、クラスター、ホストの詳細など)を設定できる。

 

 
 

参考文献

・AWS公式ドキュメント
 
今回は以上!