概要
AWS ECR
AWS(Amazon Web Services)のAmazon ECS(Elastic Container Service)とAmazon ECR(Elastic Container Registry)は、コンテナの管理とデプロイを効率化するためのサービスです。今回はECRについて取り扱います。
Amazon ECRは、Dockerコンテナイメージを格納、管理、配信するためのフルマネージドなコンテナレジストリです。ECRは、ECSやEKSなどのコンテナオーケストレーションサービスやCode BuildやCodeDeployなどのCI/CDサービスとも連携しており、AWSでDevOpsを実現する際には欠かせないサービスと言えます。ECRはプライベートリポジトリに対するアクセス制御を行うことでイメージのセキュリティを確保したり、脆弱性を検出するイメージスキャン機能もありセキュリティ対策を強化できます。AWSでコンテナを扱う場合はECSと並んで利用される機能だと思います。
タグ管理
コンテナイメージのタグ管理は、効率的で安全なイメージ運用を実現する上で非常に重要です。タグ管理が適切でないと、開発や運用の混乱を引き起こす可能性があります。例えばCI/CDのパイプラインを実行する上で、どのコンテナを利用してビルドやデプロイするかはとても大事です。もし間違ったバージョンでデプロイされてしまうとアプリケーションが先祖返りしてしまう可能性があります。
上記のようなリスクを減らすために現場ではdev
, stg
, prod
などデプロイ先環境を表すタグを用いてコンテナのバージョン管理をします。さらにprod
のコンテナイメージについては固定タグ (Immutable Tags)を利用して意図しない変更が入らないように制御することがあります。一方でdev
は開発のために可変タグ (Mutable Tags)を利用します。
ECRの基礎
前提
EC2(Amazon Linux 2023、SSH接続可能、AWS CLIインストール済、ポート80開放済)
各種ファイルの準備
まず始めにEC2で下記のようなフォルダを作成します。
[ec2-user@ip-xxx-xxx-xxx-xxx ecs]$ tree
.
├── Dockerfile
└── src
└── index.html
Dockerfileではubuntuのイメージ取得とapacheのインストールと起動を行う処理を記述します。
FROM ubuntu:18.04
RUN apt-get update && \
apt-get -y install apache2
# ファイルのコピー
COPY src/ /var/www/html/
# apacheの設定をrun_apache.shに記述
RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \
echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \
chmod 755 /root/run_apache.sh
EXPOSE 80
# シェルスクリプトの実行
CMD /root/run_apache.sh
index.htmlファイルはapacheの起動をブラウザで確認するために作成します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>apacheで起動</h1>
</body>
</html>
続いて動作確認のためにEC2のローカルにコンテナイメージを作成し起動します。まずはDockerファイルと同じ階層にて下記のコマンドを実行します。続いてブラウザでlocalhostと入力してアクセスすれば下図のようにindex.htmlに入力した文字列がブラウザに表示されているのが確認できます。
docker build -t apache-usr .
docker run -d -p 80:80 --name local-apache apache-usr
ECRでプライベートリポジトリ作成
マネジメントコンソールからECRを検索し、リポジトリの作成をクリックします。下記の一般設定にて任意のリポジトリ名を入力し作成ボタンを押下てください。またイメージタグのミュータビリティはそのままで大丈夫です。
するとECRのトップ画面にapahce-usrが表示されますのでURIのクリップボードアイコンでURIをコピーして下さい。
ECR作成とイメージ登録
。次にECR用にコンテナイメージをビルドして上記で作成したリポジトリにプッシュしていきます。まずはECRにログインします。ちなみにxxxxxxxxxxxxで示されているのはAWSのアカウントIDとなります。その後、ECR用にイメージをビルド&プッシュすれば完了です。もし手元に必要な場合はプルすることで簡単にイメージをダウンロードできます。
# ECRログイン
aws ecr get-login-password | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
# ECR用イメージのビルド
docker build -t xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/apache-usr:latest .
# ECR用イメージをプッシュ
docker push xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/apache-usr
# ECR用イメージをプル
docker pull xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/apache-usr:latest
ちなみにビルドのコマンドを実装する際は最後の.
は必須になります。これは現在の階層のDockerfileを指定する意味になりますが、これがない場合は下記のエラーが発生しますのでご注意ください。
[ec2-user@ip-172-31-38-158 ecs]$ docker build -t xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/apache-usr:latest
ERROR: "docker buildx build" requires exactly 1 argument.
See 'docker buildx build --help'.
Usage: docker buildx build [OPTIONS] PATH | URL | -
まとめ
本記事ではECRについて扱いました。ECRで大事なのは操作よりもいかに安全にコンテナイメージの運用ができるかだと思います。タグ管理を適切に行うことで環境毎に適切なコンテナイメージを利用するようにしてくださいね!