web-dev-qa-db-ja.com

ElasticBeanstalkシングルコンテナDocker-awslogsロギングドライバーを使用

Single Container Docker Configuration を使用してElastic Beanstalkで単一のDockerコンテナーを実行し、 awslogs logging driver を使用してアプリケーションstdoutをCloudWatchに送信しようとしています。

EBはコンテナの設定のためにDockerrun.aws.jsonファイルを探しますが、私が見る限り、コンテナのロギングドライバーとしてawslogsを使用する(またはそのためのdocker runコマンドに他のフラグを追加する)オプションがありません案件)。

提供された答えを使用してdocker runコマンドをハッキングしようとしました ここ 、内容を含むファイル.ebextensions/01-commands.configを追加します:

commands:
  add_awslogs:
    command: 'Sudo sed -i "s/docker run -d/docker run --log-driver=awslogs --log-opt awslogs-region=eu-west-2 --log-opt awslogs-group=dockerContainerLogs -d/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh'

これは、実行スクリプトを変更し、ログがCloudWatchに表示されるという意味で機能します。

しかし、EBアプリケーションは停止します。コンテナは稼働していますが、リクエストに応答しません。

コンテナログに次のエラーがあります。

「logs」コマンドは、「json-file」および「journald」ログドライバーでのみサポートされます(got:awslogs)

ECS(EBではなく)に関連する同様の質問に対する回答を見つけ、ECS_AVAILABLE_LOGGING_DRIVERSにawslogを追加することを提案しています。しかし、EBにこの構成設定が見つかりません。

何かご意見は?

18
user1912899

AWSサポートから受け取った回答をここに投稿します:

Elastic Beanstalkシングルコンテナ環境では、stdoutとstderrがデフォルトで/ var/log/eb-docker/containers/eb-current-app /に保存されます。また、新しいソリューションスタックでは、ログをクラウドウォッチにストリーミングして自動化するオプションがあります。インスタンスでのAWSLogsエージェントの設定では、ebextensionを追加してstdoutおよびstderrログファイルをクラウドウォッチ設定に追加し、設定済みのエージェントを使用してこれらのファイルをクラウドウォッチログにストリーミングすることをお勧めします。フックがソリューションスタックのバージョンから別のバージョンに変更される可能性があるため、AWSではサポートされていないプリフックに触れる代わりに。

表示されているエラーに関して、「logs」コマンドは「json-file」および「journald」ログドライバーでのみサポートされています(got:awslogs)」このエラーは、dockerが他のドライバーにログを送信するように構成されている場合の動作によるものです。 json-fileまたはjournaldには、ログのローカルコピーがないため、ログをローカルに表示できません。

### BEGIN .ebextensions/logs.config
option_settings:
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: StreamLogs
    value: true
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: DeleteOnTerminate
    value: false
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: RetentionInDays
    value: 7

files:
  "/etc/awslogs/config/stdout.conf":
    mode: "000755"
    owner: root
    group: root
    content: |
      [docker-stdout]
      log_group_name=/aws/elasticbeanstalk/environment_name/docker-stdout
      log_stream_name={instance_id}
      file=/var/log/eb-docker/containers/eb-current-app/*-stdouterr.log

commands:
  "00_restart_awslogs":
    command: service awslogs restart

### END .ebextensions/logs.config
18
user1912899

マルチコンテナのエラスティックBeanstalk環境に対する以前の回答を拡張し、環境名を挿入することができました。ロググループを作成できるようにするには、ec2ロールで正しい権限を付与する必要がありました。以下を調べると、機能しているかどうかを確認できます。

/var/log/awslogs.log

これは.ebextensions/logs.configにあります

option_settings:
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: StreamLogs
    value: true
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: DeleteOnTerminate
    value: false
  - namespace: aws:elasticbeanstalk:cloudwatch:logs
    option_name: RetentionInDays
    value: 14

files:
  "/etc/awslogs/config/stdout.conf":
    mode: "000755"
    owner: root
    group: root
    content: |
      [/var/log/containers/docker-stdout]
      log_group_name=/aws/elasticbeanstalk/`{ "Ref" : "AWSEBEnvironmentName" }`/docker-stdout.log
      log_stream_name={instance_id}
      file=/var/log/containers/*-stdouterr.log

commands:
  "00_restart_awslogs":
    command: service awslogs restart
7
John Lemp