1. ホーム
  2. 記事一覧
  3. ECSで実現するコンテナデプロイメント AWS DOP試験対策にも

2024.04.26

ECSで実現するコンテナデプロイメント AWS DOP試験対策にも

この記事の目的

AWS DOP試験合格を目指す方や、ECSによるCICDに興味のある方へ。このハンズオン記事では、CodePipelineとECSを活用したコンテナデプロイメントを実際に実践することで、試験対策と技術習得を同時に実現します。

CICDはこちらの記事で解説しています。

https://envader.plus/article/44

ECS (Elastic Container Service) の基本概念

Amazon ECS (Elastic Container Service) は、AWSが提供するマネージドコンテナオーケストレーションサービスです。このサービスは、Dockerコンテナを使用してアプリケーションを容易にデプロイ、管理、スケールするための強力なツールを提供します。ECSを使用することで、開発者はインフラストラクチャの管理にかかる時間を大幅に削減し、アプリケーションの運用に集中できます。ECSは、高度にスケーラブルで、マイクロサービスアーキテクチャのサポート、タスクの自動配置、ロードバランシングといった特徴を備えています。

AWS CodePipeline の基本概念

AWS CodePipelineは、継続的インテグレーションおよび継続的デリバリー (CI/CD) サービスであり、コードのリリースプロセスを自動化するためのツールです。このサービスを利用することで、コードのビルド、テスト、デプロイの各段階を一連の自動化されたステップとして定義し、実行することができます。CodePipelineは、変更がコードリポジトリにプッシュされるたびに自動的にビルドおよびデプロイプロセスをトリガーし、迅速かつ一貫したアプリケーション更新を可能にします。

ハンズオンの目的

このハンズオンの目的は、ECSとAWS CodePipelineを使用して、シンプルなアプリケーションをクラウド環境にデプロイする方法を実践的に学ぶことにあります。このプロセスを通じて、参加者は実際のワークフローにおけるCI/CDの基本的な理解と、コンテナ技術を活用したアプリケーションデプロイメントの実際の経験を深めることができます。

初めての人に向けたCICDハンズオンはこちらです。

https://envader.plus/article/354

AWS DOP試験での重要性

AWS Certified DevOps Engineer – Professional (DOP) 試験は、AWSのプラットフォームで分散アプリケーションをプロビジョニング、運用、管理する能力を評価する試験です。この試験では、CI/CDのプロセス、コンテナ技術、監視、セキュリティ、コンプライアンスなど、幅広い知識が要求されます。今回のハンズオンは、特にCI/CDとコンテナオーケストレーションの実践的な理解を深めることで、DOP試験の準備に直接的に寄与することを目的としています。

AWS DOP試験について詳しくはこちらの記事をご参照ください。

https://envader.plus/article/353

環境の準備

AWSのマネージドサービスを用いて、効率的に開発とデプロイメント環境を構築します。このセクションでは、AWSアカウントの初期設定から、ECSクラスターとCodePipelineの設定までを説明します。

AWSアカウントの設定方法

AWSアカウントが未作成の場合、下記AWS公式サイトに詳しく説明があるので作成してください。

https://aws.amazon.com/jp/register-flow/

ECSクラスターの設定

Amazon ECSを使用してコンテナ化されたアプリケーションをデプロイするためのクラスターを設定します。

  1. AWSマネジメントコンソールにログインし、「サービス」から「Elastic Container Service」を選択。
  2. 「クラスターの作成」をクリック。
  3. クラスター名を入力します(例: MyFargateCluster)。
  4. 追加の設定は不要で、「作成」をクリックします。Fargateでは、EC2インスタンスの管理が不要なため、VPCやサブネットの設定はタスク定義とサービス設定時に指定します。

タスク定義の設定

Fargateを使用する場合、「新しいタスク定義」を作成する際には、追加の設定が必要です。

  • 「Fargate」を起動タイプとして選択します。
  • タスクサイズとして、タスクに割り当てるCPUとメモリの量を指定します。
  • ネットワークモードは「awsvpc」を選択します。これにより、タスクは独自のENI(Elastic Network Interface)を持ち、VPC内のリソースと通信できます。※デフォルトで選択されています。
  • セキュリティグループとサブネットをタスク定義に指定し、タスクが配置されるネットワーク環境をコントロールします。

サービスの設定

サービスを作成する際にもFargateを使用することでいくつかの設定が異なります。

  • サービスタイプとして「Fargate」を選択します。
  • デプロイメントタイプ、希望するタスクの数、デプロイメント設定(ヘルスチェックなど)を指定します。
  • ロードバランサーの設定(必要な場合)を追加し、適切なリスナーとターゲットグループを設定します。

Fargateを使用することで、インフラストラクチャの管理が減少し、開発者はアプリケーションのコードとデプロイメントに集中できるようになります。

アプリケーションのビルドとデプロイ

ここでは、GitHubにリポジトリを設定し、ソースコードからDockerイメージをビルドしてECRにプッシュする流れ、さらにビルドとテストの自動化、最終的にCodePipelineを使用したデプロイの全過程を説明します。

GitHubにリポジトリを設定

  1. GitHubにアクセスし、新しいリポジトリを作成します。
  2. リポジトリ名を適切に設定(例: ecs-deploy-sample)。
  3. ローカルマシンで作業ディレクトリを開き、次のコマンドでGitHubリポジトリをクローンします。
    git clone https://github.com/your-username/ecs-deploy-sample.git
  4. server.jsファイルをリポジトリに追加し、コミット後にプッシュします:
    git add .
    git commit -m "Initial commit"
    git push origin master

server.jsの内容

const express = require('express');
const app = express();
const port = 3000;

// ルートへのGETリクエストに対するハンドラ
app.get('/', (req, res) => {
  res.send('Hello World!');
});

// サーバーを指定したポートで起動
app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

ソースコードからDockerイメージをビルドし、ECRにプッシュ

  1. AWSマネジメントコンソールでECRリポジトリを作成し、リポジトリ名を設定(例: ecs-deploy-sample-repo)。
  2. Dockerfileをプロジェクトのルートディレクトリに作成します。以下にサンプルを示します:
    FROM node:14
    WORKDIR /usr/src/app
    COPY package*.json ./
    RUN npm install
    COPY . .
    EXPOSE 3000
    CMD ["node", "server.js"]
  3. ローカル環境でDockerイメージをビルドし、タグ付けしてECRにプッシュします:
    aws ecr get-login-password --region <your-region> | docker login --username AWS --password-stdin <your-aws-account-id>.dkr.ecr.<your-region>.amazonaws.com
    docker build -t ecs-deploy-sample .
    docker tag ecs-deploy-sample:latest <your-aws-account-id>.dkr.ecr.<your-region>.amazonaws.com/ecs-deploy-sample-repo:latest
    docker push <your-aws-account-id>.dkr.ecr.<your-region>.amazonaws.com/ecs-deploy-sample-repo:latest

ビルドとテストの自動化手順

  1. AWS CodeBuildを使用してビルドとテストプロセスを自動化します。
  2. CodeBuildプロジェクトを作成し、以下のbuildspec.ymlをプロジェクトのルートに配置します:
     version: 0.2
     phases:
     install:
         commands:
         - echo Installing source NPM dependencies...
         - npm install
     build:
         commands:
         - echo Build started on `date`
         - npm test
     post_build:
         commands:
         - echo Build completed on `date`
         - echo Pushing the Docker image...
         - aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <your-aws-account-id>.dkr.ecr.ap-northeast-1.amazonaws.com
         - docker build -t ecs-deploy-sample .
         - docker tag ecs-deploy-sample:latest <your-aws-account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/ecs-deploy-sample-repo:latest
         - docker push <your-aws-account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/ecs-deploy-sample-repo:latest
  3. CodeBuildは、GitHubリポジトリの変更を検出するたびにビルドとテストを実行します。

CodePipelineを使用したデプロイプロセスの設定と実行

  1. AWS CodePipelineを設定し、ソースステージとしてGitHub、ビルドステージとしてAWS CodeBuild、デプロイステージとしてAWS ECSを指定します。
  2. パイプラインがソースの変更を検出すると、自動的にビルド、テスト、そしてデプロイのプロセスが開始されます。

以上のステップにより、ソースコードの変更が即座にビルド、テストされ、問題がなければ自動的にDockerイメージがECRにプッシュされ、さらにECSにデプロイされます。このフローは、開発サイクルを速めるだけでなく、エラーの早期発見と修正を助け、全体的なアプリケーションの品質を向上させます。

CodePipelineの詳細設定

パイプラインを設定する際の具体的な手順は以下の通りです:

  1. AWS マネジメントコンソールにログインし、CodePipeline サービスを選択します。
  2. 「パイプラインの作成」をクリックし、パイプライン名(例: MyAppPipeline)を入力します。
  3. 新しいサービスロールのオプションを選択して「新しいロールの作成」をクリックし、必要な権限が自動的に付与されたロールが作成されるようにします。
  4. ソースプロバイダーとして「GitHub」を選択し、接続を設定した後、対象のリポジトリとブランチを指定します。
  5. 次にビルドステージで「AWS CodeBuild」を選択し、以前に作成したビルドプロジェクトを指定します。
  6. デプロイプロバイダーとして「Amazon ECS」を選択し、デプロイするECSサービスの名前とイメージ定義ファイル名を指定します。
  7. 最後に「パイプラインの作成」をクリックして、パイプラインを完成させます。

このパイプライン設定により、GitHubの特定のブランチにプッシュされたコードが自動的にビルドされ、テストされ、問題がなければプロダクション環境にデプロイされます。これによって、デプロイメントプロセスが大幅に簡素化され、より迅速かつ安全にアプリケーションの更新を行うことが可能になります。

タスク定義とECSサービスの設定(Fargate使用)

タスク定義の作成

  1. AWSマネジメントコンソールにログインし、「Elastic Container Service」を選択します。
  2. 「タスク定義」タブを選択し、「新しいタスク定義の作成」をクリックします。
  3. 実行タイプとして「Fargate」を選択します。
  4. タスク定義名を入力します(例: MyFargateTask)。
  5. タスクサイズの設定: タスクメモリとタスクCPUを指定します。
  6. コンテナ定義の追加: DockerイメージのURI、ポートマッピング、環境変数、ログ設定を含めます。
  7. 「作成」ボタンをクリックしてタスク定義を保存します。

ECSサービスの設定

  1. ECSコンソールに戻り、「クラスター」を選択し、作成したクラスターをクリックします。
  2. 「サービス」タブで「サービスの作成」を選択します。
  3. 起動タイプに「Fargate」を選びます。
  4. タスク定義を選択し、サービス名を設定します。
  5. デプロイメントタイプとして「レプリカ」を選択し、タスクの数を指定します。
  6. ネットワーキングの設定: クラスターVPC、サブネットを選択し、セキュリティグループを設定します。
  7. 「サービスの作成」をクリックして設定を完了します。

デプロイの監視と検証

※ここからは応用的なオプションとなります。 デプロイしたアプリケーションのパフォーマンスを効果的に監視し、潜在的な問題を早期に発見することは、安定した運用環境の維持に不可欠です。AWSのECSとCloudWatchを使用することで、デプロイメントの状態をリアルタイムで監視し、必要なメトリクスとログを収集することができます。

ECSとCloudWatchを使用した監視

  1. CloudWatch Logsの設定

    ECSタスク定義にログ設定を追加して、コンテナからのログをCloudWatch Logsに送信するようにします。この設定は、タスク定義の一部としてlogConfigurationセクションに追加します。

    "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
            "awslogs-group": "/ecs/your-application-name",
            "awslogs-region": "your-region",
            "awslogs-stream-prefix": "ecs"
        }
    }

    上記の設定により、タスクで発生したすべての標準出力と標準エラーがCloudWatch Logsに転送されます。

  2. CloudWatch Alarmsの設定

    CloudWatchを使用して、ECSサービスのメトリクスに基づいてアラームを設定します。例えば、CPU使用率やメモリ使用率が閾値を超えた場合に通知を受けるように設定できます。 アラームを設定することで、リソースの異常使用を早期に検出し、問題の解決を迅速に行うことができます。

  3. CloudWatch Metricsでのリソース監視

    ECSとCloudWatchは統合されており、コンテナとクラスターのパフォーマンスを監視するための多くのメトリクスを提供しています。 ダッシュボードをカスタマイズして、重要なメトリクスを一目で把握できるようにします。

アプリケーションの動作確認とログの分析

  1. 動作確認

    アプリケーションがデプロイされた後、正常に動作しているかを確認するために、エンドポイントに対してヘルスチェックや動作テストを行います。 HTTPリクエストを送信して、予期したレスポンスが返ってくるかを検証します。

  2. ログの分析

    CloudWatch Logsに送信されたログを利用して、アプリケーションの動作状況を詳細に分析します。 エラーメッセージや警告、その他のログ出力を調査して、アプリケーションの問題点を特定し、必要に応じて修正を行います。

デプロイの監視と検証を行うことで、アプリケーションの健全性を保ち、ユーザーに対して一貫したサービス品質を提供することが可能となります。また、問題が発生した場合には、迅速に対応することでダウンタイムを最小限に抑えることができます。

この記事で学んだこと

この記事を通じて、AWSのECSとCodePipelineを活用して、アプリケーションのビルドからデプロイ、監視までの一連のプロセスを学びました。この知識は、AWS Certified DevOps Engineer – Professional (DOP) 試験の準備に役立つだけでなく、実際の業務でのクラウドインフラの管理と運用のスキルを向上させるのにも非常に有効です。

重要なポイントの再確認

  1. ECSのセットアップと管理

    クラスターの設定からサービスとタスクの定義まで、ECSを利用したコンテナ管理の基本を把握しました。

  2. CI/CDの実装

    CodePipelineを用いた自動化されたビルド、テスト、デプロイメントプロセスの構築方法を学びました。

  3. 監視とログ管理

    ECSとCloudWatchを組み合わせて、アプリケーションのパフォーマンスと健全性を監視する技術を習得しました。

参考資料

これらの技術をさらに深く理解するために、AWSの公式ドキュメントやリソースを活用することが重要です。以下のリンクから公式のガイドやベストプラクティスを参照し、スキルを研鑽し続けてください。

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

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

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

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

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

関連記事