Amazon ECRを使ってみる。
環境はEC2(AmazonLinux2:t2.micro)。
##リポジトリ作成
マネジメントコンソール → サービス → ECS → レポジトリ で「レポジトリを作成」
レポジトリ名を入力
名前空間を含めることができるとのことなので
今回は sandbox/test-pj/web とする。
タグのイミュータビリティ
有効にすると同じタグを上書きができなくなる。
業務等でイメージのバージョンを確実に管理したい場合は
有効にしたほうがよさそう。
# タグが上書きできてしまうとイメージの特定するには
# ハッシュ値が必要になってしまう。
一方、上書きできないとlatestのようなタグは
使い勝手が著しく悪くなるのでどっちにするかは用途次第。
イメージスキャンの設定
有効にするとプッシュ後も自動でイメージスキャンをしてくれる。
##AWS CLI のバージョンアップ
バージョンアップしておかないとdockerコマンドの認証まわりでエラーが出る可能性がある。
バージョンアップの仕方は公式ドキュメントの「Linux での AWS CLI バージョン 2 の更新」。
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
which aws
ls -l /usr/bin/aws ←whichコマンドの結果次第で内容が変わる
sudo ./aws/install --bin-dir /usr/bin --install-dir /usr/bin --update ←whichコマンド、lsコマンドと結果次第で内容が変わる
aws --version
参考までに、バージョンアップしないでdockerコマンドでget-login-passwordをやったら以下のとおりエラーになった。
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 056789090539.dkr.ecr.ap-northeast-1.amazonaws.com
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:
aws help
aws <command> help
aws <command> <subcommand> help
aws: error: argument operation: Invalid choice, valid choices are:
batch-check-layer-availability | batch-delete-image
batch-get-image | complete-layer-upload
create-repository | delete-lifecycle-policy
delete-repository | delete-repository-policy
describe-image-scan-findings | describe-images
describe-repositories | get-authorization-token
get-download-url-for-layer | get-lifecycle-policy
get-lifecycle-policy-preview | get-repository-policy
initiate-layer-upload | list-images
list-tags-for-resource | put-image
put-image-scanning-configuration | put-image-tag-mutability
put-lifecycle-policy | set-repository-policy
start-image-scan | start-lifecycle-policy-preview
tag-resource | untag-resource
upload-layer-part | get-login
help
Error: Cannot perform an interactive login from a non TTY device
##dockerインストール
公式ドキュメントの「Docker のインストール」
##IAMロールを作成しEC2にアタッチ
公式ドキュメントの
「 Amazon ECR リポジトリへのアクセス」を参考に
Resourceは*でポリシーを作成しEC2にアタッチ。
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"ListImagesInRepository",
"Effect":"Allow",
"Action":[
"ecr:ListImages"
],
"Resource":"*"
},
{
"Sid":"GetAuthorizationToken",
"Effect":"Allow",
"Action":[
"ecr:GetAuthorizationToken"
],
"Resource":"*"
},
{
"Sid":"ManageRepositoryContents",
"Effect":"Allow",
"Action":[
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
],
"Resource":"*"
}
]
}
あとはマネジメントコンソール → ECR → リポジトリから
対象リポジトリを選んで「プッシュコマンドの表示」をクリックし
表示される内容をやっていくだけ。
##デフォルトレジストリに対して認証する
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ************.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
##イメージ作成
$ docker build -t sandbox/test-pj/web .
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
sandbox/test-pj/web latest c2df0d42b9ce 10 seconds ago 221MB
$
##ECR登録用のタグ付け
$ docker tag sandbox/test-pj/web:latest ************.dkr.ecr.ap-northeast-1.amazonaws.com/sandbox/test-pj/web:latest
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
************.dkr.ecr.ap-northeast-1.amazonaws.com/sandbox/test-pj/web latest c2df0d42b9ce About a minute ago 221MB
sandbox/test-pj/web latest c2df0d42b9ce About a minute ago 221MB
##PUSH
$ docker push ************.dkr.ecr.ap-northeast-1.amazonaws.com/sandbox/test-pj/web:latest
:latest
631e3af3d0e9: Pushed
fc8234f25c50: Pushed
933e707b3698: Pushed
895d16eabfa1: Pushed
latest: digest: sha256:d5d908a0a3e69a0c37af7b64dc21146333a358cc733b33837e279647d619c101 size: 1155
$