AWS ECS で動く Spring Boot アプリのログを CloudWatch Logs で確認する方法
はじめに
ECSにデプロイした Spring Boot アプリが動かないとき、ログを確認するのが第一歩です。
しかし「ECSのコンソールを開いてもどこにログがあるかわからない」という状態は意外とよくあります。
この記事は、ECS + CloudWatch Logs のセットアップから、実際のログ確認コマンドまでの記録です。
CloudWatch Logs の設定
タスク定義でのログ設定
ECS タスク定義でコンテナのログドライバーを awslogs に設定します。
CDK での設定
// cdk/lib/app-stack.ts
const logGroup = new logs.LogGroup(this, 'AppLogGroup', {
logGroupName: '/dvd-rental/app',
retention: logs.RetentionDays.ONE_WEEK,
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
const container = taskDefinition.addContainer('AppContainer', {
image: ecs.ContainerImage.fromEcrRepository(ecrRepo, 'latest'),
logging: ecs.LogDrivers.awsLogs({
streamPrefix: 'dvd-rental',
logGroup: logGroup,
}),
});
タスク定義 JSON での設定
{
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/dvd-rental/app",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "dvd-rental"
}
}
}
IAM ロールへの権限付与
ECS タスク実行ロール(Task Execution Role)に CloudWatch Logs への書き込み権限が必要です。
// CDK での設定
taskDefinition.addToExecutionRolePolicy(new iam.PolicyStatement({
actions: [
'logs:CreateLogGroup',
'logs:CreateLogStream',
'logs:PutLogEvents',
],
resources: ['*'],
}));
AmazonECSTaskExecutionRolePolicy マネージドポリシーにはこの権限が含まれているため、
タスク実行ロールにこのポリシーをアタッチするだけでも OK です。
CloudWatch Logs の構造
設定後、ログは以下の構造で保存されます:
ロググループ: /dvd-rental/app
ログストリーム: dvd-rental/AppContainer/{タスクID}
タスクが起動するたびに新しいログストリームが作られます。
ログの確認方法
AWSコンソールでの確認
- CloudWatch → ロググループ →
/dvd-rental/app - ログストリームの一覧から最新のストリームを選択
- フィルタボックスでキーワード検索
AWS CLI での確認
ログストリームの一覧確認
aws logs describe-log-streams \
--log-group-name "/dvd-rental/app" \
--order-by LastEventTime \
--descending \
--max-items 5 \
--region ap-northeast-1
最新のログを確認
# 最新のログストリーム名を取得
STREAM=$(aws logs describe-log-streams \
--log-group-name "/dvd-rental/app" \
--order-by LastEventTime \
--descending \
--max-items 1 \
--query "logStreams[0].logStreamName" \
--output text \
--region ap-northeast-1)
# ログを表示(最新30件)
aws logs get-log-events \
--log-group-name "/dvd-rental/app" \
--log-stream-name "$STREAM" \
--limit 30 \
--region ap-northeast-1 \
--query "events[*].message" \
--output text
キーワードで検索
# "ERROR" を含むログを検索
aws logs filter-log-events \
--log-group-name "/dvd-rental/app" \
--filter-pattern "ERROR" \
--start-time $(date -d '1 hour ago' +%s000) \
--region ap-northeast-1
# active profile の確認
aws logs filter-log-events \
--log-group-name "/dvd-rental/app" \
--filter-pattern "profiles is active" \
--region ap-northeast-1 \
--query "events[*].message" \
--output text
デプロイ後の確認手順
ECS にデプロイした後、以下の順番でログを確認します。
ステップ1:タスクが起動したか確認
aws ecs describe-services \
--cluster dvd-rental-cluster \
--services dvd-rental-service \
--region ap-northeast-1 \
--query "services[0].{Running:runningCount,Desired:desiredCount,Status:status}"
runningCount が desiredCount と一致していれば起動中。
ステップ2:新しいタスクのログを確認
# 最新タスクのARNを取得
TASK_ARN=$(aws ecs list-tasks \
--cluster dvd-rental-cluster \
--service-name dvd-rental-service \
--desired-status RUNNING \
--region ap-northeast-1 \
--query "taskArns[0]" \
--output text)
echo "タスクARN: $TASK_ARN"
ステップ3:Spring Boot の起動ログ確認
確認すべきポイント:
# ✅ 確認1: 正しいprofileが適用されているか
INFO - The following 1 profile is active: "prod"
# ✅ 確認2: DBへの接続が成功しているか
INFO - HikariPool-1 - Start completed.
# ✅ 確認3: Flyway のmigrationが成功しているか
INFO - Successfully applied 4 migrations to schema "public"
# ✅ 確認4: アプリが起動完了しているか
INFO - Started DvdRentalApplication in 8.234 seconds
トラブル事例
コンテナがすぐに停止する
ログに以下のようなエラーがある場合:
ERROR - Failed to configure a DataSource: 'url' attribute is not specified
DB接続設定が正しく渡されていません。
ECS タスク定義の環境変数・Secrets の設定を確認してください。
ログが全く出ない
CloudWatch Logs のロググループが存在しない、またはIAMロールに書き込み権限がない可能性があります。
# ロググループが存在するか確認
aws logs describe-log-groups \
--log-group-name-prefix "/dvd-rental" \
--region ap-northeast-1
まとめ
ECS デプロイ後のログ確認フロー:
describe-servicesでタスク数を確認(running == desiredか?)- CloudWatch Logs で最新ログストリームを開く
- Spring Boot 起動ログで active profile・DB接続・Flyway を確認
- エラーがある場合は
filter-log-eventsでキーワード検索
「CloudFormationがCOMPLETEになった=デプロイ成功」ではありません。
アプリのログで動作確認するまでを1セットとして習慣化することが重要です。
このシリーズの記事マップ
→ dvdrental 管理アプリと対になるエンドユーザー向けDVDレンタルアプリを作っている話 — Vue 3 + Spring Boot の全体構成と記事マップ
→ PostgreSQL のサンプル DB dvdrental をベースに Spring Boot + Thymeleaf で DVD レンタル管理アプリを作った話