ECRをパブリックレジストリとして利用可能になりました! #reinvent

2020.12.02

「ECRもDocker Hubみたいにパブリックで使えたら便利なのに・・・」

初めてECRを触ったときからハマコーずーっと思ってましたが、2020年12月1日、Andy Jassyのキーノートでは一切触れられず、ECRのパブリックレジストリ化が発表されました!

Amazon Elastic Container Registry Public: A New Public Container Registry | AWS News Blog

以前より、Docker Hubのダウンロードに一定の制限が設定されはじめており、使い方によってはイメージダウンロードのスロットリングが発生していましたが、パブリックレジストリとしての別の選択肢、ECRが使えることで利用シーンも一気に広がることでしょう!

(祭) ∧ ∧
 Y  ( ゚Д゚)
 Φ[_ソ__y_l〉     ECR マツリダワッショイ
    |_|_|
    し'´J

いやぁ、ホンマにコレ、祭りやで。

ECRがパブリックに使えることで何がうれしいのか?

AWSのコンテナワークロードにおいてECRは、コンテナレジストリとして中心的な存在でした。ECSやEKSで利用するためのコンテナイメージは、アクセス権限をIAMを利用して制御できるECRを使うのが理にかなっており、非常に便利に使えていたのですが、惜しむらくはプライベートな利用しかできず、AWS以外の環境で利用するのは難しかったのが現実です。

ECRのパブリックリリースにより、コンテナイメージを誰でも世界中に公開し、ダウンロードすることが可能になります。

今回の発表で、公開コンテナイメージの検索などがECRの機能としてリリースされています。

マネジメントコンソールより、ECRのメニューを開くと、左側に「Public Gallery」が追加されおり、アクセスするとPublic Galleryに遷移します。当然といえば当然ですが、こちらのページは特にマネジメントコンソールの認証無しに誰でもアクセスが可能です。

ECR Public Gallery

フィルター条件には以下が設定可能。

  • Verified accountかどうか
    • AWS Marketplace認証を受けたAWSアカウントには、Verifiedアカウントバッジが付与される
  • OS
    • Linux or Windows
  • Architectures
    • ARM
    • ARM64
    • x86
    • x86-64

試しにECRパブリックからDocker Pullしてみる

適当なイメージをクリックして、Docker Pullしてみます。

ページには、イメージのURIが記載されていますので、クリックでコピー。後は、URI指定でdocker pullするだけで、特に認証なく即座にイメージのダウンロードができます!

$ docker pull public.ecr.aws/j6l2d4y8/acmesolver:latest
latest: Pulling from j6l2d4y8/acmesolver
58212c1109c5: Pull complete
e04b9830ce5a: Pull complete
905e2177d58c: Pull complete
ae395a7d2388: Pull complete
05f44537fff2: Pull complete
5f96cb7b49e4: Pull complete
Digest: sha256:84f0c6b5dda405b8e8e68473274b61b507f5479a32b127d7bfcc3177075d6f90
Status: Downloaded newer image for public.ecr.aws/j6l2d4y8/acmesolver:latest
public.ecr.aws/j6l2d4y8/acmesolver:latest

他にもいろいろありますね。どこかで聞いたことのあるイメージ。名前に見覚えがあるようなないような。

動かしてみますかね。

うん。

公式ブログの中の人が上げているイメージはこんな感じ。

パブリックなイメージを公開してみる(まだできませんでした)

リポジトリの作成には、AWSアカウントが必要になるので、無い方は事前に準備しておきましょう。

早速パブリックなイメージを公開してみます。ECRのマネジメントコンソールより「Create repository」をクリックすると、以前とはがらりと変わったUIが表示されます。

最初にVisibility settingsで、リポジトリの公開範囲を指定します。一旦Publicにしたリポジトリは、Privateに戻すことはできないようです。

URIなどの詳細情報を入力していきます。リポジトリロゴとかも設定できるので、お気に入りの写真とかアップロードしてみれば良いんじゃないでしょうか。とりあえず、必須項目はコレぐらいなのでさくっと作っちゃいます。すると、こんな感じでECRのpublicタブの下に作成したレジストリが表示されます。

この時点で既にレジストリはpublic公開されていて、URLにアクセスするとこんな感じで作成したレジストリにアクセスできます。

リポジトリへのプッシュコマンドですが、従来のPrivateなリポジトリと基本的に同じです。プッシュ用のコマンドがリポジトリ選択時の右上のボタン「View push commands」をクリックすることで表示されるので、そのとおりに入力していきます。

一点注意点としては、CLIに新しくaws ecr-publicコマンドが追加されているので、事前にcliのバージョンをアップグレードしておきましょう。従来のaws ecrコマンドとは別の体系になっているようです。

$ aws --version
aws-cli/2.1.5 Python/3.7.4 Darwin/19.6.0 exe/x86_64 prompt/off

上のバージョンで試してみましたが、まだecr-publicコマンドは使えませんでした。ドキュメントも更新されていないようなのでもう少し待とうかと思います。

ちなみに、コマンドはこんな感じです。

$ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
$ docker build -t hamako9999 .
$ docker tag hamako9999:latest public.ecr.aws/undefined/hamako9999:latest
$ docker push public.ecr.aws/undefined/hamako9999:latest

ECRパブリックレジストリの良いところ

コンテナイメージを2つのAWSリージョンに自動レプリケートすることで、ダウンロード速度と可用性を向上させています。従来、ローカルコピーを使ってイメージを管理していた場合は、ECRパブリックを使うことでビルドプロセスが簡素化される可能性があります。また、イメージレイヤーもCloudFrontでキャッシュさせることで、特にポピュラーなイメージは、グローバルな利用者にそのメリットを最大化できます。

もちろん、CodeBuildなどと統合されているので、イメージの更新から自動的なアプリケーションデプロイも可能です。

気になるお値段

詳細はこちら。

Amazon ECR Pricing | Docker Container Registry | Amazon Web Services

AWSユーザーは、毎月50GBまでの無料ストレージが利用可能。匿名利用の場合は、毎月500GBの無料データ帯域が利用可能で、それ以上はAWSアカウントにサインインすることで、無料データ帯域が毎月5TBまで増えます。

また、AWS上で稼働しているワークロードであれば、ECR Publicからのイメージは全てのリージョンでダウンロードの帯域が無制限です!

ということで、AWS上のコンテンワークロード(いわゆるひとつのECSやEKS)においては、非常に便利に利用できますね。ざっと見た限り、非常によく使われる有名所のイメージ(nginx、apache)などは既に公式で、ECRパブリックギャラリーにイメージがアップロードされているので、Docker Hubからこちらへの移行も検討してみて良いかと思います。

コンテナ界隈のレジストリ競争が熾烈化

パブリック・イメージを使う場合、従来はDocker Hubを使うことが当たり前でした。今回のECRのパブリックレジストリの発表は、コンテナ界隈に非常に大きな影響をもたらすかもしれません。

AWSアカウントさえあれば誰でもパブリックなリポジトリを公開可能なので、気になった方は気軽にAWSアカウント作ってみて試してみてはいかがでしょうか。

それでは、今日はこのへんで。濱田(@hamako9999)でした。