概要
buildspec.yaml
を利用してAWS CodeBuildでビルドする際の、
DockerイメージをAWSのECRにプッシュするために使用するコマンドについて。
以下のようにyamlに記載していましたが、これは古い認証方法とのこと。
(CLIコマンドとして使うときも同様)
- $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
以下のように書き換えることが推奨されています。
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
なぜか?今回調べてみました。
aws ecr get-login
とaws ecr get-login-password
の違い
1つ目のコマンドでは、aws ecr get-login
を使用してDockerログインコマンドを生成し、そのコマンドを実行しています。この方法は、AWS CLI v1では使われていたようですが、AWS CLI v2では非推奨とのこと。パスワードがシェルのhistoryやログファイルに残ってしまうリスクがあったためです。
2つ目のコマンドでは、aws ecr get-login-password
を使用してECRからDocker認証トークンを取得し、そのトークンを使用してDockerにログインします。パスワードを標準入力(--password-stdin
)を通じてDockerに渡すため、コマンドラインやシェルの履歴にパスワードが残らないようになりました。こちらはAWS CLI v2で推奨されていますし、セキュリティの観点からも好ましいでしょう。
どちらも一時的な認証トークンではありますが、パスワードをパイプラインを通じてdocker login
コマンドに渡せる2番目の方が良い、ということになります。
公式ドキュメントから引用
get-login-password を使用して Amazon ECR レジストリに対して Docker を認証するには、aws ecr get-login-password コマンドを実行します。認証トークンを docker login コマンドに渡すとき、ユーザー名に AWS 値を使用し、認証先の Amazon ECR レジストリの URI を指定します。
補足
ちなみに、一つ目の方法の際、aws ecr get-login-password --region ap-northeast-1
というように$()
がない場合だとno basic auth credentials
というログが出ます。これは以前記事にしたのでご参考までに。
そのほか参考: