1. ホーム
  2. 記事一覧
  3. CICDパイプラインでECSを使用したアプリケーションのデプロイ

2024.05.13

CICDパイプラインでECSを使用したアプリケーションのデプロイ

はじめに

記事の概要と前回の振り返り

前回の記事では、AWSのCodeCommitとCodePipelineを使用して、CICDパイプラインの構築を行いました。今回は、このパイプラインを拡張し、ECSを使用してアプリケーションをデプロイするデプロイステージの設定と動作確認を行います。

前回の記事はこちらを参照してください。

https://envader.plus/article/376

ECRの作成

ECR(Elastic Container Registry)は、コンテナイメージを安全に保存し、ECSなどのサービスで利用するためのリポジトリを提供します。アプリケーションのデプロイに必要なコンテナイメージを効率的に管理できます。

ECRリポジトリの作成手順

  1. AWS Management Consoleにログイン

  2. ECRコンソール(プライベートリポジトリ)に移動

  3. リポジトリの作成

    • 「リポジトリを作成」をクリック
    • リポジトリ名を入力(例: my-sample-repo
    • リポジトリの設定(プライベートまたはパブリック)を選択
    • 「リポジトリを作成」をクリック
  4. リポジトリURIの確認

    • 作成したリポジトリのURI(例: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-sample-repo)をメモしておきます。

Dockerfileの作成

Dockerfileは、アプリケーションの環境をコンテナ内で再現するための設定ファイルです。これを作成することにより、一貫性のある環境構築と容易なデプロイが可能になります。

Dockerfileの追加手順

  1. Dockerfileの内容

    Dockerfileをリポジトリのルートディレクトリに作成し、以下の内容を追加します。

    # ベースイメージ
    FROM node:20
    
    # アプリケーションディレクトリを作成
    WORKDIR /usr/src/app
    
    # パッケージをインストール
    COPY package*.json ./
    RUN npm install
    
    # アプリケーションのソースコードをバンドル
    COPY . .
    
    # アプリケーションをビルド
    RUN npm run build
    
    # アプリケーションを公開
    EXPOSE 3000
    CMD [ "node", "index.js" ]
  2. ファイルをステージング

    git add Dockerfile
  3. コミットメッセージを作成

    git commit -m "Add Dockerfile for ECS deployment"
  4. リポジトリにプッシュ

    git push origin master

Dockerイメージのビルドとプッシュ

  1. ECRにログイン

    aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
  2. Dockerイメージのビルド

    docker build -t my-sample-app .
  3. Dockerイメージにタグを付ける

    docker tag my-sample-app:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-sample-repo:latest
  4. DockerイメージをECRにプッシュ

    docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-sample-repo:latest

ECS クラスターとタスク定義の設定

ECSクラスターとタスク定義は、アプリケーションのコンテナを実行する環境を構築し、管理するために必要です。スケーラブルで管理しやすいアプリケーションデプロイが可能になります。

ECSクラスターの作成手順

  1. AWS Management Consoleにログイン
  2. ECSコンソールに移動
  3. クラスターの作成
    • 「クラスターの作成」をクリック
    • インフラストラクチャの項目で、「AWS Fargate(サーバーレス)」を選択して次へ
    • クラスター名を入力(例: MySampleCluster
    • 他はデフォルト設定のまま「作成」をクリック

タスク定義の設定と作成方法

  1. タスク定義の作成

    • 「タスク定義」をクリックし、「新しいタスク定義の作成」を選択
    • タスク定義ファミリーを入力(例: MySampleTask
    • インフラストラクチャの要件で「AWS Fargate」を選択します。
  2. タスク定義の設定

    • コンテナの詳細
      • 名前: MySampleContainer
      • イメージ: <your-docker-image-url>(例: amazon/amazon-ecs-sample
      • メモリのハード制限(MiB): 512
      • ポートマッピング: ホストポート 80, コンテナポート 80
    • 「追加」をクリックしてコンテナを追加
    • 「作成」をクリックしてタスク定義を保存

imagedefinitions.jsonの作成

imagedefinitions.json は、CodePipelineのデプロイステージでECSにデプロイする際に必要なコンテナイメージの情報を定義するファイルです。これにより、CodePipelineがどのコンテナイメージを使用するかを認識できます。

imagedefinitions.json の内容

ルートディレクトリ配下にimagedefinitions.json ファイルを作成し、以下の内容を追加します。

[
  {
    "name": "MySampleContainer",
    "imageUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-sample-repo:latest"
  }
]

ファイルの追加手順

  1. imagedefinitions.json を作成

    • リポジトリのルートディレクトリに imagedefinitions.json ファイルを作成し、上記の内容を貼り付けます。
  2. ファイルをステージング

    git add imagedefinitions.json
  3. コミットメッセージを作成

    git commit -m "Add imagedefinitions.json for ECS deployment"
  4. リポジトリにプッシュ

    git push origin master

ロードバランサーの設定

ロードバランサーは、複数のコンテナインスタンス間でトラフィックを効率的に分散させる役割を果たします。これにより、アプリケーションの高可用性とスケーラビリティを確保できます。特に、トラフィックの急増に対応する際に、ロードバランサーが各インスタンスに均等に負荷を分散することで、システム全体の安定性とパフォーマンスが向上します。ECSと組み合わせることで、動的なスケーリングにも対応可能です。

ALBの作成と設定方法

  1. AWS Management Consoleにログイン

  2. EC2コンソールに移動

  3. ロードバランサーの作成

    • 左メニューから「ロードバランサー」をクリックし、「ロードバランサーの作成」を選択
    • 「Application Load Balancer」を選択して「作成」をクリック
  4. 基本設定

    • 名前を入力(例: MySampleALB
    • スキーム: インターネット向け
  5. ネットワーク設定

    • VPCを選択
    • サブネットを選択(2つ以上)
  6. セキュリティグループ設定

    • 新しいセキュリティグループを作成または既存のものを使用
    • インバウンドルールでHTTP(ポート80)を許可
  7. リスナーとルーティング設定

    • ターゲットグループの作成から作成
    • ターゲットグループ名: MySampleTG
    • ターゲットの種類: IP
    • ポート: 80
    • 「ターゲットグループの作成」をクリック
  8. 確認して作成

    • 設定を確認して「ロードバランサーの作成」をクリック

CodePipelineでのデプロイ設定

デプロイ設定は、アプリケーションをECSに自動的にデプロイするために必要です。前回の記事で作成したCICDパイプラインにデプロイステージを追加することで、ソースコードの変更がECSに反映される一連の自動化プロセスを完成させます。

デプロイステージの追加方法

  1. CodePipelineコンソールに移動

  2. パイプラインの編集

    • 「MySamplePipeline」を選択し、「編集」をクリック
  3. デプロイステージの追加

    • 編集から「ステージの追加」をクリック
    • ステージ名を入力(例: Deploy
  4. アクションの追加

    • 「アクショングループを追加する」をクリック
    • アクション名: DeployToECS
    • アクションプロバイダー: Amazon ECS
    • クラスター名: MySampleCluster
    • サービス名: MySampleService
    • イメージの定義ファイル名: imagedefinitions.json(リポジトリに配置したファイル)
    • 「保存」をクリックしてアクションを追加
  5. パイプラインの保存と実行

    • 設定を確認して「保存」をクリック
    • パイプラインが自動的に開始されるのを確認

動作確認

パイプラインの実行と動作確認

  1. パイプラインの手動実行方法

    • 「パイプラインを開始」をクリックして手動でパイプラインを実行
    • 各ステージ(ソース、ビルド、デプロイ)の進行状況を確認
  2. ECSでのアプリケーション確認

    • ALBのDNS名にアクセスし、デプロイされたアプリケーションが正常に動作していることを確認

まとめ

今回の記事では、前回構築したCICDパイプラインを拡張し、ECSを使用してアプリケーションのデプロイを行いました。具体的には、以下の内容をカバーしました。

  1. ECRの作成

    コンテナイメージのホスティングリポジトリの設定

  2. Dockerfileの作成

    アプリケーションのコンテナイメージ作成

  3. ECSクラスターとタスク定義の設定

    アプリケーションのデプロイ先を設定

  4. ロードバランサーの設定

    トラフィックの分散と高可用性の確保

  5. CodePipelineでのデプロイ設定

    デプロイステージの追加と設定

  6. 動作確認

    パイプラインの実行とアプリケーションの確認

この記事を通じて、CodeCommit、CodePipeline、CodeBuild、およびECSを活用したCICDパイプラインの構築方法について理解を深めていただけたと思います。このハンズオンを元に、さらに複雑なアプリケーションやワークフローにも対応できるよう、実践的なスキルを磨いていってください。

参考リンク

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事

2020.02.25

完全未経験からエンジニアを目指す爆速勉強法

USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

  • キャリア・学習法
  • エンジニア

2024.04.30

Koa.jsの解説と導入ハンズオン Express.jsの後継フレームワーク

Koa.jsはその軽量性とモダンなJavaScriptの特性を活用する設計により、Web開発者に高いパフォーマンスと優れたエラー処理能力を提供し、注目を集めています。Express.jsの開発者により作られ、最小構成で柔軟性に富むオープンソースのNode.js用Webフレームワークです。

  • Node.js
  • ハンズオン
  • フレームワーク

2024.04.06

初心者向け FastAPIとSQLiteでユーザー管理アプリを作成するハンズオン

バックエンドエンジニアを目指すなら、API開発ができることは必須要件といえます。今回のハンズオンでは、FastAPIとSQLiteデータベースを使って簡単なウェブアプリケーションを作成し、Pythonによる現代的なウェブ開発の基本を学びます。

  • バックエンド
  • エンジニア
  • ハンズオン

2023.05.26

【実践】TerraformのinstallからAWS EC2の作成〜ssh接続までを実践してみた

Terraformとは、インフラストラクチャを管理するためのオープンソースのツールです。こちらの記事では、Terraformを使用してAWSのEC2を作成し、ssh接続するまでの流れをご紹介します。

  • AWS