Amazon ECSの新機能「Action Logs」でデプロイの状態遷移ログを確認してみた
はじめに
2026年7月21日、Amazon ECSでAction Logsが利用可能になりました。デプロイ中にECSの実行するオーケストレーション操作が、構造化ログとしてCloudWatch Logsに自動的に記録されるようになっています。
Action Logsを有効化すると、デプロイ状態の追跡方法が次のように変わります。
| 観点 | 従来 | Action Logs 有効化後 |
|---|---|---|
| デプロイ状態の追跡 | サービスイベント(describe-services)を都度確認 |
構造化ログとして CloudWatch Logs に自動記録 |
| イメージダイジェストの特定 | :latest タグの場合は特定困難 |
SERVICE_REVISION_STABLE で自動記録 |
| サーキットブレーカー発動の検知 | サービスイベントで確認 | WARN レベルのログとして記録され、アラート連携が可能 |
| 障害原因の切り分け | サービスイベント・タスクステータスを手動で相関 | イベントパターン(SERVICE_REVISION_STABLE の有無)で分類可能 |
| ログ検索・分析 | 非構造化テキストの目視確認 | CloudWatch Logs Insights でクエリ可能 |
本記事ではAction LogsをCLIで有効化し、正常デプロイ・OOM失敗・イメージプル失敗の3パターンで出力されるイベントを確認しました。3パターンの結果サマリーは次のとおりです。
| パターン | SERVICE_REVISION_STABLE | ロールバック観測 | 結果 |
|---|---|---|---|
| 正常デプロイ | あり(ダイジェスト記録) | — | SERVICE_DEPLOYMENT_SUCCESSFUL |
| OOM失敗 | あり(ダイジェスト記録) | あり(約4分) | SERVICE_DEPLOYMENT_ROLLBACK_SUCCESSFUL |
| イメージプル失敗 | なし | なし(18分以上未到達) | SERVICE_DEPLOYMENT_IN_PROGRESS のみ |
検証内容
検証環境
Fargate上のサービスを対象に、ap-northeast-1リージョンで検証しました。デプロイサーキットブレーカーは有効(rollback=true、しきい値50%)としています。
| タスク定義 | 用途 | イメージ | CPU | メモリ(タスク) | メモリ(コンテナ hard limit) |
|---|---|---|---|---|---|
| action-logs-test-normal:1 | 正常デプロイ | public.ecr.aws/nginx/nginx:latest | 256 | 512 MiB | — |
| action-logs-test-oom:1 | OOM失敗 | public.ecr.aws/docker/library/alpine:latest | 256 | 512 MiB | 6 MiB |
| action-logs-test-pull-fail:1 | イメージプル失敗 | public.ecr.aws/does-not-exist/fake-image:v9999 | 256 | 512 MiB | — |
Action Logs 有効化(CLI)
Action LogsはCloudWatch LogsのVended Logs配信の仕組みを利用します。ロググループ作成→リソースポリシー→配信元(Delivery Source)→配信先(Delivery Destination)→配信(Delivery)の5ステップで有効化します。配信元のlog-typeにはACTION_LOGSを指定します。
必要なIAM権限:
- logs:CreateLogGroup
- logs:PutRetentionPolicy
- logs:PutResourcePolicy
- logs:PutDeliverySource
- logs:PutDeliveryDestination
- logs:CreateDelivery
- logs:GetDelivery
- ecs:AllowVendedLogDeliveryForResource
各ステップのCLIコマンド:
# 1. ロググループ作成
aws logs create-log-group \
--log-group-name /aws/vendedlogs/ecs/action-logs/<cluster-name> \
--region ap-northeast-1
aws logs put-retention-policy \
--log-group-name /aws/vendedlogs/ecs/action-logs/<cluster-name> \
--retention-in-days 7 \
--region ap-northeast-1
# 2. リソースポリシー(delivery.logs.amazonaws.com に書き込み許可)
aws logs put-resource-policy \
--policy-name ecs-action-logs-delivery-policy \
--policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Sid": "AllowECSActionLogsDelivery",
"Effect": "Allow",
"Principal": {"Service": "delivery.logs.amazonaws.com"},
"Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
"Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/vendedlogs/ecs/action-logs/<cluster-name>:log-stream:*",
"Condition": {
"StringEquals": {"aws:SourceAccount": "123456789012"},
"ArnLike": {"aws:SourceArn": "arn:aws:ecs:ap-northeast-1:123456789012:*"}
}
}]
}' \
--region ap-northeast-1
# 3. 配信元 (Delivery Source)
aws logs put-delivery-source \
--name <source-name> \
--resource-arn arn:aws:ecs:ap-northeast-1:123456789012:cluster/<cluster-name> \
--log-type ACTION_LOGS \
--region ap-northeast-1
# 4. 配信先 (Delivery Destination)
aws logs put-delivery-destination \
--name <destination-name> \
--output-format json \
--delivery-destination-configuration '{"destinationResourceArn":"arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/vendedlogs/ecs/action-logs/<cluster-name>"}' \
--region ap-northeast-1
# 5. 配信作成 (Delivery)
aws logs create-delivery \
--delivery-source-name <source-name> \
--delivery-destination-arn arn:aws:logs:ap-northeast-1:123456789012:delivery-destination:<destination-name> \
--region ap-northeast-1
Action Logsのスキーマ
今回の検証で取得したイベントは次の構造でした(公式ドキュメントのスキーマ定義とフィールド配置が異なる場合があります)。
{
"resourceArn": "arn:aws:ecs:<region>:<account>:cluster/<cluster-name>",
"actionSourceId": "service/<cluster-name>/<service-name>",
"logLevel": "INFO | WARN | ERROR",
"eventTimestamp": 1784663292399,
"detail": {
"eventName": "<event-name>",
"status": "IN_PROGRESS | SUCCEEDED",
"statusReason": "<human-readable reason>",
"serviceDeploymentArn": "arn:aws:ecs:...:service-deployment/...",
"serviceRevisionArn": "arn:aws:ecs:...:service-revision/..."
}
}
| フィールド | 意味 |
|---|---|
resourceArn |
対象クラスターの ARN |
actionSourceId |
イベント発生元(service/<cluster-name>/<service-name> 形式。ログストリーム名としても使用される) |
logLevel |
ログレベル(INFO / WARN / ERROR) |
eventTimestamp |
イベント発生時刻(エポックミリ秒) |
detail.eventName |
イベント種別 |
detail.statusReason |
人間可読の状態理由 |
ログストリームは service/<cluster-name>/<service-name> の命名規則で作成されるため、サービス単位でのフィルタリングが容易です。
今回の検証で確認できた eventName は次のとおりです。
| eventName | logLevel | 意味 |
|---|---|---|
| SERVICE_DEPLOYMENT_IN_PROGRESS | INFO | デプロイ開始 |
| SERVICE_REVISION_STABLE | INFO | サービスリビジョン安定、イメージダイジェストにロック |
| SERVICE_DEPLOYMENT_SUCCESSFUL | INFO | デプロイ正常完了 |
| SERVICE_DEPLOYMENT_ROLLBACK | WARN | サーキットブレーカー発動、ロールバック進行中 |
| SERVICE_DEPLOYMENT_ROLLBACK_SUCCESSFUL | INFO | ロールバック完了 |
正常デプロイ時のログ確認
nginxイメージ(action-logs-test-normal:1)でサービスを作成し、正常デプロイ時に出力されるイベントを確認しました。
| 経過 | eventName | logLevel |
|---|---|---|
| 0秒 | SERVICE_DEPLOYMENT_IN_PROGRESS | INFO |
| +34秒 | SERVICE_REVISION_STABLE | INFO |
| +約3分 | SERVICE_DEPLOYMENT_SUCCESSFUL | INFO |
各イベントの全体構造:
{
"resourceArn": "arn:aws:ecs:ap-northeast-1:123456789012:cluster/action-logs-test-cluster",
"actionSourceId": "service/action-logs-test-cluster/action-logs-test-service",
"logLevel": "INFO",
"eventTimestamp": 1784663292399,
"detail": {
"statusReason": "Service deployment in progress.",
"serviceDeploymentArn": "arn:aws:ecs:ap-northeast-1:123456789012:service-deployment/action-logs-test-cluster/action-logs-test-service/xQiDJv98PtZRdF7HNahyb",
"status": "IN_PROGRESS",
"eventName": "SERVICE_DEPLOYMENT_IN_PROGRESS"
}
}
{
"resourceArn": "arn:aws:ecs:ap-northeast-1:123456789012:cluster/action-logs-test-cluster",
"actionSourceId": "service/action-logs-test-cluster/action-logs-test-service",
"logLevel": "INFO",
"eventTimestamp": 1784663326125,
"detail": {
"statusReason": "Service revision marked stable. Locked to container image(s): public.ecr.aws/nginx/nginx:latest@sha256:709204fab25be0425d55090c79f3e84161cf99f50278543d7f6bf372e326ad1f.",
"serviceRevisionArn": "arn:aws:ecs:ap-northeast-1:123456789012:service-revision/action-logs-test-cluster/action-logs-test-service/7911470091089632318",
"status": "SUCCEEDED",
"eventName": "SERVICE_REVISION_STABLE"
}
}
{
"resourceArn": "arn:aws:ecs:ap-northeast-1:123456789012:cluster/action-logs-test-cluster",
"actionSourceId": "service/action-logs-test-cluster/action-logs-test-service",
"logLevel": "INFO",
"eventTimestamp": 1784663469912,
"detail": {
"statusReason": "Service deployment completed successfully.",
"serviceDeploymentArn": "arn:aws:ecs:ap-northeast-1:123456789012:service-deployment/action-logs-test-cluster/action-logs-test-service/xQiDJv98PtZRdF7HNahyb",
"status": "SUCCEEDED",
"eventName": "SERVICE_DEPLOYMENT_SUCCESSFUL"
}
}
注目したいのはSERVICE_REVISION_STABLEイベントです。statusReasonにイメージダイジェスト付きでLocked to container image(s): ...@sha256:709204...と記録されています。:latestタグでデプロイした場合でも、実際に稼働したイメージのダイジェストを後から特定できます。
デプロイ失敗時のログ確認(OOM → サーキットブレーカー)
次に、意図的にOOMを発生させてサーキットブレーカーが発動する場合のログを確認しました。alpineイメージのコンテナメモリ上限を6 MiBに絞り、dd if=/dev/zeroでメモリを消費させることで、起動直後にOOMが発生する構成としています。
| 経過 | eventName | logLevel |
|---|---|---|
| 0秒 | SERVICE_DEPLOYMENT_IN_PROGRESS | INFO |
| +53秒 | SERVICE_REVISION_STABLE | INFO |
| +約3分45秒 | SERVICE_DEPLOYMENT_ROLLBACK | WARN |
| +約4分 | SERVICE_DEPLOYMENT_ROLLBACK_SUCCESSFUL | INFO |
各イベントの全体構造:
{
"logLevel": "INFO",
"eventTimestamp": 1784663519017,
"detail": {
"statusReason": "Service deployment in progress.",
"serviceDeploymentArn": "arn:aws:ecs:ap-northeast-1:123456789012:service-deployment/action-logs-test-cluster/action-logs-test-service/Z6HSP7lksB3wTV0bOxmpF",
"status": "IN_PROGRESS",
"eventName": "SERVICE_DEPLOYMENT_IN_PROGRESS"
}
}
{
"logLevel": "INFO",
"eventTimestamp": 1784663571619,
"detail": {
"statusReason": "Service revision marked stable. Locked to container image(s): public.ecr.aws/docker/library/alpine:latest@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec434943f8b.",
"serviceRevisionArn": "arn:aws:ecs:ap-northeast-1:123456789012:service-revision/action-logs-test-cluster/action-logs-test-service/2005995910462199077",
"status": "SUCCEEDED",
"eventName": "SERVICE_REVISION_STABLE"
}
}
{
"logLevel": "WARN",
"eventTimestamp": 1784663746287,
"detail": {
"statusReason": "Service deployment rolled back because the circuit breaker threshold was exceeded.",
"serviceDeploymentArn": "arn:aws:ecs:ap-northeast-1:123456789012:service-deployment/action-logs-test-cluster/action-logs-test-service/Z6HSP7lksB3wTV0bOxmpF",
"status": "IN_PROGRESS",
"eventName": "SERVICE_DEPLOYMENT_ROLLBACK"
}
}
{
"logLevel": "INFO",
"eventTimestamp": 1784663762604,
"detail": {
"statusReason": "Service deployment rolled back because the circuit breaker threshold was exceeded.",
"serviceDeploymentArn": "arn:aws:ecs:ap-northeast-1:123456789012:service-deployment/action-logs-test-cluster/action-logs-test-service/Z6HSP7lksB3wTV0bOxmpF",
"status": "SUCCEEDED",
"eventName": "SERVICE_DEPLOYMENT_ROLLBACK_SUCCESSFUL"
}
}
このパターンでは、イメージ自体は解決できるためSERVICE_REVISION_STABLEが出力されました。その後タスクがOOMで起動に失敗し続けた結果、SERVICE_DEPLOYMENT_ROLLBACKがWARNレベルで記録されています。statusReasonにしきい値超過の理由が明記されるため、CloudWatch Alarmsとの連携でロールバックの検知に使えます。
イメージプル失敗時のログ確認
最後に、存在しないイメージ public.ecr.aws/does-not-exist/fake-image:v9999 にサービスを更新しました。
Action Logsに出力されたのは、デプロイ開始を示すイベントのみでした(検証時間内に観測できた範囲)。
{
"logLevel": "INFO",
"eventTimestamp": 1784663869100,
"detail": {
"statusReason": "Service deployment in progress.",
"serviceDeploymentArn": "arn:aws:ecs:ap-northeast-1:123456789012:service-deployment/action-logs-test-cluster/action-logs-test-service/IB_8BjTwukTyDzQ4uW4Ca",
"status": "IN_PROGRESS",
"eventName": "SERVICE_DEPLOYMENT_IN_PROGRESS"
}
}
SERVICE_REVISION_STABLE は出力されませんでした。イメージを解決できず、ダイジェストへのロックが行えなかったためです。つまり SERVICE_REVISION_STABLE の有無によって、イメージ解決の段階で失敗したのか、イメージは解決できたがランタイムで失敗したのかを切り分けられます。
従来のサービスイベントには、コンテナ単位の失敗理由が記録されていました。
CannotPullContainerError: pull image manifest has been retried 7 time(s):
failed to resolve ref public.ecr.aws/does-not-exist/fake-image:v9999:
public.ecr.aws/does-not-exist/fake-image:v9999: not found.
Action Logsはデプロイ全体の状態遷移レベルで記録されるため、コンテナ単位の詳細を持つ従来のサービスイベントと補完的に使えます。
なお、サーキットブレーカーの発動までにかかった時間は、OOMのケースが約4分でした。イメージプル失敗のケースでは18分以上経過してもサーキットブレーカーが発動しなかったため、SERVICE_DEPLOYMENT_ROLLBACKのログは取得できていません。
CloudWatch Logs Insights クエリ例
運用で使えるクエリ例です。
-- WARN/ERROR イベントの抽出(デプロイ障害調査用)
fields @timestamp, detail.eventName, logLevel, detail.statusReason
| filter logLevel in ["WARN", "ERROR"]
| sort @timestamp asc
| limit 50
-- 全イベント時系列(サービスレベル)
fields @timestamp, detail.eventName, logLevel, detail.status, detail.statusReason
| filter @logStream like /^service\//
| sort @timestamp asc
| limit 50
-- 特定デプロイの追跡
fields @timestamp, detail.eventName, logLevel, detail.statusReason
| filter detail.serviceDeploymentArn like /<deployment-id>/
| sort @timestamp asc
-- サーキットブレーカー発動の検出
fields @timestamp, detail.eventName, detail.statusReason
| filter detail.eventName = "SERVICE_DEPLOYMENT_ROLLBACK"
| sort @timestamp desc
| limit 20
まとめ
ECS Action Logsにより、デプロイの進行・完了・ロールバックをCloudWatch Logs上で追跡できました。今回の検証では、SERVICE_REVISION_STABLEの出力有無と後続イベントを組み合わせることで、イメージ解決前後の失敗を調査しやすくなりました。ロールバック開始イベントは、デプロイ失敗を検知するアラート条件としても利用できます。








