プライベートサブネットから ECR にイメージをプッシュする際に必要な VPC エンドポイントを教えてください
困っていた内容
プライベートサブネットの EC2 から ECR にイメージをプッシュしたところ、タイムアウトが発生しました。VPC エンドポイントを設定すれば良さそうですが、ecr.dkr
、ecr.api
、s3
と種類がたくさんあってよく分かりません。どれを選んだら良いか教えてください。
どう対応すればいいの?
com.amazonaws.region.ecr.dkr
とcom.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