Amaozn ECSがawslogs Logging Driver(Amazon CloudWatch Logs)に対応しました
SA岩永(@riywo)です。今日はゴールデンウィーク中にリリースされたAmazon ECSのawslogs対応についてご紹介します。これを使えばコンテナのログを簡単にAmazon ClodWatch Logsに収集できるので、もうログ収集用に仕組みを作る必要がなくなります!
awslogs Logging Driverについて
Dockerのログの書き出し先として利用できるのがLogging Driverであり、デフォルトはjson-fileとなっていて稼働しているホストのファイルシステムにjson形式でログファイルを吐き出しています。
実はDocker 1.9からawslogsというLogging Driverが追加されていて、こちらはAmazon CloudWatch LogsというAWSのログ収集サービスを書き出し先として使えるものになっています。つまり、これを使えばDockerコンテナでログとして残しておきたい内容をstdout/stderrに吐き出す様にしておくだけで、自動的にCloudWatch Logsに保存されていきます。CloudWatch Logsではさらに、キーワードでのログの検索やその回数に応じてアラートを上げる機能、Amazon S3にログをエクスポートする機能、Amazon Kinesis Streamsにログを流してリアルタイム処理する、AWS Lambdaを実行させる、さらにAmazon Elasticsearch Serviceにログを入れるなど、一度CloudWatch Logsに入ってくればその後様々にログを活用していくことも可能となっています。CloudWatch Logsについて詳しくはBlack Beltの資料などをご覧下さい。
ちなみに、このawslogsの開発はECSのサービスチームが行いPull RequestしてMergeされたものとなっています。
Amazon ECSでもLogging Driverを差し替えることは可能で、Task Definitionでコンテナ毎にLogging Driverが指定可能となっているのですが、残念ながらawslogsへの対応ができておらずDocker 1.9対応後も利用できない状態が続いていました。
Amazon ECSでawslogsを利用する
そして先週ついにこちらの対応が終わり、Task Definitionでawslogsを指定できるようになりました!詳細な手順はドキュメントのUsing the awslogs Log Driverに記述されているので、ぜひお試し頂ければと思います。
以下、その際の注意点などを紹介したいと思います。
ECS Agentのバージョン
1.9.0以上が必要となります。ECS optimized AMIの2016.03.b以上の方は作業不要ですが、それ以前のAMIの場合はUpdate Agentの機能を使ってバージョンを上げるか、新しいAMIで作ったEC2インスタンスに入替えをお願いします。それ以外の環境でお使いの方はこちらの手順でバージョンアップをお願いします。
ECS_AVAILABLE_LOGGING_DRIVERS
ECS agent側でこちらの環境変数の中にawslogsを含ませることで利用可能となります。最新のECS optimized AMIの2016.03.b以上を利用されている場合は設定不要です。
但し、2016年5月9日現在それ以前のAMIからUpdate Agentで1.9.0にした場合はこちらが自動で設定されないので、/etc/ecs/ecs.configに以下の様な形で指定する必要があります(他にも利用しているdriverがあれば含める様にして下さい)。
ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"]
また、ECS optimized AMI以外を利用されている方は環境変数で同じ内容を渡してAgentを起動するようにして下さい。
EC2のIAM Role
awslogsはCloudWatch LogsのAPIを通じてログを転送するので、そのAPIを叩ける権限をContainer InstanceのEC2に割り当てられたIAM Roleに与えておく必要があります。但し、AWS Managed PolicyであるAmazonEC2ContainerServiceforEC2Roleをattachしている場合には既に追加されているので何もしなくて大丈夫です。それ以外の方法で権限を与えている方は、ドキュメントにあるlogs:CreateLogStreamとlogs:PutLogEventsの権限を与える様にして下さい。
Log Groupの作成
最後の事前準備として、ログが保存されるLog Groupを任意の名前で作成しておく必要があり、どのようなGroupにするかはご自身で決めて頂くことになります。実際のログはこのあとTask Definitionで指定するLog Group配下にDockerのContainer IDを名前とするLog Streamの中に保存されます(特にStreamを指定しない場合)。なので、役割毎にLog Groupを分けておくのが良さそうで、ドキュメントではwordpressとmysqlでGroupを作成しています。
Task Definitionでの指定方法
あとはTask Definitionを作る際に、コンテナ毎に上で作成したLog Groupとそのリージョンを指定するだけでOKです。なおDocker 1.9ではリージョンの指定は必須となっているので、利用するCloudWatch LogsのリージョンがECSと同じリージョンでも指定する必要がありますのでご注意下さい。
まとめ
これまでAmazon ECSでコンテナのログ収集で悩まれていた方は、今回のawslogs対応を利用するとかなり便利になるのではないかと思います。もし機能的にこういったものも追加して欲しいといった話があれば、お近くのAWSの人間か私までご連絡頂ければ直接サービスチームにフィードバックしますのでぜひよろしくお願い致します!
コメント