はじめる前に
- 必須ローカルでDockerイメージをビルド・実行した経験(
docker build・docker run) - 必須AWS CLIがインストールされ、ログイン済みのIAMユーザーで認証情報が設定されていること
- 必須ターミナル(コマンドライン)操作の基本
- あると良いIAMのポリシー・許可の仕組みについてのイメージ
※ このハンズオンはAWSのリソース(Amazon ECR)を使用します。コンソール操作とターミナル操作の両方を行います。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
ローカルでビルドしたコンテナイメージは、今のところ自分のパソコンの中にしか存在しません。このままでは、別のパソコンで同じイメージを動かしたいときも、AWS上のコンテナサービスでイメージを動かしたいときも、毎回ローカルで作り直すしかありません。
そこで使うのがAmazon ECR(Elastic Container Registry)です。Dockerイメージを保管できるAWSのプライベートなレジストリで、一度プッシュ(送信)しておけば、権限を持つ人やサービスがいつでも同じイメージをプル(取得)できるようになります。今回は、ローカルにあるイメージをECRのリポジトリにプッシュし、保管されたことを確認するところまでを行います。
「レジストリ」と「リポジトリ」って何が違うの?
レジストリはAWSアカウントごとに1つ用意される、イメージ保管庫全体の入れ物です。リポジトリは、その中にある個別の保管場所(フォルダのようなもの)で、用途やアプリケーションごとに分けて作成します。
docker loginは何をしているの?
ECRのレジストリに対して、Dockerクライアントが「プッシュ・プルする権限を持っている」と証明するための認証です。発行される認証トークンは12時間だけ有効なので、時間が空くと再度ログインが必要になります。
Amazon ECRにプライベートリポジトリを作成し、ローカルのDockerイメージにタグを付けてプッシュする。AWSマネジメントコンソール上で、プッシュしたイメージが保管されていることを確認する。
送り込む流れ
「認証する」→「タグを付ける」→「送り込む」→「確認する」という流れを体験します。
要件
以下の要件を満たし、ローカルのイメージをECRに送り込むところまでを体験してください。
| No | 要件 |
|---|---|
| 1 | 使用するIAMユーザーに、Amazon ECRを操作できる権限(例:AmazonEC2ContainerRegistryFullAccess)が付与されている。 |
| 2 | Amazon ECRに、任意の名前でプライベートリポジトリを1つ作成する(例:my-first-repo)。 |
| 3 | ローカルにビルド済みのDockerイメージを用意し、aws ecr get-login-password を使ってDockerクライアントをECRに対して認証する。 |
| 4 | ローカルイメージに、作成したリポジトリのURIを含むタグを付けて docker push する。 |
| 5 | AWSマネジメントコンソールのECRリポジトリ画面で、プッシュしたイメージが一覧に表示されていることを確認する。 |
構築の進め方
「権限を整える」→「リポジトリを作る」→「認証してタグ付けする」→「プッシュして確認する」という順番で進めます。
- フェーズ1 — 権限を整える
-
IAMユーザーにECRの操作権限を付与する
使用するIAMユーザーに、AWS管理ポリシー
AmazonEC2ContainerRegistryFullAccessをアタッチします。すでに同等の権限を持っている場合はこの手順は不要です。なぜこの権限が必要かECRへの認証トークン取得(
ecr:GetAuthorizationToken)や、イメージのプッシュ・プルには、それぞれ個別のIAM許可が必要です。このポリシーには、ハンズオンで使う一連の操作がまとめて含まれています。 - フェーズ2 — リポジトリを作る
-
Amazon ECRコンソールでプライベートリポジトリを作成する
ECRコンソールを開き、「プライベートリポジトリ」を選択して「リポジトリの作成」を進めます。リポジトリ名は自由に決められます(例:
my-first-repo)。英字で始まり、小文字・数字・ハイフンなどのみを含む名前にします。「Image tag immutability(イメージタグのミュータビリティ)」は、迷う場合は「ミュータブル」のままで進めて構いません。タグの上書きを許可するか禁止するかの設定です。暗号化設定はデフォルト(AES-256)のままで問題ありません。
- フェーズ3 — 認証してタグ付けする
-
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.comLogin Succeededと表示されれば認証は成功です。 -
ローカルイメージに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/リポジトリ名:任意のタグ」という形式になります。リポジトリ名の部分は、作成したリポジトリ名と完全に一致させる必要があります。
- フェーズ4 — プッシュして確認する
-
docker pushでイメージを送り込む
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-first-repo:1.0
転送の進捗が表示され、完了するとプッシュされたイメージのダイジェスト(識別子)が表示されます。
-
コンソールで保管されたイメージを確認する
ECRコンソールで作成したリポジトリを開き、「イメージ」タブに、付けたタグ名のイメージが表示されていることを確認します。
これがゴール自分のパソコンの中にしかなかったイメージが、AWS上の保管場所に存在している——この状態を確認できたら、このハンズオンの目的は達成です。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直すか」の手がかりとして使ってください。
「docker loginを実行すると、認証エラーや拒否のメッセージが出る」
コマンド内のAWSアカウントIDやリージョンが実際の値と一致しているか、また使用しているIAMユーザーにECRの操作権限が付与されているかを見直しましょう。
「docker pushを実行すると、denied(拒否)と表示される」
タグに含めたリポジトリ名が、ECR上に実際に作成したリポジトリ名と一字一句一致しているか、レジストリURIのアカウントID・リージョンが正しいかを見直しましょう。
完了チェック
要件の再確認ではなく、画面・ターミナルのどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。
- ターミナルで
Login Succeededと表示されている。 docker pushの実行ログが、エラーなく完了している。- ECRコンソールのリポジトリの「イメージ」タブに、付けたタグ名のイメージが表示されている。
- イメージの詳細を開くと、プッシュした日時とサイズが表示されている。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- このリポジトリに、自分以外の誰か(別のIAMユーザーやAWSアカウント)からアクセスできるようにするには、何を設定する必要があるでしょうか。
ヒント
IAMユーザー自体への許可と、リポジトリそのものに対する許可(リポジトリポリシー)の、2つのレベルがあることを思い出してみましょう。 - 「Image tag immutability」を「イミュータブル」に設定していた場合、同じタグ名で再度プッシュしようとするとどうなるでしょうか。
ヒント
「上書きを防ぐ」という設定の意味を踏まえると、同じ名前の荷物を同じ場所にもう一度送ろうとしたら何が起きるか、考えてみましょう。 - ECRに保管したこのイメージを、実際にコンテナとして動かす(起動し続ける)には、次にどのようなAWSのサービスが必要になりそうでしょうか。
ヒント
ECRは「保管場所」であり、起動・実行を担当する場所ではありません。コンテナを動かし続ける役割を持つサービスが別に必要になります(このハンズオンでは扱っていない発展的な内容です)。
後片づけ
課金につながるリソースを残さないよう、以下を確認してください。
- プッシュしたイメージを削除する:ECRコンソールでリポジトリを開き、不要なイメージタグを選択して削除します。
- リポジトリを削除する:今後使わない場合は、リポジトリ自体を削除します(中のイメージも合わせて削除されます)。
- 付与したIAM権限を見直す:このハンズオン専用にポリシーを付与した場合は、不要であればデタッチします。
- ローカルイメージ・コンテナを削除する:本編で使ったローカルのイメージ・コンテナが残っていれば、
docker rmi・docker rmで削除します。
コストに関する注意: Amazon ECRは、保管しているイメージの容量(GBあたり)と、レジストリからのデータ転送量に応じて課金されます。AWS KMSによる暗号化を選択した場合は、その利用分も別途課金対象になります。新規アカウントには無料利用枠が用意されている場合がありますが、内容は変更される可能性があるため、最新の条件はAmazon ECRの料金ページで確認してください。不要なイメージ・リポジトリは、後片づけの手順に沿って削除しておきましょう。