Amazon ECR のパブリックレジストリでイメージを公開してみる
2020-12-02AWS が提供しているフルマネージドなコンテナレジストリサービス Amazon ECR がパブリックレジストリとして利用できるようになりました。いわゆる、 Docker Hub のような使い方ができるようになるようです。ということで、実際に ECR のパブリックレジストリでイメージを公開してみようと思います。
概要
Amazon ECR がパブリックレジストリとして利用できるようになりました。これまでは AWS 内部 (ECS/EKS) から使うことが基本 (というかそれしかできなかった?) でしたが、パブリックなレジストリとして利用できるようになったことで、 Docker Hub のように AWS 内外に関わらずコンテナイメージを利用できるようになります。
詳しくは既にクラスメソッドのハマコーさんがブログ化されています。毎年 re:Invent 開催期には最速で情報発信しているクラスメソッドさんにはあらためて感謝です。今年は期間が長いのでみなさんのブログ筋が最後まで元気に動くように陰ながら応援しています。
イメージを公開してみる
では、さっそくコンテナイメージを公開してみたいと思います。今回はすべて AWS CLI で操作をしていきます。
AWS CLI のバージョン確認
現時点 (2020/12/02) で v1 と v2 の最新バージョンは下記のとおりです。
-
v1
aws-cli-v1 $ aws --version aws-cli/1.18.187 Python/3.8.5 Darwin/19.6.0 botocore/1.19.27
-
v2
$ aws --version aws-cli/2.1.5 Python/3.7.4 Darwin/19.6.0 exe/x86_64 prompt/off
ECR のパブリックレジストリに対する操作は ecr-public
という新たに追加されたコマンドを使いますが、上記のバージョンで対応しているのは v1 のみです。 v2 ではまだ使えないようなので、注意です。 その後 v2 の最新バージョン 2.1.6
がリリースされ、 ecr-public
コマンドが追加されていることを確認しました。v1 だけでなく v2 でも実行可能です。
ecr-public
コマンドで使用できるサブコマンドは下記の通りです。
$ aws ecr-public help
...
AVAILABLE COMMANDS
o batch-check-layer-availability
o batch-delete-image
o complete-layer-upload
o create-repository
o delete-repository
o delete-repository-policy
o describe-image-tags
o describe-images
o describe-registries
o describe-repositories
o get-authorization-token
o get-login-password
o get-registry-catalog-data
o get-repository-catalog-data
o get-repository-policy
o help
o initiate-layer-upload
o put-image
o put-registry-catalog-data
o put-repository-catalog-data
o set-repository-policy
o upload-layer-part
リポジトリの作成
まずは ECR にパブリックなリポジトリを作成します。サブコマンドは create-repository
です。
$ aws ecr-public create-repository help
...
SYNOPSIS
create-repository
--repository-name <value>
[--catalog-data <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]
リポジトリ名だけ指定すれば良さそうです。
以前、 Amazon Linux 2 に Python 3.8 をインストールしたイメージを作って Docker Hub に置いているので、同じものを ECR で公開してみます。
ということで、リポジトリ名は amzn2py38
とします。
$ aws ecr-public create-repository \
--repository-name amzn2py38
Could not connect to the endpoint URL: "https://api.ecr-public.ap-northeast-1.amazonaws.com/"
できませんでした。ということでリージョンを us-east-1
にして再実行してみます。
$ aws ecr-public create-repository \
--repository-name amzn2py38 \
--region us-east-1
{
"repository": {
"repositoryArn": "arn:aws:ecr-public::************:repository/amzn2py38",
"registryId": "************",
"repositoryName": "amzn2py38",
"repositoryUri": "public.ecr.aws/e4v1s0v0/amzn2py38",
"createdAt": 1606861651.668
},
"catalogData": {}
}
作成できました。一応 describe-repositories
サブコマンドで確認します。
$ aws ecr-public describe-repositories \
--repository-names amzn2py38 \
--region us-east-1
{
"repositories": [
{
"repositoryArn": "arn:aws:ecr-public::************:repository/amzn2py38",
"registryId": "************",
"repositoryName": "amzn2py38",
"repositoryUri": "public.ecr.aws/e4v1s0v0/amzn2py38",
"createdAt": 1606861651.668
}
]
}
取得できました。
イメージの Push
作成したリポジトリにイメージを Push します。これまで ECR にイメージを Push してきたときと同じように、 ECR にログイン後、 docker push
コマンドでイメージを Push します。従来の方法と異なっているのは、 ECR にログインする際に ecr-public get-login-password
コマンドを使うようになっている点です。
ということで、まずは ECR にログインします。
$ aws ecr-public get-login-password \
--region us-east-1 \
| docker login \
--username AWS
--password-stdin public.ecr.aws
Login Succeeded
イメージをビルドします。
$ docker build -t amzn2py38 .
タグ付けします。
$ docker tag amzn2py38:latest public.ecr.aws/e4v1s0v0/amzn2py38:latest
Push します。
docker push public.ecr.aws/e4v1s0v0/amzn2py38:latest
Push したイメージを確認してみます。サブコマンドは describe-images
です。
$ aws ecr-public describe-images help
...
SYNOPSIS
describe-images
[--registry-id <value>]
--repository-name <value>
[--image-ids <value>]
[--cli-input-json <value>]
[--starting-token <value>]
[--page-size <value>]
[--max-items <value>]
[--generate-cli-skeleton <value>]
リポジトリ名を指定します。
$ aws ecr-public describe-images \
--repository-name amzn2py38 \
--region us-east-1
{
"imageDetails": [
{
"registryId": "************",
"repositoryName": "amzn2py38",
"imageDigest": "sha256:8e6d74d747e42aefa22e27b2656b07356da814f3a2e6c17ba0f54310fdea8c54",
"imageTags": [
"latest"
],
"imageSizeInBytes": 206732282,
"imagePushedAt": 1606863922.0,
"imageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json"
}
]
}
イメージが Push できてます。
こちらが公開されたイメージです。
まとめ
Amazon ECR がパブリックレジストリとして利用できるようになったので、イメージを公開してみた話でした。
Docker Hub の利用制限 (Pull 回数の制限) に苦しんでいる方は ECR で公開されているパブリックイメージを利用してみるのも良さそうです。ECR で公開されているイメージは ECR Public Gallery で検索できるのですが、既に MySQL や nginx といったイメージも公開されているようなので、前向きに検討できそうです。
あと、やっぱり AWS CLI の新機能に対する対応はまだまだ v1 のほうが早いので、すぐに試したい!という方は v1 と v2 の両方を共存させておくとよいかもしれません。
参考
- [TIPS] AWS CLIの「v1」と「v2」を共存させて使う方法 | Developers.IO
- [TIPS] AWS CLIの「v1」と「v2」を共存させて使う方法 (Dockerコンテナ編) | Developers.IO
comments powered by Disqus