[AWS] EC2からECRへ接続できない

  • プライベートサブネット内のEC2からECRに接続したい
  • エンドポイント、セキュリティグループ、IAMロール/ポリシーは正しく設定している
  • それなのにaws ecr get-login-passwordすら成功せず、そもそもECRに接続できていない状態

タイトルのような内容で検索すると、以下の1〜3の項目についてはすぐに出てくると思いますので、この3つについては簡単に触れるだけにしています。

  1. VPCエンドポイントを設定する
  2. セキュリティグループを設定する
  3. IAMロール/ポリシーを設定する
  4. DNS名でVPCエンドポイントに接続できるようにする

1. VPCエンドポイントを設定する

設定が必要なVPCエンドポイントは以下の2つです。

  • Service Name : com.amazonaws.ap-northeast-1.ecr.api
  • Service Name : com.amazonaws.ap-northeast-1.ecr.dkr

2. セキュリティグループを設定する

  • Inbound rules : Type = HTTPS, Source = sg-ec2(EC2用セキュリティグループ)
    • EC2からVPCエンドポイントへの通信を許可するようにします

■EC2用のセキュリティグループ (Ex. sg-ec2)

  • Inbound rules : Type = HTTPS, Source = sg-vpc-endpoint(VPCエンドポイント用セキュリティグループ)
    • VPCエンドポイントからEC2への通信を許可するようにします

3. IAMロール/ポリシーを設定する

AmazonEC2ContainerRegistryReadOnlyポリシーを設定したIAMロールをEC2インスタンスに付与します。

4. DNS名でVPCエンドポイントに接続できるようにする

1~3までの内容は調べればすぐに出てくると思いますが、こちらの内容が意外と出てこなくてハマりやすいポイントになるかと思います。

設定することは「VPC内のリソースがプライベートDNS名を使用してVPCエンドポイントにアクセスできるようにする」ということです。

具体的な手順は以下の通りです。

  1. VPCを作成したあとに、[作成したVPCを選択] > [Actions] > [Edit VPC settings] から Enable DNS hostnamesにチェックを入れる
    • Enable DNS resolutionはデフォルトでチェック済みだと思いますが念の為合わせてチェックしておいてください。
  2. VPCエンドポイントを作成するときに VPC > Additional settings > Enable DNS nameにチェックを入れる
    • こちらもデフォルトでチェック済みになっていると思いますが念の為チェックしておいて下さい。

以上の設定を行った後で、EC2内で以下を実行すれば確認・ログインが出来るはずです。

curl -v https://{AWS-ACCOUNT-ID}.dkr.ecr.{REGION}.amazonaws.com/v2/

aws ecr get-login-password --region {REGION} | docker login --username AWS --password-stdin {AWS-ACCOUNT-ID}.dkr.ecr.{REGION}.amazonaws.com