プライベートサブネットから ECR にイメージをプッシュする際に必要な VPC エンドポイントを教えてください

2021.12.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

プライベートサブネットの EC2 から ECR にイメージをプッシュしたところ、タイムアウトが発生しました。VPC エンドポイントを設定すれば良さそうですが、ecr.dkrecr.apis3と種類がたくさんあってよく分かりません。どれを選んだら良いか教えてください。

どう対応すればいいの?

com.amazonaws.region.ecr.dkrcom.amazonaws.region.ecr.apiをご使用ください。

ECR にイメージをプッシュする際に必要な VPC エンドポイントは、ECR VPC エンドポイントとなります。ECR VPC エンドポイントは、対応する API によって2種類提供されていますが、プッシュの際は両方のエンドポイントが必要になります。

Amazon ECR インターフェイス VPC エンドポイント (AWS PrivateLink) - Amazon ECR

com.amazonaws.region.ecr.dkr

このエンドポイントは、Docker Registry API に使用されます。push や pull などの Docker クライアントコマンドでは、このエンドポイントが使用されます。

com.amazonaws.region.ecr.api

このエンドポイントは、Amazon ECR API への呼び出しに使用されます。DescribeImages や CreateRepository などの API アクションは、このエンドポイントに移動します。

やってみた

VPC エンドポイントを設定しない状態で、プライベートサブネットの EC2 から Docker イメージをプッシュします。

docker pushの前に、Docker クライアントを認証しますが、VPC エンドポイントを設定しない状態では、認証に必要なパスワード(aws ecr get-login-password)の取得に失敗します。

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 1234567889012.dkr.ecr.ap-northeast-1.amazonaws.com

Connect timeout on endpoint URL: "https://api.ecr.ap-northeast-1.amazonaws.com/"
Error: Cannot perform an interactive login from a non TTY device

com.amazonaws.region.ecr.apiだけ追加して、再チャレンジします。
パスワードの取得は成功しましたが、その後のログイン(docker login)に失敗します。

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 1234567889012.dkr.ecr.ap-northeast-1.amazonaws.com
Error response from daemon: Get "https://1234567889012.dkr.ecr.ap-northeast-1.amazonaws.com/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

com.amazonaws.region.ecr.dkrも追加して、再チャレンジします。
ログインに成功し、その後のプッシュも成功しました。

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 1234567889012.dkr.ecr.ap-northeast-1.amazonaws.com

Login Succeeded

$ docker tag hello-world:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world:latest   
$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world:latest
The push refers to repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hello-world]
123456789012: Pushed 
abcdefghijkl: Pushed 
latest: digest: sha256:123456789012abcdefghijkl123456789012 size: 2194

参考資料