less is more

心のフルスタックエンジニア👨‍💻バイブスでコードを書いています🤘

ElasticBeanstalkのログまわりの設定ベストプラクティス

CloudWatchへのストリーミング

マネジメントコンソールからダウンロードしてgrepかけるのはしんどいので、 基本的にはCloudWatchに流したい。

[設定] => [ソフトウェアの変更] で、CloudWatch Logs へのインスタンスログのストリーミング を有効化できる。

f:id:bluepixel:20200324155653p:plain

インスタンスではCloudWatchエージェントが動いていて、即時にログが送信されてくる。 (※古いプラットフォームを使っているとアップデートが必要)

送信されるログの種類はプラットフォームによって異なる。 例えばPythonの場合は、以下のログファイルが対象となり、 それぞれに対してロググループが作成される。

f:id:bluepixel:20200324160323p:plain

どのプラットフォームでどのログが対象になるかは、以下のリンク先にリストされている。 https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/AWSHowTo.cloudwatchlogs.html#AWSHowTo.cloudwatchlogs.loggroups

ストリーミングするには、インスタンスにCloudWatchの権限が必要。 デフォルトでは、 aws-elasticbeanstalk-ec2-role というIAMロールが作成されているはず。 そこに以下のカスタムポリシーを作成してアタッチする。

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

Apacheログのカスタマイズ

Apache2.2以降、アクセスログinternal dummy connection というログが出力されるようになっているので、これを抑制する。

yamada.daiji.ro

Apacheの設定ファイルをいじればいいのだが、直接編集することはできないし、 あまりするべきではないので、追加で設定ファイルを配置することにする。

ElasticBeanstalkは、 .ebextensions/ にファイルを置くことによって環境を様々にカスタマイズできる。 拡張子は .config で、yamljson形式をサポートしている。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/ebextensions.html

ファイルを作成するには files キーを使用する。

files:
  "/etc/httpd/conf.d/custom.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      SetEnvIf User-Agent "internal dummy connection" nolog
      CustomLog logs/access_log combined env=!nolog

インラインで書く以外にも、S3のURLを指定することもできるらしい。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-files

これでApacheがconfigを読み込んで設定を反映してくれる。

ELBのヘルスチェック

同じく、access_logのノイズになるので排除する。 やり方は同じ。

SetEnvIf User-Agent "ELB-HealthChecker" nolog

独自のログファイル

先ほどリストしたプラットフォームごとのログファイル以外にも、
任意のアプリケーションログもストリーミングしたいことがあるかと思う。

CloudWatch Logs のエージェントをハックする形で可能。

qiita.com