Closed4

VPCエンドポイントを設定しているのにECSタスクがECRへアクセスできない問題のメモ

N04hN04h

以下エラーが出ていた際の対応内容をメモ

※IPは伏せ字にしています

ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve ecr registry auth: service call has been retried 3 time(s): RequestError: send request failed caused by: Post "https://api.ecr.ap-northeast-1.amazonaws.com/": dial tcp XXX.XXX.XXX.XXX:443: i/o timeout. Please check your task network configuration.

N04hN04h

結論から言うと、セキュリティグループの設定が足りていなかった。
色々訳ありでL1で以下のようにCDKでVPCエンドポイントを作っていた

new CfnVPCEndpoint(this, 'ECRInterfaceEndpoint', {
  vpcEndpointType: 'Interface',
  serviceName: `com.amazonaws.${this.region}.ecr.api`,
  vpcId: vpc.vpcId,
  subnetIds: [protectedSubnet0.subnetId, protectedSubnet1.subnetId],
  privateDnsEnabled: true,
});

この場合、セキュリティグループがデフォルトのものが設定されるみたく、

Post "https://api.ecr.ap-northeast-1.amazonaws.com/": dial tcp XXX.XXX.XXX.XXX:443

へのアクセスはもちろん許可されていないため、タイムアウトとなっていた。
このあたり勝手にやってくれるのかなとかおもってたけど、
ちゃんと設定する必要があるみたいです。

N04hN04h

対応内容

const securityGroup = new SecurityGroup(this, 'InterfaceEndpointSecurityGroup', {
  securityGroupName: 'InterfaceEndpointSecurityGroup',
  vpc,
});

new CfnVPCEndpoint(this, 'ECRInterfaceEndpoint', {
  vpcEndpointType: 'Interface',
  serviceName: `com.amazonaws.${this.region}.ecr.api`,
  vpcId: vpc.vpcId,
  subnetIds: [protectedSubnet0.subnetId, protectedSubnet1.subnetId],
  securityGroupIds: [securityGroup.securityGroupId],
  privateDnsEnabled: true,
});

で、ECSサービスのセキュリティグループからのHTTPS, Port:443のインバウンドを許可してあげればOK

このスクラップは2023/09/06にクローズされました