AWS Elastic Beanstalk でログを採取する

参考) Viewing Logs from Amazon EC2 Instances in Your Elastic Beanstalk Environment

Elastic Beanstalk でログを採取する方法は主に以下の 3 つ。

  1. Web コンソールの Logs または eb logs コマンドで取得する
  2. ログファイルを S3 に保存する
  3. ログファイルへの追記を CloudWatch Logs に即時転送する

1. Web コンソールの Logs または eb logs コマンドでログを取得する

取得対象となるファイルは EC2 内の /opt/elasticbeanstalk/tasks 配下に設定されている。

名前 説明 設定ファイル
末尾ログ 管理コンソールから「Last 100 Lines」で取得するログ /opt/elasticbeanstalk/tasks/taillogs.d
バンドルログ 管理コンソールから「Full Logs」で取得するログ /opt/elasticbeanstalk/tasks/bundlelogs.d

ログ取得をおこなうとそれぞれ以下の場所に一時的にログファイルが保存され、一定時間で削除される。

  • s3://elasticbeanstalk-(Region)-(AccountNumber)/resources/environments/logs/tail
  • s3://elasticbeanstalk-(Region)-(AccountNumber)/resources/environments/logs/bundle

取得するログファイルを追加するには、.ebextensions に以下のように記述した (任意の名前).config ファイルを作成してデプロイする。

例)

files:
  "/opt/elasticbeanstalk/tasks/taillogs.d/app.conf":    # 末尾ログ
    mode: "000644"
    owner: root
    group: root
    content: |
      /var/app/current/storage/logs/laravel.log
  "/opt/elasticbeanstalk/tasks/bundlelogs.d/app.conf":  # バンドルログ
    mode: "000644"
    owner: root
    group: root
    content: |
      /var/app/current/storage/logs/*.log

補足

  • 末尾ログのファイル指定にワイルドカードは指定不可(?)のようなので、Laravel の場合は single (日付なし) の設定で採取する必要がある。

2. ログファイルを S3 に保存する

設定 > ソフトウェアの「S3 ログストレージ」を「有効」にする。

.ebextensions/(任意のファイル名).config にて有効化する場合は以下のように記述する。(参照)

option_settings:
  aws:elasticbeanstalk:hostmanager:
    LogPublicationControl: true

ログファイルの保存先は s3://elasticbeanstalk-(Region)-(AccountNumber)/resources/environments/logs/publish

保存対象となるファイルは EC2 内の /opt/elasticbeanstalk/tasks/publishlogs.d に設定されている。保存する取得するログファイルを追加するには、.ebextensions に以下のように記述した (任意の名前).config ファイルを作成してデプロイする。

例)

files:
  "/opt/elasticbeanstalk/tasks/publishlogs.d/app.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      /var/app/current/storage/logs/*.log

3. CloudWatch Logs に即時転送する

参考) Using Elastic Beanstalk with Amazon CloudWatch Logs

設定 > ソフトウェアの「CloudWatch Logs へのインスタンスログのストリーミング」を「有効」にする。

.ebextensions/(任意のファイル名).config にて有効化する場合は以下のように記述する。(参照)

option_settings:
  aws:elasticbeanstalk:cloudwatch:logs:
    StreamLogs: true

対象となるファイルは /etc/awslogs/config に設定されている。転送するログファイルを追加するには、.ebextensions に以下のように記述した (任意の名前).config ファイルを作成してデプロイする。logs-streamtocloudwatch-linux.config - GitHub からサンプルをダウンロードしてカスタマイズすると良い。(サンプルには CloudWatch Logs Agent 自体の設定も含まれるため、Elastic Beanstalk の「CloudWatch Logs へのインスタンスログのストリーミング」設定を無効にしても設定したファイルだけをストリーミングすることができる。)

参考) CloudWatch Logs Agent Reference

files:
  "/etc/awslogs/config/applogs.conf" :
    mode: "000644"
    owner: root
    group: root
    content: |
      [laravel]
      log_group_name=`{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "laravel"]]}`
      log_stream_name={instance_id}
      file=/var/app/current/storage/logs/*.log

すでにファイルが存在する場合、自動的に .bak ファイルが生成されるが、それも読み込まれてしまうため、削除するようにする。

commands:
  remove_bak:
    command: "rm -f /etc/awslogs/config/*.bak"

追加のログを出力する場合、別途 CloudWatch Logs に対するパーミッションを EC2 のロール (デフォルト: aws-elasticbeanstalk-ec2-role) に追加する。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:GetLogEvents",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams",
        "logs:PutRetentionPolicy"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}