【AWS】Amazon ECR ~ 入門編 ~

■ はじめに

CodeBuild で、カスタム Docker ビルドイメージを
使用する必要ができたのだが、
その際に、Amazon ECR が必要らしいので、勉強する。

なお、Amazon EMRではない。
(似通ったサービス名が、増えてややっこしいんだよなー)

https://dk521123.hatenablog.com/entry/2020/02/20/230519

追記:CodeBuild でカスタムイメージを使う

以下の関連記事を参照のこと

CodeBuild で カスタムDockerイメージを使ってビルドする
https://dk521123.hatenablog.com/entry/2020/05/23/080655

Amazon ECR (Elastic Container Registry)

* Dockerコンテナイメージを保存しておくためのレジストリサービス
(AWS版Docker Hub的な?)

公式サイト

ユーザズガイドは以下。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/ecr-ug.pdf

料金

無料枠もあるので、Docker Hubと比べてもお安い

公式サイト:料金
https://aws.amazon.com/jp/ecr/pricing/
比較対象:Docker Hubの料金
https://hub.docker.com/pricing

■ 使い方

【1】リポジトリ作成 (初回のみ)
【2】環境構築を行う
【3】Dockerファイルを作成する
【4】ECRにDockerイメージを登録する

【1】リポジトリ作成

AWS-CLIでもできるらしいが、今回は、
AWSマネージメントコンソールから作成

⇒ ちなみに「ECR」って検索すると、
 候補の一番上は「Secrets Manager」がくる。
 「Elastic Container Registry」を選ぶ。
⇒ 今回は、リポジトリ名を「hello-world-ecr」とする

【2】環境構築を行う

EC2(今回は、Amazon Linux2) を立ち上げて以下を行う

2-1)EC2 の RoleにECRを実行できる権限を付与
2-2)aws-cli を最新にする(※1)
2-3)docker のインストール
2-4)docker を sudo なしで実行できるように設定する

※1
デフォルトEC2だと「aws ecr get-login-password」がなかったので

2-1)EC2 の Role にECRを実行できる権限を付与

今回は、「AmazonEC2ContainerRegistryFullAccess」を付与。

権限付与を行わないと、以下のサイトのように
ECRのGetAuthorizationToken操作権限がないっと怒られる。

https://blogenist.jp/2018/03/22/3048/

2-2)aws-cli を最新にする

# 古いとコマンドが対応していなくてエラーになったので。
# aws-cli 1.16.300, Python2.7.16 => aws-cli 1.18.65, Python3.7.6

sudo yum install python3 -y
sudo pip3 install awscli --upgrade
/usr/local/bin/aws --version

https://dev.classmethod.jp/articles/latest-version-awscli-al2/

2-3)docker のインストール

sudo yum install -y docker
sudo service docker start
sudo service docker status

2-4)docker を sudo なしで実行できるように設定する
https://qiita.com/DQNEO/items/da5df074c48b012152ee

# 自分のユーザを調べる(今回は「ssm-user」)
whoami

sudo gpasswd -a ssm-user docker
sudo service docker restart
exit
# 再度、入りなおす(これ、必要!)

【3】Dockerファイルを作成する

vi Dockerfile
# 修正内容は以下の通り。

Dockerfile

# 今回は、CentOS7/Python3.6を入れる
FROM centos:centos7

# Install dependencies
RUN yum -y update
RUN yum -y install \
            git \
            zlib \
            tk-devel \
            tcl-devel \
            ncurses-devel \
            gdbm-devel \
            db4-devel \
            readline-devel \
            zlib-devel \
            bzip2-devel \
            sqlite-devel \
            openssl-devel \
            libXext.x86_64 \
            libSM.x86_64 \
            libXrender.x86_64 \
            gcc \
            gcc-c++ \
            libffi-devel \
            python-devel \
            patch \
            bzip2 \
            jq \
            make

ENV ROOT_PATH /root
ENV PY_VERSION 3.6.10

# Download Python3.6.10
WORKDIR $ROOT_PATH
RUN curl -O https://www.python.org/ftp/python/$PY_VERSION/Python-$PY_VERSION.tgz
RUN tar xzvf Python-$PY_VERSION.tgz

# Install Python3.6.10
WORKDIR $ROOT_PATH/Python-$PY_VERSION
RUN ./configure --with-threads
RUN make install

# Install pip
WORKDIR $ROOT_PATH
RUN curl -O https://bootstrap.pypa.io/get-pip.py
RUN python get-pip.py

WORKDIR /root
CMD ["/bin/bash"]

【4】ECRにDockerイメージを登録する

結構、他のサイトだとごちゃごちゃ書いているが、
非常に簡単にできた。

4-0)AWSマネージメントコンソールからpush commandsを参照する

1)AWSマネージメントコンソール「Elastic Container Registry」で
  作成したリポジトリを選択。
2)右側にある「View push commands」ボタンを押下。
3)使用しているOSのタブを選択
  (今回はEC2「Amazon Linux」なので「maxIS / Linux」)
 ⇒ ECRにDockerイメージを登録するまでの
  手順(4Step)・コマンドがのっているので、
  その通りに行うだけ。

4-1)ECRにログインする

# AWSマネージメントコンソールの手順 1(Retrieve an authentication taken...)
# のコマンドをコピーして、DockerファイルのあるOS上で実行

# docker login [オプション] [サーバ]
# (--username:ユーザ名、--password-stdin:標準出力からパスワードを設定)
/usr/local/bin/aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin xxxx.xxx.ecr.us-west-2.amazonaws.com

4-2)作成したDockerfileをビルドする

# AWSマネージメントコンソールの手順 2(Build your Docker image...)
# のコマンドをコピーして、DockerファイルのあるOS上で実行

# 新しいイメージを作成する
# docker build -t [【1】で作成したリポジトリ名]
docker build -t hello-world-ecr

4-3)タグづけする

# AWSマネージメントコンソールの手順 3(After the build completes,...)
# のコマンドをコピーして、DockerファイルのあるOS上で実行

# docker tag [イメージID] [リポジトリ名]:[タグ]
docker tag hello-world-ecr:latest xxxx.xxx.ecr.us-west-2.amazonaws.com/hello-world-ecr:latest

4-4)ECRにプッシュする

# AWSマネージメントコンソールの手順 4(Run the following command...)
# のコマンドをコピーして、DockerファイルのあるOS上で実行

# docker push [コンテナ名]
docker push xxxx.xxx.ecr.us-west-2.amazonaws.com/hello-world-ecr:latest

4-5)動作確認

AWSマネージメントコンソール「Elastic Container Registry」を再読み込みし、
対象のリポジトリ名の配下に作成したイメージがあればOK!

参考文献

https://qiita.com/3utama/items/b19e2239edb6996a735f
http://blog.serverworks.co.jp/tech/2020/01/23/ecr/
https://yenjoji.github.io/pages/2016/07/26/20160725-ecr-101/
https://blog.websandbag.com/entry/2019/06/04/231201
https://qiita.com/aokad/items/17a06c2384041bd60d16
Dockerイメージの登録
https://qiita.com/Esfahan/items/2ddc8d481afd012da357
https://qiita.com/KJN/items/ad4aeb01c39bb5909de4
https://dev.classmethod.jp/articles/push-docker-image-to-ecr-with-cli/

関連記事

Amazon ECR ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/05/26/142645
Amazon ECR でのトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/05/24/000000
CodeBuild で カスタムDockerイメージを使ってビルドする
https://dk521123.hatenablog.com/entry/2020/05/23/080655
Docker ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2020/04/24/160044
Docker ~ Linux / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2018/04/10/234030
Docker ~ 基本編 / Dockerfile ~
https://dk521123.hatenablog.com/entry/2020/04/14/000000
Docker ~ 基本編 / dockerコマンド ~
https://dk521123.hatenablog.com/entry/2020/04/13/000000