概要
- プライベートサブネット内のEC2からECRに接続したい
- エンドポイント、セキュリティグループ、IAMロール/ポリシーは正しく設定している
- それなのにaws ecr get-login-passwordすら成功せず、そもそもECRに接続できていない状態
解決方法
タイトルのような内容で検索すると、以下の1〜3の項目についてはすぐに出てくると思いますので、この3つについては簡単に触れるだけにしています。
1. VPCエンドポイントを設定する
設定が必要なVPCエンドポイントは以下の2つです。
- Service Name : com.amazonaws.ap-northeast-1.ecr.api
- Service Name : com.amazonaws.ap-northeast-1.ecr.dkr
2. セキュリティグループを設定する
セキュリティグループは以下の2つが必要になります。
■VPCエンドポイント用のセキュリティグループ (Ex. sg-vpc-endpoint)
- 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への通信を許可するようにします
※AWSに慣れていない方向けのコメント:VPCエンドポイントにもセキュリティグループが必要なことに注意してください。
3. IAMロール/ポリシーを設定する
AmazonEC2ContainerRegistryReadOnly
ポリシーを設定したIAMロールをEC2インスタンスに付与します。
4. DNS名でVPCエンドポイントに接続できるようにする
1~3までの内容は調べればすぐに出てくると思いますが、こちらの内容が意外と出てこなくてハマりやすいポイントになるかと思います。
設定することは「VPC内のリソースがプライベートDNS名を使用してVPCエンドポイントにアクセスできるようにする」ということです。
具体的な手順は以下の通りです。
- VPCを作成したあとに、
[作成したVPCを選択] > [Actions] > [Edit VPC settings]
からEnable DNS hostnames
にチェックを入れるEnable DNS resolution
はデフォルトでチェック済みだと思いますが念の為合わせてチェックしておいてください。
- 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
※1~4までの設定が反映されるまで数分ほどかかる場合があります。