aws-cliでdockerイメージをローカルからECRへpushする
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する流れは、
- docker build
- aws-cliでECRへログイン
- docker push
参考
docker build
dockerにタグを付けながらbuildしてイメージを作成します。
以下のように、aws_account_id
とregion
とリポジトリ名
を用いたタグをつける必要があります。
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へログインします。
ユーザーネームとパスワードを指定してログインします。
ECRにログインするためのユーザーネームとパスワードは何か?というと以下になります。AWS
パスワードは認証トークン
この認証トークンを取得するのにaws-cliを使います。
docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli ecr get-login-password
以下のようにローカルの.aws/
にcredentials
とconfig
がある前提です。
// 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用の認証情報を取得しておく必要があります。
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
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