🛁

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

2021/02/10に公開

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と表示されるとログイン成功です。

MFAを用いている場合

なお、MFAを用いている場合はそのままのcredentialsではログインできません。

Error response from daemon: login attempt to https://111111111.dkr.ecr.ap-northeast-1.amazonaws.com/v2/ failed with status: 400 Bad Request

MFA用の認証情報を取得しておく必要があります。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/authenticate-mfa-cli/

aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token

arn-of-the-mfa-device部分は、IAMでユーザーを選択して認証画面タブのMFAデバイスの割り当てに書いてあるものです。
code-from-token部分は、Authenticatorなどのコード。

取得した情報を使って、以下のようにファイルを作成。

# ~/.aws/mfa_credentials
[default]
aws_access_key_id = xxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxx
aws_session_token = cxxxxxxxxxxxxx

環境変数で認証に使うファイルを設定しつつ、ログインします。

docker run -e AWS_SHARED_CREDENTIALS_FILE=/root/.aws/mfa_credentials --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

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

Discussion