サイトアイコン 協栄情報ブログ

【GitHub+AWS ECS】CI/CDパイプラインを使ったECSの自動デプロイ(ローリングアップデート)をやってみた -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 を作成します。

  1. Elastic Container Serviceリポジトリを開く
  2. プライベートリポジトリ>リポジトリを作成
    1. リポジトリ名に任意の名前(例:test-repo)を設定
    2. 作成
       

ローカル(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 .

(作成されたイメージを確認)

docker images

リポジトリにイメージをプッシュできるようタグをつける

docker tag test-repo:latest <aws_account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest

タグの目的

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 クラスターを作成する

  1. AWS コンソールで、ECS>クラスター>クラスターの作成
  2. クラスター名を任意の名前で設定(例:testcluster01)
  3. インフラストラクチャでAWS Fargateを選択
  4. 作成ボタンを押す。しばらく待つと完了
  5. クラスターの表示を押す。

クラスターは裏で AWS CloudFormationが動いて作成されるようです。

タスク定義を設定する

  1. AWS コンソールで、ECS>タスク定義>新しいタスクの作成
  2. タスクとコンテナ定義の設定を行う。
    1. タスク定義名:任意の名前を設定(例:testtask01)
    2. インフラストラクチャの要件 :起動タイプ AWS Fargate を選択
    3. OS: Linux/X86_64
    4. タスクサイズ :テストですので一番小さいものを選択。CPU:.25 vCPU メモリ: .5GB Fargate はこのCPUとメモリのサイズに応じて課金される。
    5. 条件付きのタスクロール:今回はなし                                                                タスク実行ロール :新しいロールの作成
    6. コンテナ-1
      1. コンテナ名:任意のコンテナ名を設定(例:container01
      2. イメージ:ECR のリポジトリの URL を設定(例:aws_accout_id.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest
    7. ポートマッピング:今回は、80を設定。
    8. ログ収集:チェックを入れることで CloudWatchLogs に自動出力できる
    9. 作成

ECSサービスの作成

  1. AWS コンソールで、ECS>クラスター>クラスターを選択>サービス
  2. 環境 :デフォルトのまま
  3. デプロイ設定
    1. アプリケーションタイプ:サービス
    2. ファミリー:先ほど作成したタスクを選択(例:testtask01
    3. リビジョン:最新になっていることを確認
    4. サービス名:任意のサービス名を設定します。(例:test-service-01)
    5. 必要なタスク:1
    6. ネットワーキング:該当のVPC等を設定します。セキュリティグループはインバウンドルールにポート80と443を許可し、ALBからのトラフィックを許可します。パブリックIPはオフ
  4. ロードバランシング :ロードバランサーを作成
    -セキュリティグループは新たに作成
    80番ポートですべての通信0.0.0.0/0を許可
    作成したセキュリティグループのみを紐づけ
    -ターゲットグループは新たに作成
    プロトコル:HTTP
  5. 作成

タスクが成功しているのか確認する

ALBのDNS名を使用してWebアプリケーションにアクセス。例:ブラウザでhttp://にアクセスし、Hello World!が正常に表示されるかを確認。

モバイルバージョンを終了