この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
はじめに
最初にこの場をお借りして、感謝申し上げます。「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)を設定
- 作成
 
 
- リポジトリ名に任意の名前(例:
ローカル(SSM接続したEC2上)で Docker 環境を作る
Dockerをインストールする
sudo yum update -y
sudo yum install -y docker
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status dockersudo なしでdockerコマンドを実行できるようにdockerグループに追加します。
sudo usermod -a -G docker $USER$USER の部分はユーザー名を入れてください。今回は ssm-user
セッションを再起動するか、再ログインします。
(dockerグループに追加されたか確認)
groupsローカル環境にソースコードと Docker ファイルを用意する
次のようなフォルダ構成で作成します。
.
├ src
│ └ index.html
└ DockerfileHTML ページを用意する
<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:latestECR にプッシュされたことを確認する
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!が正常に表示されるかを確認。



