aws-cliでdockerイメージをローカルからECRへpushする

2 min読了の目安(約2300字TECH技術記事

macで動かしています。

aws-cliのコマンドは、
ローカルに既にaws-cliがある場合は

aws

で動かせますが、
aws-cliがない場合は、docker環境があれば公式コンテナを使って

docker run --rm -it amazon/aws-cli command

でも動かすことができます。

今回使ったaws-cliのバージョンは2.1.24

~ % docker run --rm -it amazon/aws-cli --version
aws-cli/2.1.24 Python/3.7.3 Linux/4.19.121-linuxkit docker/x86_64.amzn.2 prompt/off

ローカルからECRのプライベートリポジトリへdockerイメージをpushする流れは、

  1. docker build
  2. aws-cliでECRへログイン
  3. docker push

参考

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-push-ecr-image.html

docker build

dockerにタグを付けながらbuildしてイメージを作成します。
以下のように、aws_account_idregionリポジトリ名を用いたタグをつける必要があります。

docker build -t aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app .

例えば
aws_account_id: 1111111111
region: ap-northeast-1
pushしたいECRのリポジトリ名: test-image
の場合は

docker build -t 1111111111.dkr.ecr.ap-northeast-1.amazonaws.com/test-image  .

となります。

aws-cliでECRへログイン

docker loginすることでpush先のレジストリを変えることができます。
デフォルトはDocker Hubとなっています。
今回はECRへpushするのでECRへログインします。

https://docs.docker.com/engine/reference/commandline/login/
ユーザーネームとパスワードを指定してログインします。

ECRにログインするためのユーザーネームとパスワードは何か?というと以下になります。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/registry_auth.html#registry-auth-token
ユーザーネームはAWS
パスワードは認証トークン

この認証トークンを取得するのにaws-cliを使います。

docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli ecr get-login-password

ローカルの.aws/credentialsconfigがある前提です。

// credentials
[default]
aws_access_key_id=xxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// config
[default]
region=ap-northeast-1
output=json

--password-stdinという標準入力を利用できるオプションがあるので

docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli ecr get-login-password \
  --region <region>
| docker login \
    --username AWS \
    --password-stdin \
    <aws_account_id>.dkr.ecr.<region>.amazonaws.com

get-login-passwordで得たトークン文字列をdocker loginのpasswordとして使うことができます。

Login Succeededと表示されるとログイン成功です。

docker push

http://docs.docker.jp/engine/reference/commandline/push.html

docker push [オプション] 名前[:タグ]

docker pushをすると、dockerイメージをDocker Hubやレジストリに共有できるようになります。
前述のdocker loginでECRへログインしている状態なので、pushすることでECRへpushできます。

docker push 1111111111.dkr.ecr.ap-northeast-1.amazonaws.com/test-image