Tech Blog

AWS ECS で動く Spring Boot アプリのログを CloudWatch Logs で確認する方法

AWS ECS CloudWatch Spring Boot

はじめに

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コンソールでの確認

  1. CloudWatch → ロググループ → /dvd-rental/app
  2. ログストリームの一覧から最新のストリームを選択
  3. フィルタボックスでキーワード検索

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}"

runningCountdesiredCount と一致していれば起動中。

ステップ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 デプロイ後のログ確認フロー:

  1. describe-services でタスク数を確認(running == desired か?)
  2. CloudWatch Logs で最新ログストリームを開く
  3. Spring Boot 起動ログで active profile・DB接続・Flyway を確認
  4. エラーがある場合は filter-log-events でキーワード検索

「CloudFormationがCOMPLETEになった=デプロイ成功」ではありません。
アプリのログで動作確認するまでを1セットとして習慣化することが重要です。


このシリーズの記事マップ

dvdrental 管理アプリと対になるエンドユーザー向けDVDレンタルアプリを作っている話 — Vue 3 + Spring Boot の全体構成と記事マップ
PostgreSQL のサンプル DB dvdrental をベースに Spring Boot + Thymeleaf で DVD レンタル管理アプリを作った話

気軽にメッセージください

技術相談・ご感想・ご質問があればメッセージをお願いします。