プライベートサブネットの ECS で CannotPullContainerError 403 Forbidden で失敗する事象を回避するには

プライベートサブネットの ECS で CannotPullContainerError 403 Forbidden で失敗する事象を回避するには

Clock Icon2025.05.28

困っていた内容

プライベートサブネットで ECS タスクを実行したところ ECR への403 Forbiddenでタスクの起動に失敗しました。

エラーメッセージ
CannotPullContainerError:
ref pull has been retried 1 time(s): failed to copy: httpReadSeeker: failed open: unexpected status code https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/...:
403 Forbidden

re:Postを参考に ECR のリポジトリポリシーや IAM のアクセス許可を確認しましたが、問題ない認識です。

ECS タスクが正常に起動する方法を教えてください。

どう対応すればいいの?

S3 の VPC エンドポイントのポリシーを確認してください。

ECR から Docker イメージを取得する際に表示される ECS エラーを解決する | AWS re:Post

ECR からイメージをプルするには、ECR のエンドポイントに加えて、S3 の VPC エンドポイントも必要です。S3 の VPC エンドポイントに設定した「VPC エンドポイントポリシー」で ECR が使用する S3 バケットへのアクセスが制限されている場合403 Forbiddenが発生します。

ECR が使用する S3 バケットの ARN は次となり、リージョンによって異なるため注意してください。

# ARN のルール
arn:aws:s3:::prod-【リージョン】-starport-layer-bucket/*

# 東京リージョンの場合
arn:aws:s3:::prod-ap-northeast-1-starport-layer-bucket/*

そのため、S3 の VPC エンドポイントのポリシーで、ECR が使用する S3 バケットへのアクセスが許可されているか確認し、適宜許可してください。

例えば、東京リージョンの場合は次のようなポリシーで許可できます。

{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::prod-ap-northeast-1-starport-layer-bucket/*"]
    }
  ]
}

参考資料

Amazon ECS タスクで Amazon ECR からプライベートイメージをプルするには、Amazon S3 のゲートウェイエンドポイントを作成する必要があります。Amazon ECR は Amazon S3 を使用してイメージレイヤーを保存するため、ゲートウェイエンドポイントが必要です。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.