はじめに
先日、S3に向けたVPC Endpointが設定されているVPCにてECS(Fargate)を実行しようとした際、少々ハマったので備忘録です。
起こった事象
S3に向けたVPC Endpointが設定されているVPCにてECS(Fargate)を実行しようとしたところ、下記のようなErrorが発生してFargateの起動が失敗した。
CannotPullContainerError: error pulling image configuration: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message>.....
どうやら、何らかの理由でECRからのコンテナイメージの取得に失敗している模様。
確認したこと
該当のSubnetからIGW(Internet Gate Way)へのRouteがあることは確認済み。
事象が起こった原因
調べてみると、FargateがECRにあるContainer imageを取得するためにprod-***REGION***-starport-layer-bucket
と言うS3 Bucketにアクセスしている模様。これがECRの実体なのか。
参考: https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-setting-up-s3-gateway
解決策
VPC EndpointのPolicyのResource
セクションに、ECRが使用しているS3 BucketのARNを追記。
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "***SID***",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::***BUCKET***",
"arn:aws:s3:::prod-ap-northeast-1-starport-layer-bucket/*"
]
}
]
}
これでFargateを起動すると、無事コンテナイメージが読み込まれて起動が成功した。
最後に
ECRへのアクセスに関連するような設定が何一つ見当たらなかったので、少々手こずった。ことS3に関してはAWSの他のサービスでもバックエンドで利用しているものが多そうだし、特別な理由がない限りVPC EndpointのPolicyを利用してアクセスコントロールを行うのはアンチパターンな気がする。他にも、例えばYum
でAmazon Linux
系のRepositoryを利用する場合にもうまく接続できなかったりする。