PackerでECRにpushする時はaws ecr get-loginの工程はいらなかった

hatappi.hateblo.jp

以前上記の記事でPackerでDocker Imageを作成する中で最後にDocker Pushする際の情報をawsコマンドを使用してDocker Login用のコマンドを出力してそれを使っていた

# 事前にaws configureがすんでいること
$ aws ecr get-login --region ap-northeast-1
docker login -u AWS -p [password] -e none https://11111.dkr.ecr.ap-northeast-1.amazonaws.com

ただこの手順には1つ問題があった

問題点

aws ecr get-loginのdocを見ると

This command retrieves a token that is valid for a specified registry for 12 hours, and then it prints a docker login command with that authorization token.

12時間有効なトークンを発行するよみたいな内容
つまりDockerImageを作成する際に12時間たった時もしくは毎回aws ecr get-login --region ap-northeast-1してDocker Login用のパスワードを取り出す必要が出て来る
さすがにこれは面倒

解決策

Packer側のdocker pushのdocをよく見るとecr_loginというオプションがある
これをtrueにするとPackerの内部的にはaws/aws-sdk-goを使って認証してdocker login用のusername, passwordを取り出してそれで処理してくれる

今回は~/.aws/credentialsを使ったがPacker側にAWS access keyとAWS secret keyで設定することも出来る

最後に

毎回aws ecr get-loginしなくてよくなったのでDocker Imageを作って最後にpushのフェーズで12時間たっていてパスワード無効でpushが出来ず落ちるが回避できそう
※ もちろんAWSのcredential情報が間違っていたら当然落ちる