複数アカウントでAmazon ECRのVPCエンドポイント(com.amazonaws.region.ecr.dkr)を共有する際の注意点

複数アカウントでAmazon ECRのVPCエンドポイント(com.amazonaws.region.ecr.dkr)を共有する際の注意点

Clock Icon2024.11.12

タイトル

複数アカウントでAmazon ECRのVPCエンドポイント(com.amazonaws.region.ecr.dkr)を共有する際の注意点

困っていること

以下の記事を参考に、特定のアカウントにVPCエンドポイントを集約する構成を採用しています。

https://dev.classmethod.jp/articles/ses-smtpendpoint-aggregation-in-multiaccount/

https://dev.classmethod.jp/articles/vpcendpoint-aggregation-in-multiaccount/

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が指定されていること(下図赤枠部分)
    cm-hirai-screenshot 2024-11-06 17.01.17のコピー

対処方法

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

cm-hirai-screenshot 2024-11-06 17.01.17

新たに123456789012.dkr.ecr.ap-northeast-1.amazonaws.comという名前のレコードを作成します。アカウントIDは共有先アカウントIDです。

トラフィックルーティング先は、作成済みのVPCエンドポイントであるcom.amazonaws.region.ecr.dkrを指定します。

cm-hirai-screenshot 2024-11-06 17.19.28

以上で設定は完了です。

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

cm-hirai-screenshot 2024-11-06 17.13.16

VPCエンドポイント共有先アカウント追加手順

新たなアカウントでVPCエンドポイントの共有設定が必要な場合は、以下の手順に従って設定を行ってください。

  1. 参考記事の手順通り、新しいVPCエンドポイント共有先アカウントとの関連付けまでを実施
  2. レコード名アカウントID.dkr.ecr.ap-northeast-1.amazonaws.comを作成
    ※アカウントIDは実際の12桁の数値に置き換えてください

これにより、新しいアカウントでもVPCエンドポイントが利用可能になります。

cm-hirai-screenshot 2024-11-06 17.16.44

参考

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/Registries.html

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/vpc-endpoints.html

https://docs.aws.amazon.com/ja_jp/general/latest/gr/ecr.html

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.