🧙‍♂️

[AWS-ECR編]コンテナイメージをAWS上に保管する方法を学ぼう

に公開

はじめに

前回私たちはローカルでflaskアプリをコンテナ化してみました。
https://zenn.dev/ai_tech/articles/12b86caa66629d
次はそれをクラウド上で動かそうというのが目的です。
そのために、AWS の以下3つのサービスを用います。

  • ECR:コンテナイメージの倉庫
  • ECS:コンテナを管理・運用する仕組み
  • Fargate:サーバーレスでコンテナを動かす実行環境

内容がてんこもりになります。。

そのため次回を[ECS on Fargate編]として今回はECRを学びましょう。

読者も一緒に手を動かして学べるように意識して書きました。

ECRを動かしながら学んでみよう

最初にECR君はコンテナイメージの倉庫という役割ができるみたいですね。
クラウド上にアプリのイメージを保管できる便利なサービスということです。

最初にAWSコンソール上でElastic Container Registryを検索してみましょう。

そうしましたら以下の画面が表示されると思います。

分かりやすく作成ボタンが表示されていますね。

ECRでリポジトリを作成する

今の段階だとここでのリポジトリとは何かよく分かりませんが、とりあえず作成してみましょう。

次に以下の画面になるのでプライベートリポジトリを作成してみます。
GitHubにソースコードを上げるあのリポジトリの作成のイメージで..作成してみます。

リポジトリの名前を入れてあとはデフォルトのままで作成してみました。

そうすると、、リポジトリが出来ました!

リポジトリにイメージをPushしてみよう

しかし、リポジトリ名をクリックしてもイメージがありませんね。
GitHubで言えばリポジトリだけ作成してソースコードを何もPushしていない状況と同じみたいです。

そこで、右上の「プッシュコマンドを表示」を押下します。

そうすると以下のようにコマンドが表示されるはずです。

よーしこれをPowershellとかで実行してみよう
としてもエラーが起きてしまいました😇

原因:'Get-ECRLoginCommand' は認識されません

調べてみるとこのコマンドは古いようなので、AWS CLIを用いた方法で行きます。

では気を取り直してAWS CLIで一つずつコマンドを試していきましょう。

AWS CLIを用いてリポジトリにイメージをPushしてみよう

  1. DockerがAWS ECRにログインできるようにする
aws ecr get-login-password --region <リージョン名> \
| docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.<リージョン名>.amazonaws.com

そうすると以下のようにログイン成功の表示がされました。
これはローカルのDockerがECRに接続できるようにしています。

これで以降の docker push や docker pull が認証済みで動作します。

  1. Dockerイメージをビルドする
    次のECRから提示されている以下のコマンドはDockerfileを使ってビルドしてイメージを作成するコマンドです。しかし、これは前回すでに行いましたので今回はスキップします。
docker build -t flask-docker-app .
  1. ECR にアップロードするための「宛先ラベル」をつける
docker tag flask-docker-app:latest <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/flask-docker-app:latest

これはDocker側からECRにPushするためにどこにPushするべきかの宛先を教えてあげています。

  1. ECRにイメージを送信する
    そして最後にこのタグを利用して、ローカルにあるイメージをECRにプッシュしてみます!
docker push <アカウントID>.dkr.ecr.<リージョン名>.amazonaws.com/<リポジトリ名>:<タグ>

ECRで送信されたイメージを確認してみよう

Pushまで終われば以下のようにイメージが追加されたことが分かると思います。
しかし、なんで三つあるんですかね。。🫠

それは調べてみて分かりましたが
同じイメージの中身をAWSが3つの部品に分けて保存しているからです。

このように分けて保存することでイメージを「複数の機械(アーキテクチャ)」で動かせるように自動で分けて登録する工夫がされているためでした。

表示される項目 役割 なぜあるか
latest (Image Index) マニフェスト(全体の目次) Dockerが自動で作る
Image (54MB) 実際の中身(本物) アプリ本体
Image (0MB) 別アーキテクチャ用の空枠 Docker Desktopが自動で追加した

そのため今回使うのは一番上のImage Indexのみです。
本体はそこから内部的に参照されて使われるようです。

ECRイメージ内
 ├─ latest(メニュー表) ← 使うのは一番上のコレ
 │     ├─ Image①(本物のイメージ:54MB)
 │     └─ Image②(空のイメージ:0MB)

まとめ

いかがでしたでしょうか。
これでローカルのイメージをクラウド上に送信して保管することまでできました。

次回はこいつを動かしていきます。

Discussion