← ハンズオン一覧に戻る

AWS Hands-on / Amazon ECR

自分のイメージを、
ECRに送り込む

これまでパソコンの中だけにあったコンテナイメージを、Amazon ECR(Elastic Container Registry)というAWSの保管場所にプッシュ(送信)します。他の場所やサービスからも同じイメージを取得できるようにする、最初の一歩です。

● Lv.2 基本的なリソースを作れる人 ⏱ 所要 30〜50 分 コマンドライン操作あり
01 — Prerequisites

はじめる前に

  • 必須ローカルでDockerイメージをビルド・実行した経験(docker builddocker run
  • 必須AWS CLIがインストールされ、ログイン済みのIAMユーザーで認証情報が設定されていること
  • 必須ターミナル(コマンドライン)操作の基本
  • あると良いIAMのポリシー・許可の仕組みについてのイメージ

※ このハンズオンはAWSのリソース(Amazon ECR)を使用します。コンソール操作とターミナル操作の両方を行います。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

ローカルでビルドしたコンテナイメージは、今のところ自分のパソコンの中にしか存在しません。このままでは、別のパソコンで同じイメージを動かしたいときも、AWS上のコンテナサービスでイメージを動かしたいときも、毎回ローカルで作り直すしかありません。

そこで使うのがAmazon ECR(Elastic Container Registry)です。Dockerイメージを保管できるAWSのプライベートなレジストリで、一度プッシュ(送信)しておけば、権限を持つ人やサービスがいつでも同じイメージをプル(取得)できるようになります。今回は、ローカルにあるイメージをECRのリポジトリにプッシュし、保管されたことを確認するところまでを行います。

「レジストリ」と「リポジトリ」って何が違うの?

レジストリはAWSアカウントごとに1つ用意される、イメージ保管庫全体の入れ物です。リポジトリは、その中にある個別の保管場所(フォルダのようなもの)で、用途やアプリケーションごとに分けて作成します。

docker loginは何をしているの?

ECRのレジストリに対して、Dockerクライアントが「プッシュ・プルする権限を持っている」と証明するための認証です。発行される認証トークンは12時間だけ有効なので、時間が空くと再度ログインが必要になります。

Goal

Amazon ECRにプライベートリポジトリを作成し、ローカルのDockerイメージにタグを付けてプッシュする。AWSマネジメントコンソール上で、プッシュしたイメージが保管されていることを確認する。

04 — Flow

送り込む流れ

「認証する」→「タグを付ける」→「送り込む」→「確認する」という流れを体験します。

🔑 docker login ECRに対して認証
🏷️ docker tag 送り先の名前を付ける
📤 docker push イメージを送り込む
📦 Amazon ECR 保管完了
05 — Requirements

要件

以下の要件を満たし、ローカルのイメージをECRに送り込むところまでを体験してください。

No要件
1使用するIAMユーザーに、Amazon ECRを操作できる権限(例:AmazonEC2ContainerRegistryFullAccess)が付与されている。
2Amazon ECRに、任意の名前でプライベートリポジトリを1つ作成する(例:my-first-repo)。
3ローカルにビルド済みのDockerイメージを用意し、aws ecr get-login-password を使ってDockerクライアントをECRに対して認証する。
4ローカルイメージに、作成したリポジトリのURIを含むタグを付けて docker push する。
5AWSマネジメントコンソールのECRリポジトリ画面で、プッシュしたイメージが一覧に表示されていることを確認する。
06 — Steps

構築の進め方

「権限を整える」→「リポジトリを作る」→「認証してタグ付けする」→「プッシュして確認する」という順番で進めます。

  1. フェーズ1 — 権限を整える
  2. IAMユーザーにECRの操作権限を付与する

    使用するIAMユーザーに、AWS管理ポリシー AmazonEC2ContainerRegistryFullAccess をアタッチします。すでに同等の権限を持っている場合はこの手順は不要です。

    なぜこの権限が必要か

    ECRへの認証トークン取得(ecr:GetAuthorizationToken)や、イメージのプッシュ・プルには、それぞれ個別のIAM許可が必要です。このポリシーには、ハンズオンで使う一連の操作がまとめて含まれています。

  3. フェーズ2 — リポジトリを作る
  4. Amazon ECRコンソールでプライベートリポジトリを作成する

    ECRコンソールを開き、「プライベートリポジトリ」を選択して「リポジトリの作成」を進めます。リポジトリ名は自由に決められます(例:my-first-repo)。英字で始まり、小文字・数字・ハイフンなどのみを含む名前にします。

    「Image tag immutability(イメージタグのミュータビリティ)」は、迷う場合は「ミュータブル」のままで進めて構いません。タグの上書きを許可するか禁止するかの設定です。暗号化設定はデフォルト(AES-256)のままで問題ありません。

  5. フェーズ3 — 認証してタグ付けする
  6. ECRレジストリに対してDockerを認証する

    ターミナルで、リージョンとAWSアカウントIDを自分の環境のものに置き換えて実行します。

    # region・aws_account_id は自分の環境の値に置き換える
    aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com

    Login Succeeded と表示されれば認証は成功です。

  7. ローカルイメージにECR向けのタグを付ける

    docker images でプッシュしたいイメージのIDまたは名前を確認し、ECRのリポジトリURIを含む形式でタグを付けます。

    docker images
    
    # 例: ローカルイメージ my-custom-nginx:1.0 にタグを付ける場合
    docker tag my-custom-nginx:1.0 <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-first-repo:1.0
    タグの形式

    ECR向けのタグは「レジストリURI/リポジトリ名:任意のタグ」という形式になります。リポジトリ名の部分は、作成したリポジトリ名と完全に一致させる必要があります。

  8. フェーズ4 — プッシュして確認する
  9. docker pushでイメージを送り込む

    docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-first-repo:1.0

    転送の進捗が表示され、完了するとプッシュされたイメージのダイジェスト(識別子)が表示されます。

  10. コンソールで保管されたイメージを確認する

    ECRコンソールで作成したリポジトリを開き、「イメージ」タブに、付けたタグ名のイメージが表示されていることを確認します。

    これがゴール

    自分のパソコンの中にしかなかったイメージが、AWS上の保管場所に存在している——この状態を確認できたら、このハンズオンの目的は達成です。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直すか」の手がかりとして使ってください。

Pitfall 01 — ログインに失敗する

「docker loginを実行すると、認証エラーや拒否のメッセージが出る」

コマンド内のAWSアカウントIDやリージョンが実際の値と一致しているか、また使用しているIAMユーザーにECRの操作権限が付与されているかを見直しましょう。

Pitfall 02 — プッシュが拒否される

「docker pushを実行すると、denied(拒否)と表示される」

タグに含めたリポジトリ名が、ECR上に実際に作成したリポジトリ名と一字一句一致しているか、レジストリURIのアカウントID・リージョンが正しいかを見直しましょう。

08 — Checklist

完了チェック

要件の再確認ではなく、画面・ターミナルのどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。

  • ターミナルで Login Succeeded と表示されている。
  • docker push の実行ログが、エラーなく完了している。
  • ECRコンソールのリポジトリの「イメージ」タブに、付けたタグ名のイメージが表示されている。
  • イメージの詳細を開くと、プッシュした日時とサイズが表示されている。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. このリポジトリに、自分以外の誰か(別のIAMユーザーやAWSアカウント)からアクセスできるようにするには、何を設定する必要があるでしょうか。
    ヒント
    IAMユーザー自体への許可と、リポジトリそのものに対する許可(リポジトリポリシー)の、2つのレベルがあることを思い出してみましょう。
  2. 「Image tag immutability」を「イミュータブル」に設定していた場合、同じタグ名で再度プッシュしようとするとどうなるでしょうか。
    ヒント
    「上書きを防ぐ」という設定の意味を踏まえると、同じ名前の荷物を同じ場所にもう一度送ろうとしたら何が起きるか、考えてみましょう。
  3. ECRに保管したこのイメージを、実際にコンテナとして動かす(起動し続ける)には、次にどのようなAWSのサービスが必要になりそうでしょうか。
    ヒント
    ECRは「保管場所」であり、起動・実行を担当する場所ではありません。コンテナを動かし続ける役割を持つサービスが別に必要になります(このハンズオンでは扱っていない発展的な内容です)。
10 — Clean up

後片づけ

課金につながるリソースを残さないよう、以下を確認してください。

  1. プッシュしたイメージを削除する:ECRコンソールでリポジトリを開き、不要なイメージタグを選択して削除します。
  2. リポジトリを削除する:今後使わない場合は、リポジトリ自体を削除します(中のイメージも合わせて削除されます)。
  3. 付与したIAM権限を見直す:このハンズオン専用にポリシーを付与した場合は、不要であればデタッチします。
  4. ローカルイメージ・コンテナを削除する:本編で使ったローカルのイメージ・コンテナが残っていれば、docker rmidocker rm で削除します。

コストに関する注意: Amazon ECRは、保管しているイメージの容量(GBあたり)と、レジストリからのデータ転送量に応じて課金されます。AWS KMSによる暗号化を選択した場合は、その利用分も別途課金対象になります。新規アカウントには無料利用枠が用意されている場合がありますが、内容は変更される可能性があるため、最新の条件はAmazon ECRの料金ページで確認してください。不要なイメージ・リポジトリは、後片づけの手順に沿って削除しておきましょう。