複数アカウントでAmazon ECRのVPCエンドポイント(com.amazonaws.region.ecr.dkr)を共有する際の注意点
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
タイトル
複数アカウントでAmazon ECRのVPCエンドポイント(com.amazonaws.region.ecr.dkr)を共有する際の注意点
困っていること
以下の記事を参考に、特定のアカウントにVPCエンドポイントを集約する構成を採用しています。
Amazon Elastic Container Registry(以降、ECR)のプライベートレジストリに保存されたコンテナイメージを使用し、プライベートサブネットでAWS Fargateタスクを起動する場合、ECR用のVPCエンドポイント(com.amazonaws.region.ecr.dkr)が必要です。
上記の記事を参考にcom.amazonaws.region.ecr.dkrも集約し、ECSサービスでタスク1つ起動しようとすると以下のエラーでタスクが停止してしまいます。
CannotPullContainerError: pull image manifest has been retried 5 time(s): failed to resolve ref 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/repo:latest: failed to do request: Head "https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/v2/repo/manifests/latest": dial tcp: lookup 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com on xx.xx.xx.xx:xx: no such host
解決方法を教えてください。
原因
このエラーは、ECSタスク起動時にECRからコンテナイメージを取得する際、以下のDNS名に対する名前解決ができなかったことを示しています。
- 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
ECRは、AWSが提供するフルマネージドのコンテナイメージレジストリサービスです。
各AWSアカウントには、デフォルトでプライベートECRレジストリが提供されています。
URLは以下の通りです。
https://aws_account_id.dkr.ecr.region.amazonaws.com
The URL for your default private registry is
https://aws_account_id.dkr.ecr.region.amazonaws.com
https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html
そのため、DockerイメージのPush/Pull操作等で利用される、ECRのDockerレジストリに対するVPCエンドポイントcom.amazonaws.region.ecr.dkrでは、アカウントIDの指定が必要です。
ちなみに、ECR用のVPCエンドポイント(com.amazonaws.region.ecr.api)については、アカウントIDの指定は不要です。このエンドポイントは、参考記事の手順通りに設定することで、共有先アカウントで利用可能になります。
前提条件
本設定を実施する前に、参考記事の手順に従い、以下の前提条件が満たされていることを確認してください。
- VPCエンドポイント集約アカウントと共有先アカウントとの間で、Route53プライベートホストゾーンの「関連付けの承認」と「関連付け」までが完了していること
また、VPCエンドポイント集約アカウントのRoute 53プライベートホストゾーンで、以下が設定済みか確認ください。
- ホストゾーン名
dkr.ecr.ap-northeast-1.amazonaws.comが作成されていること - 関連付けられたVPCに、VPCエンドポイント共有先アカウントのVPCが指定されていること(下図赤枠部分)

対処方法
まず、Route 53プライベートホストゾーンから、アカウントIDが指定されていないレコード名dkr.ecr.ap-northeast-1.amazonaws.com(タイプA)を削除します。このレコードは不要です。

新たに123456789012.dkr.ecr.ap-northeast-1.amazonaws.comという名前のレコードを作成します。アカウントIDは共有先アカウントIDです。
トラフィックルーティング先は、作成済みのVPCエンドポイントであるcom.amazonaws.region.ecr.dkrを指定します。

以上で設定は完了です。
これにより、VPCエンドポイント共有先アカウントでECRからコンテナイメージを取得し、ECSタスクを正常に起動できるようになります。

VPCエンドポイント共有先アカウント追加手順
新たなアカウントでVPCエンドポイントの共有設定が必要な場合は、以下の手順に従って設定を行ってください。
- 参考記事の手順通り、新しいVPCエンドポイント共有先アカウントとの関連付けまでを実施
- レコード名
アカウントID.dkr.ecr.ap-northeast-1.amazonaws.comを作成
※アカウントIDは実際の12桁の数値に置き換えてください
これにより、新しいアカウントでもVPCエンドポイントが利用可能になります。

参考







