AWS CodeDeployエージェントログをCloudwatch Logsに転送する
Auto ScalingとCodeDeployを組み合わせて運用しているケースは多いかと思います。 Auto Scalingに伴うインスタンスのScale In/Outを意識することなく、ログ収集するために、CloudWatch Logs Agentを使ってCodeDeploy AgentのログをCloudWatch Logsに集約する方法を紹介します。
AWS CodeDeployとは
AWS CodeDeploy は、Amazon EC2 インスタンス、およびオンプレミスで稼働するインスタンスを含む、さまざまなインスタンスへのコードのデプロイを自動化するサービスです。
2015年の8月から東京リージョンで使えるようになったため認知度は今ひとつですが、Auto Scaling Groupと連動してデプロイできるのは非常に魅力的です。
検証環境
AWS CodeDeploy は Windows OS やオンプレ環境でも動きますが、今回は Amazon Linux(2015-09) on EC2 で検証します。 codedeploy-agent のバージョンは現時点で最新の 1.0 を利用します。
EC2 の起動
EC2 を IAM Role 付きで起動します。 S3 操作などCodeDeploy固有のポリシーにプラスして、今回はCloudWatch Logs にログを送信するため、同サービスの操作も許可します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:*" ] } ] }
CodeDeploy Agentのインストール
EC2 起動後は codedeploy-agent をインストールします。
$ sudo yum install -y codedeploy-agent $ sudo chkconfig codedeploy-agent on $ sudo service codedeploy-agent start
インストールされた codedeploy-agent のバージョンは次のコマンドで確認できます。
$ cat /opt/codedeploy-agent/.version agent_version: OFFICIAL_1.0-1.880_rpm
AWS CodeDeploy のログの種類
AWS CodeDeploy 固有のログの種類を見ていきましょう。
デプロイ時のログ
/opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log
ファイルの出力例
# Logfile created on 2016-03-06 03:59:45 +0000 by logger.rb/41954 [2016-03-06 03:59:45.164] [d-47VY9KPOD]LifecycleEvent - BeforeInstall [2016-03-06 03:59:45.164] [d-47VY9KPOD]Script - scripts/install_dependencies [2016-03-06 03:59:45.275] [d-47VY9KPOD][stdout]Loaded plugins: priorities, update-motd, upgrade-helper [2016-03-06 03:59:45.491] [d-47VY9KPOD][stdout]Resolving Dependencies [2016-03-06 03:59:45.492] [d-47VY9KPOD][stdout]--> Running transaction check [2016-03-06 03:59:45.492] [d-47VY9KPOD][stdout]---> Package httpd.x86_64 0:2.2.31-1.6.amzn1 will be installed [2016-03-06 03:59:45.519] [d-47VY9KPOD][stdout]--> Processing Dependency: httpd-tools = 2.2.31-1.6.amzn1 for package: httpd-2.2.31-1.6.amzn1.x86_64 [2016-03-06 03:59:45.572] [d-47VY9KPOD][stdout]--> Processing Dependency: apr-util-ldap for package: httpd-2.2.31-1.6.amzn1.x86_64 [2016-03-06 03:59:45.573] [d-47VY9KPOD][stdout]--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.2.31-1.6.amzn1.x86_64
codedeploy-agent のログ
/var/log/aws/codedeploy-agent/codedeploy-agent.log
codedeploy-agent の設定ファイル /etc/codedeploy-agent/conf/codedeployagent.yml
の :verbose:
を true
にすると DEBUG レベルのログも出力されます。
:voerbose:
のデフォルト値は、Windows は true
、 Linux は false
です。
ファイルの出力例
2016-03-06 03:41:49 INFO [codedeploy-agent(2503)]: master 2503: Spawned child 1/1 2016-03-06 03:41:49 INFO [codedeploy-agent(2507)]: On Premises config file does not exist or not readable 2016-03-06 03:41:50 INFO [codedeploy-agent(2503)]: Started master 2503 with 1 children 2016-03-06 03:42:50 INFO [codedeploy-agent(2507)]: [Aws::CodeDeployCommand::Client 200 60.161718 0 retries] poll_host_command(host_identifier:"arn:aws:ec2:ap-northeast-1:205974338614:instance/i-a48d9501") 2016-03-06 03:43:52 INFO [codedeploy-agent(2507)]: [Aws::CodeDeployCommand::Client 200 60.647186 0 retries] poll_host_command(host_identifier:"arn:aws:ec2:ap-northeast-1:205974338614:instance/i-a48d9501") 2016-03-06 03:44:53 INFO [codedeploy-agent(2507)]: [Aws::CodeDeployCommand::Client 200 60.525137 0 retries] poll_host_command(host_identifier:"arn:aws:ec2:ap-northeast-1:205974338614:instance/i-a48d9501") 2016-03-06 03:45:55 INFO [codedeploy-agent(2507)]: [Aws::CodeDeployCommand::Client 200 60.436532 0 retries] poll_host_command(host_identifier:"arn:aws:ec2:ap-northeast-1:205974338614:instance/i-a48d9501")
S3 とのワイアログ
/var/log/aws/codedeploy-agent/codedeploy-agent.aws_wire.log
codedeploy-agent の設定ファイル /etc/codedeploy-agent/conf/codedeployagent.yml
で:log_aws_wire:
がtrue
の場合のみ出力されます。
デフォルトでは false
です。
ログ量が膨大なため、明確な意図がある場合のみ有効にしましょう。
ファイルの出力例
# Logfile created on 2016-03-06 04:06:44 +0000 by logger.rb/41954 opening connection to codedeploy-commands.ap-northeast-1.amazonaws.com:443... opened starting SSL for codedeploy-commands.ap-northeast-1.amazonaws.com:443... SSL established <- "POST / HTTP/1.1\r\nContent-Type: application/x-amz-json-1.1\r\nAccept-Encoding: \r\nUser-Agent: aws-sdk-ruby2/2.2.4 ruby/2.0.0 x86_64-linux\r\nX-Amz-Target: CodeDeployCommandService_v20141006.PollHostCommand ..." -> "HTTP/1.1 200 OK\r\n" -> "x-amzn-RequestId: d6d35118-e350-11e5-8b11-c1e3e2206b0e\r\n" -> "Content-Type: application/x-amz-json-1.1\r\n" -> "Content-Length: 713\r\n"
aws-codedeploy-agent のインストール時のログです。
/tmp/codedeploy-agent.update.log
ファイルの出力例
# Logfile created on 2016-03-06 04:08:18 +0000 by logger.rb/41954 I, [2016-03-06T04:08:18.524777 #3455] INFO -- : Starting Ruby version check. I, [2016-03-06T04:08:18.524854 #3455] INFO -- : Starting update check. I, [2016-03-06T04:08:18.524886 #3455] INFO -- : Checking AWS_REGION environment variable for region information... I, [2016-03-06T04:08:18.524906 #3455] INFO -- : Checking EC2 metadata service for region information... I, [2016-03-06T04:08:18.538773 #3455] INFO -- : Downloading version file from bucket aws-codedeploy-ap-northeast-1 and key latest/VERSION... I, [2016-03-06T04:08:18.588348 #3455] INFO -- : Downloading package from bucket aws-codedeploy-ap-northeast-1 and key releases/codedeploy-agent-1.0-1.880.noarch.rpm... I, [2016-03-06T04:08:18.704001 #3455] INFO -- : Executing `/usr/bin/yum -y localinstall /tmp/codedeploy-agent-1.0-1.880.noarch.tmp-20160306-3455-1w8ma3z.rpm`... Loaded plugins: priorities, update-motd, upgrade-helper Examining /tmp/codedeploy-agent-1.0-1.880.noarch.tmp-20160306-3455-1w8ma3z.rpm: codedeploy-agent-1.0-1.880.noarch
CloudWatch Logs Agentのインストール
次に CloudWatch Logs をインストールします。
$ sudo yum install -y awslogs $ sudo chkconfig awslogs on
基本設定
次に設定ファイル /etc/awslogs/awscli.conf
を修正します。
[plugins] cwlogs = cwlogs [default] ; region = us-east-1 region = ap-northeast-1
初期状態ではリージョンが us-east-1
を向いているため、EC2のいるリージョンに変更します。今回の場合は ap-northeast-1
としました。
IAM RoleでCloudWatch Logsに書き込む権限を付与しているため、AWSのクレデンシャル情報は設定不要です。
最後に CloudWatch Logs エージェントを起動します。
$ sudo service awslogs start
CodeDeployエージェントログファイルをCloudWatch Logsに送信する
ようやく本題です。
次の設定内容で/etc/awslogs/config/codedeploy_logs.conf
に保存します。
送信すべきログファイルとそのファイルのCloudWatch LogsのLog Groupとの対応付けを定義しています。
[codedeploy-agent-logs] datetime_format = %Y-%m-%d %H:%M:%S file = /var/log/aws/codedeploy-agent/codedeploy-agent.log log_stream_name = {instance_id}-codedeploy-agent-log log_group_name = codedeploy-agent-log [codedeploy-updater-logs] file = /tmp/codedeploy-agent.update.log log_stream_name = {instance_id}-codedeploy-updater-log log_group_name = codedeploy-updater-log [codedeploy-deployment-logs] file = /opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log log_stream_name = {instance_id}-codedeploy-deployments-log log_group_name = codedeploy-deployments-log
log_stream_nameに{instance_id}を含めて、CloudWatch Logsからはインスタンス単位で抽出出来るようにします。
最後に設定変更を有効にするため awslogs サービスをリスタートします。
$ sudo service awslogs restart
管理コンソールからログを確認
CloudWatch → Logs と進み、codedeploy で Log Groups を絞り込んだ画面
Log Groups 一覧から codedeploy-agent-log を選択した画面
改善ポイント
今回は CodeDeployエージェントと CloudWatch Logs エージェントのインストールを手動で行いましが、実際にはUserData 等を利用してインスタンス起動時に自動で実行されるようにしましょう。
CloudWatch Logsの代わりに fluentd でログ転送させることも考えられます。