プライベートサブネットの ECS で CannotPullContainerError 403 Forbidden で失敗する事象を回避するには
困っていた内容
プライベートサブネットで 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 を使用してイメージレイヤーを保存するため、ゲートウェイエンドポイントが必要です。