ElasticBeantstalkでのCloudWatch Logs へのログ発行の有効化手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、Elastic Beanstalk環境がCloudWatch Logsへのログ発行が有効化されていない状態について、リスクと対策を解説します。

リスク
AWS Elastic Beanstalkは、ウェブアプリケーションやサービスを簡単にデプロイ・管理できるPaaS(Platform as a Service)です。Elastic Beanstalk環境がCloudWatch Logsにログを発行するように設定されていない場合、アプリケーションの動作状況や問題発生時の原因究明が困難になり、以下のようなリスクが発生します。
- 可視性の欠如: Elastic Beanstalk環境は、EC2インスタンス、ロードバランサー、データベースなど、複数のコンポーネントで構成されています。ログがCloudWatch Logsに集約されていないと、これらのコンポーネントから個別にログを収集・分析する必要があり、アプリケーション全体の健全性やパフォーマンスの把握が困難になります。
- 問題解決の遅延: アプリケーションエラー、サーバーのパフォーマンス問題、デプロイ失敗などの問題が発生した場合、ログがないと原因の特定に時間がかかります。これにより、サービス復旧が遅れ、ダウンタイムが発生する可能性があります。
- セキュリティインシデントの検知遅延: 不審なアクセス、設定変更の試行、脆弱性スキャンなどのセキュリティ関連イベントもログに記録されます。ログが監視されていないと、これらのイベントを早期に検知できず、セキュリティインシデントへの対応が遅れる可能性があります。
- コンプライアンス違反: 多くの業界規制やコンプライアンス要件では、ログの集中管理、保持、監査が求められます。Elastic BeanstalkのログがCloudWatch Logsに発行されていない場合、これらのコンプライアンス要件を満たせない可能性があります。
- メトリクスとアラームの不足: CloudWatch Logsのログデータは、CloudWatchメトリクスやアラームのトリガーとして活用できます。ログが発行されていないと、特定のログパターンに基づくカスタムメトリクスやアラームを設定できず、自動監視の機会を逸します。
対策
Elastic Beanstalk環境からCloudWatch Logsへのログ発行を有効化することは、アプリケーションの運用監視、トラブルシューティング、セキュリティ監査、およびコンプライアンス維持のために不可欠です。
- CloudWatch Logsへのログストリーミングの有効化: Elastic Beanstalk環境の設定で、アプリケーションログ、ウェブサーバーログ、システムログなどをCloudWatch Logsにストリーミングするように設定します。
- ロググループの適切な管理: CloudWatch Logsで、Elastic Beanstalkの各ログタイプ(例:
/aws/elasticbeanstalk/environment-name/var/log/nginx/access.log
)が適切なロググループに集約されていることを確認します。 - ログ保持期間の設定: コンプライアンス要件や運用ニーズに合わせて、CloudWatch Logsのロググループの保持期間を設定します。不要なログが永続的に保存されないように、ライフサイクル管理も検討しましょう。
- メトリクスフィルターとアラームの活用: CloudWatch Logsのログデータに対してメトリクスフィルターを作成し、特定のキーワードやパターン(例: エラーメッセージ、異常なアクセス)を検知します。その後、これらのメトリクスに基づいてCloudWatchアラームを設定し、問題発生時に通知を受け取れるようにします。
- ログの分析と可視化: Amazon Athena、Amazon QuickSight、または外部のログ分析ツールを使用して、CloudWatch Logsのログデータを分析し、アプリケーションのパフォーマンス、ユーザー行動、セキュリティイベントに関するインサイトを獲得します。
ポリシーの説明
Elastic Beanstalk の Security Hub コントロール – AWS Security Hub
このコントロールは、Elastic Beanstalk 環境が CloudWatch Logs にログを送信するように設定されているかどうかをチェックします。Elastic Beanstalk 環境が CloudWatch Logs にログを送信するように設定されていない場合、コントロールは失敗します。有効期限が切れる前の指定された日数だけログが保持される場合にのみコントロールを成功させたい場合は、必要に応じて
RetentionInDays
パラメータにカスタム値を指定できます。
修復方法
AWSコンソールでの修復手順
AWSコンソールを使用して、Elastic Beanstalk環境のCloudWatch Logsへのログ発行を有効にします。
- Elastic Beanstalk環境の選択:
- AWSコンソールにログインし、Elastic Beanstalkサービスを開きます。
- ログ設定を変更したいアプリケーションを選択し、次に環境を選択します。
- ログオプションの設定:
- 左側のナビゲーションペインで、「設定」を選択します。
- 「モニタリング」カテゴリを見つけ、「編集」をクリックします。
- 「ログオプション」セクションで、「CloudWatch Logs」の「ログストリーミングを有効にする」にチェックを入れます。
- 「ロググループ」が自動的に生成されるか、既存のものを選択します。
- ストリーミングしたいログの種類(例: 「インスタンスログをCloudWatch Logsにストリーミングする」)にチェックを入れます。これには、Full logs(すべてのログ)、Tail logs(ログの末尾)、S3ログ(S3に保存されているログ)などがあります。通常は「Full logs」のストリーミングを有効にすることが推奨されます。
- 「適用」をクリックして変更を保存します。
- 環境の更新が完了するまでしばらく待ちます。

Terraformでの修復手順
TerraformでElastic Beanstalk環境のCloudWatch Logsへのログ発行を有効にするには、aws_elastic_beanstalk_environment
リソースの setting
ブロックを使用します。
resource "aws_elastic_beanstalk_environment" "my_environment" {
name = "my-app-env"
application = aws_elastic_beanstalk_application.my_application.name
solution_stack_name = "64bit Amazon Linux 2 v3.5.0 running Python 3.8" # 環境に合わせて変更
# CloudWatch Logsへのログ発行を有効化する設定
setting {
namespace = "aws:elasticbeanstalk:cloudwatch:logs"
name = "StreamLogs"
value = "true" # ログストリーミングを有効にする
}
setting {
namespace = "aws:elasticbeanstalk:cloudwatch:logs"
name = "DeleteOnTerminate"
value = "false" # 環境終了時にロググループを削除しない (推奨)
}
# インスタンスログをCloudWatch Logsにストリーミングする設定
setting {
namespace = "aws:elasticbeanstalk:cloudwatch:logs"
name = "RetentionInDays"
value = "7" # ログの保持期間を7日に設定 (必要に応じて変更)
}
# アプリケーション、ウェブサーバー、システムログなどを有効化する場合の例
# 通常、StreamLogsがtrueであれば、これらの主要なログは自動的にストリーミングされますが、
# 特定のログタイプを制御したい場合は、以下のように設定できます。
/*
setting {
namespace = "aws:elasticbeanstalk:cloudwatch:logs"
name = "ApplicationLogs"
value = "true"
}
setting {
namespace = "aws:elasticbeanstalk:cloudwatch:logs"
name = "WebserverLogs"
value = "true"
}
setting {
namespace = "aws:elasticbeanstalk:cloudwatch:logs"
name = "SystemLogs"
value = "true"
}
*/
# その他のElastic Beanstalk環境設定...
# version_label = aws_elastic_beanstalk_application_version.my_app_version.name
# tier = "WebServer"
# tags = {
# Environment = "Production"
# }
}
# Elastic Beanstalk アプリケーションの定義 (必要に応じて)
resource "aws_elastic_beanstalk_application" "my_application" {
name = "my-application"
description = "My awesome application"
}
# Elastic Beanstalk アプリケーションバージョンの定義 (必要に応じて)
/*
resource "aws_elastic_beanstalk_application_version" "my_app_version" {
name = "v1.0"
application = aws_elastic_beanstalk_application.my_application.name
bucket = aws_s3_bucket.app_source_bucket.id
key = aws_s3_object.app_source_bundle.key
}
*/
上記の例では、aws_elastic_beanstalk_environment
リソースの setting
ブロック内に、namespace = "aws:elasticbeanstalk:cloudwatch:logs"
を指定し、StreamLogs
を true
に設定することで、CloudWatch Logsへのログストリーミングを有効にしています。RetentionInDays
や DeleteOnTerminate
も合わせて設定することで、ログの保持期間や環境終了時のロググループの挙動を制御できます。
最後に
この記事では、Elastic Beanstalk環境がCloudWatch Logsへのログ発行が有効化されていない状態について、リスクと対策を解説しました。Elastic Beanstalk環境からCloudWatch Logsへのログ発行を有効にすることは、アプリケーションの運用監視、トラブルシューティング、セキュリティ監査、およびコンプライアンス維持のために非常に重要です。ログを適切に集約・管理し、メトリクスフィルターやアラームと連携させることで、アプリケーションの安定稼働と迅速な問題解決をサポートしましょう。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。