AWS CodeDeployエージェントログをCloudwatch Logsに転送する

AWS CodeDeploy

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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 を絞り込んだ画面

codedeploy-log-groups

Log Groups 一覧から codedeploy-agent-log を選択した画面

codedeploy-logs-detail

改善ポイント

今回は CodeDeployエージェントと CloudWatch Logs エージェントのインストールを手動で行いましが、実際にはUserData 等を利用してインスタンス起動時に自動で実行されるようにしましょう。

CloudWatch Logsの代わりに fluentd でログ転送させることも考えられます。

参考資料