はじめに
最初にこの場をお借りして、感謝申し上げます。「AWSのECS環境を構築してみる」「AWS ECSで自動デプロイを組んでみる」の記事を大変参考にさせていただきました。心よりお礼申し上げます。
本記事では、これらの記事をベースにしながら、初心者としてつまずいた点、疑問に思った点などを織り交ぜて記述します。
長くなりましたので二つに分割しました 1-ECS環境構築(本記事)、2-自動デプロイ設定
CI/CD環境は GitHubリポジトリ → GitHub接続 → AWS CodePipelineで構築しました。
ECS環境の構築
前提条件
Amazon EC2インスタンスの起動 Amazon Linux 2023
以下、Session Manager を使用して 接続したEC2をローカル環境としています。
EC2にアタッチするIAMロール
・AmazonSSMManagedInstanceCore
・AmazonEC2ContainerServiceforEC2Role
:ECSタスクの実行やコンテナ操作、CloudWatch Logs へのログ送信のため
・AmazonEC2ContainerRegistryFullAccess:DockerでECRにプッシュするため
・ALB、ECS以外は構築済
AWSコンソール:コンテナリポジトリ(ECR)を作成する
まず、コンテナイメージを格納するための ECR を作成します。
Elastic Container Serviceリポジトリ
を開くプライベートリポジトリ>リポジトリを作成
- リポジトリ名に任意の名前(例:
test-repo
)を設定 作成
- リポジトリ名に任意の名前(例:
ローカル(SSH接続したEC2上)で Docker 環境を作る
Dockerをインストールする
sudo yum update -y
sudo yum install -y docker
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker
sudo
なしでdockerコマンドを実行できるようにdockerグループに追加します。
sudo usermod -a -G docker $USER
$USER
の部分はユーザー名を入れてください。今回は ssm-user
セッションを再起動するか、再ログインします。
(dockerグループに追加されたか確認)
groups
ローカル環境にソースコードと Docker ファイルを用意する
次のようなフォルダ構成で作成します。
.
├ src
│ └ index.html
└ Dockerfile
HTML ページを用意する
<h1>Hello World!</h1>
Dockerfile を作成する
FROM amazonlinux:2023
RUN yum update -y && \
yum install -y httpd && \
yum clean all
COPY src /var/www/html/
VOLUME /var/www/html
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80
Docker イメージを構築する
docker build -t test-repo .
- -t オプションは、作成するDockerイメージにタグを付けるために使用します。ここでは、イメージ名を test-repo として指定しています。タグは通常、イメージのバージョンや特性を示すために使われますが、ここでは単に test-repo という名前が付けられます。
- ドット (.) は、Dockerfileの場所を指定します。ここでは、カレントディレクトリにあるDockerfileを使用してビルドすることを意味します。カレントディレクトリに Dockerfile が存在し、その中にビルドに必要な指示が含まれている必要があります。
(作成されたイメージを確認)
docker images
リポジトリにイメージをプッシュできるようタグをつける
docker tag test-repo:latest <aws_account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest
test-repo:latest
: これはローカルに存在するイメージで、test-repo
という名前にlatest
というタグが付いています。.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest
: これはECRにプッシュするための新しいタグで、AWSアカウントID、リージョン、リポジトリ名が含まれています。このタグによって、イメージがどのリポジトリに属するのかが指定されます。
タグの目的
- 異なるリポジトリの指定:
test-repo
というタグはローカルに存在するイメージの名前ですが、ECRなどのリモートリポジトリにプッシュするためには、そのリポジトリに適した形式のタグが必要です。AWSのECRでは、リポジトリのURLとイメージの名前を含むタグを使います。 - バージョン管理: Dockerイメージには、特定のバージョンやビルドを識別するためのタグ(例えば
latest
,v1.0
,dev
,prod
など)を付けることができます。これにより、異なるバージョンを簡単に管理できます。
ECR にログインする
PC 環境から AWS CLI を用いて、以下のコマンドを実行し docker で ECR にログインします。(docker コマンド側が AWS ECR に対して、ログイン状態になります。)
aws ecr get-login-password | docker login --username AWS --password-stdin https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com
プッシュを実行する
docker push <aws_account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest
ECR にプッシュされたことを確認する
AWS コンソールから対象のリポジトリを選択し、イメージがプッシュされたことを確認します。
ECS クラスターを作成する
- AWS コンソールで、ECS>クラスター>クラスターの作成
- クラスター名を任意の名前で設定(例:testcluster01)
- インフラストラクチャでAWS Fargateを選択
- 作成ボタンを押す。しばらく待つと完了
- クラスターの表示を押す。
クラスターは裏で AWS CloudFormationが動いて作成されるようです。
タスク定義を設定する
- AWS コンソールで、
ECS>タスク定義>新しいタスクの作成
- タスクとコンテナ定義の設定を行う。
タスク定義名
:任意の名前を設定(例:testtask01
)インフラストラクチャの要件
:起動タイプAWS Fargate
を選択- OS: Linux/X86_64
タスクサイズ
:テストですので一番小さいものを選択。CPU:.25 vCPU メモリ: .5GB Fargate はこのCPUとメモリのサイズに応じて課金される。- 条件付きのタスクロール:今回はなし
タスク実行ロール
:新しいロールの作成 コンテナ-1
コンテナ名
:任意のコンテナ名を設定(例:container01
)イメージ
:ECR のリポジトリの URL を設定(例:aws_accout_id.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest
ポートマッピング
:今回は、80
を設定。ログ収集
:チェックを入れることで CloudWatchLogs に自動出力できる作成
ECSサービスの作成
- AWS コンソールで、
ECS>クラスター>クラスターを選択>サービス
環境
:デフォルトのままデプロイ設定
アプリケーションタイプ
:サービスファミリー
:先ほど作成したタスクを選択(例:testtask01
)リビジョン
:最新になっていることを確認サービス名
:任意のサービス名を設定します。(例:test-service-01
)必要なタスク
:1ネットワーキング
:該当のVPC等を設定します。セキュリティグループはインバウンドルールにポート80と443を許可し、ALBからのトラフィックを許可します。パブリックIPはオフ
ロードバランシング
:ロードバランサーを作成
-セキュリティグループは新たに作成
80番ポートですべての通信0.0.0.0/0を許可
作成したセキュリティグループのみを紐づけ
-ターゲットグループは新たに作成
プロトコル:HTTP作成
タスクが成功しているのか確認する
ALBのDNS名を使用してWebアプリケーションにアクセス。例:ブラウザでhttp://にアクセスし、Hello World!
が正常に表示されるかを確認。