LoginSignup
23
18

More than 5 years have passed since last update.

Amazon ECSで log driverとしてawslogsを設定したいのだけどecs-agentが未対応なのでfluentdでお茶を濁す

Last updated at Posted at 2016-01-31

タイトル長いですね。。

動機

2016/5/5 ECS Agent1.9.0からawslogs logging driverがサポートされました。

この記事はもはや駄文です。下記公式ドキュメントを参照して安心してawslogsドライバーを使ってください。
See: http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/using_awslogs.html


  1. Docker1.9からlogging-driverとしてawslogs(CloudWatch Logs)に対応した。
  2. ところがどっこいAmazon ECSはまだ対応してなかった
  3. fluentdなら対応している
  4. fluentd->CloudWatch Logsならできる
    https://github.com/ryotarai/fluent-plugin-cloudwatch-logs

ちなみにECSとしては近日対応されそうな雰囲気のプルリクが進行中です。

この記事の利用価値はそれまでの命でしょう。→もはや天寿を全うしています。興味本位以外の役に立ちません。

やりかた

  1. こんな感じのDockerfileを書いてfluentdをコンテナとして起動します。
    • ポートマッピングで localhost:22424 でfluentdにアクセスできるようにする(ポート番号はご自由に)
  2. 上記のlocalhost:22424をTaskDefinitionのオプションに指定する

fluentdコンテナ

Dockerimageの定義

FROM fluent/fluentd:latest
USER fluent
WORKDIR /home/fluent
ENV FLUENTD_PORT=22424
EXPOSE $FLUENTD_PORT
RUN gem install fluent-plugin-cloudwatch-logs

はっきり言ってFROM fluent/fluentdがよく出来ているのでほとんど何もすることはありません。
gem install fluent-plugin-cloudwatch-logsするくらいです。

Log収集コンテナのTaskDefinition定義

  "containerDefinitions": [
    {
        :
      "name": "fluent-awslogs",
      "image": "newgyu/fluent-awslogs",
      "portMappings": [
        {
          "hostPort": 22424,
          "containerPort": 22424,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {
          "name": "AWSLOGS_GROUP",
          "value": "personalize/batch/test"
        },
        {
          "name": "AWSLOGS_STREAM",
          "value": "batch"
        },
        {
          "name": "AWS_REGION",
          "value": "ap-northeast-1"
        }
      ],
       :
    }
  ],

ポイントは以下です。

  • ポートマッピングでホストのポートを開ける
  • environmentを指定
    • AWSLOGS_GROUP ...予めLogGroupは作っておいてください
    • AWSLOGS_STREAM ...名前だけ指定すれば初回に作成されます
    • AWS_REGION ...必須です

必要なAWSの権限

ECSインスタンスに以下のポリシーが許可されたIAM Roleを付与してください。

{
    "Statement": [
        {
            "Resource": "*",
            "Action": [
                "ecs:CreateCluster",
                "ecs:DeregisterContainerInstance",
                "ecs:DiscoverPollEndpoint",
                "ecs:Poll",
                "ecs:RegisterContainerInstance",
                "ecs:StartTelemetrySession",
                "ecs:Submit*",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:Describe*"
            ],
            "Effect": "Allow"
        }
    ]
}
  • ecs:* はそもそもECSインスタンスとして必要なものです
  • logs: はCloudWatch Logsに必要なものです。
    • awslogsではDescribeは必要ないのですが、fluent-plugin-cloudwatch-logsでは必要な様子

mainコンテナにオプション指定

TaskDefinitionのlogConfigurationに以下のように設定します。

  "containerDefinitions": [
    {
        :
      "logConfiguration": {
        "logDriver": "fluentd",
        "options": {
          "fluentd-address": "127.0.0.1:22424"
        }
      },
        :
    }
  ]

さて、ここで自分は一つハマりました。

http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html
をみるとlogging driverとしてfluentd を指定可能っぽい書き方でしたが、実際に指定するとRun Taskするときに

Run tasks failed
Reasons : ATTRIBUTE

と言われてしまいました。

どうやらデフォでは有効なlogging-driverは

ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","syslog"]

となっているようで、このようにECSインスタンスにuser-dataで指定してやる必要がありました。

ドキュメント的にはこの辺のNoteがそれに当たるみたいです。
http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_storage

Note
The Amazon ECS container agent running on a container instance must register the logging drivers available on that instance with the ECS_AVAILABLE_LOGGING_DRIVERS environment variable before containers placed on that instance can use these log configuration options. For more information, see Amazon ECS Container Agent Configuration.

23
18
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
18