michimani.net

Amazon ECR のパブリックレジストリでイメージを公開してみる

2020-12-02

AWS が提供しているフルマネージドなコンテナレジストリサービス Amazon ECR がパブリックレジストリとして利用できるようになりました。いわゆる、 Docker Hub のような使い方ができるようになるようです。ということで、実際に ECR のパブリックレジストリでイメージを公開してみようと思います。

概要

Amazon ECR がパブリックレジストリとして利用できるようになりました。これまでは AWS 内部 (ECS/EKS) から使うことが基本 (というかそれしかできなかった?) でしたが、パブリックなレジストリとして利用できるようになったことで、 Docker Hub のように AWS 内外に関わらずコンテナイメージを利用できるようになります。

詳しくは既にクラスメソッドのハマコーさんがブログ化されています。毎年 re:Invent 開催期には最速で情報発信しているクラスメソッドさんにはあらためて感謝です。今年は期間が長いのでみなさんのブログ筋が最後まで元気に動くように陰ながら応援しています。

イメージを公開してみる

では、さっそくコンテナイメージを公開してみたいと思います。今回はすべて AWS CLI で操作をしていきます。

AWS CLI のバージョン確認

現時点 (2020/12/02) で v1 と v2 の最新バージョンは下記のとおりです。

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 の両方を共存させておくとよいかもしれません。

参考

以上、よっしー (michimani) でした。