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にこの構成設定が見つかりません。
何かご意見は?
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
マルチコンテナのエラスティック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