AWS ECS Fargate ALBを設定する


初めに

以下を参考に Fargate で ALB を設定する手順を確認しました。

Docker イメージを作成する

この章は以下のドキュメントを参考にしています。

Node.js をインストールします。

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install node

package.json ファイルを作成します。

package.json
{
  "name": "docker_web_app",
  "version": "1.0.0",
  "description": "Node.js on Docker",
  "author": "First Last <[email protected]>",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.16.1"
  }
}

パッケージをインストールします。

npm install

service.js を作成します。

service.js
'use strict';

const express = require('express');

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

// App
const app = express();
app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

動作確認をします。

node server.js

Dockerfile を作成します。

Dockerfile
FROM node:12

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 8080
CMD [ "node", "server.js" ]

.dockerignore ファイルを作成します。

.dockerignore
node_modules
npm-debug.log

ビルドしてこのイメージを ECR にプッシュします。

docker build . -t test-user/node-web

Fargate の設定

クラスターを作成する

サービスで ECS を選択し、「クラスターの作成」をクリックします。

「ネットワーキングのみ」を選択します。

「クラスター名」を入力し、「作成」をクリックします。

タスク定義を作成する

左のナビゲーションペインから「タスク定義」を選択します。

「新しいタスク定義の作成」をクリックします。

「Fargate」を選択します。

タスク定義名を入力します。タスクロールは「なし」を選択します。

初めてタスク定義を作成する場合はタスクの実行ロールは「新しいロールの作成」、2 回目以降であれば「ecsTaskExecutionRole」などのタスク実行ロールを選択します。

タスクサイズを選択します。メモリは「0.5 GB」、vCPU は「0.25 vCPU」を選択します。

「コンテナの追加」をクリックします。

コンテナ名を入力し、イメージの入力部分に使用する ECR リポジトリの URI を貼り付けます。ポートはアプリケーションがリッスンするポート番号を入力します。その後、右下の「追加」をクリックします。

コンテナの追加完了後、下までスクロールし「作成」をクリックします。

ALB を作成する

サービスで EC2 を選択し、左のナビゲーションペインから「ロードバランサー」をクリックします。その後「ロードバランサーの作成」をクリックします。

Application Load Balancer の「作成」をクリックします。

名前を入力し、スキームは「インターネット向け」を選択します。ロードバランサーのプロトコルは、今回は Fargate に ALB の設定をすることが目的なので HTTP を選択します。

アベイラビリティゾーンを選択します。

セキュリティ設定の構成では、先ほどの設定で HTTPS が選択されていないので、以下のメッセージが表示されます。「次の手順」をクリックします。

なお、HTTPS を選択している場合、ここで以下のようにサーバー証明書を選択します。

セキュリティポリシーは「ELBSecurityPolicy-2016-08」が推奨されています。

互換性のために ELBSecurityPolicy-2016-08 ポリシーをお勧めします。

セキュリティグループを選択します。

ターゲットグループを作成します。以下のドキュメントの注意に従ってターゲットの種類は IP を選択します。

重要

サービスのタスク定義で、awsvpc ネットワークモード (起動タイプが Fargate の場合に必要) が使用されている場合は、instance ではなく、ip をターゲットタイプとして選択する必要があります。これは、awsvpc ネットワークモードを使用するタスクは、Amazon EC2 インスタンスではなく、Elastic Network Interface に関連付けられているためです。

「次の手順」をクリックします。

何も設定せずに「次の手順」をクリックします。

確認画面で設定を確認し、「作成」をクリックします。

サービスを作成する

作成したクラスターを選択し、以下の「作成」をクリックします。

サービスの設定は以下のように行います。

デプロイメントは「ローリングアップデート」を選択し、「次のステップ」をクリックします。

VPC 、サブネット、セキュリティグループを選択します。パブリック IP の自動割り当ては「ENABLED」を選択します。パブリック IP の自動割り当てを「DISABLED」にすると、以下のエラーでイメージをプルできませんでした。

ResourceInitializationError: unable to pull secrets or registry auth: pull command failed: : signal: killed

今回はパブリックサブネットでタスクを実行するので、以下に記述があるようにアウトバウンドネットワークのためにパブリック IP が必要です。

パブリックサブネットで Fargate 起動タイプを使用してタスクを実行している場合は、タスクを起動する際、自動割り当てパブリック IP に [ENABLED] を選択します。これにより、イメージを取得するためのアウトバウンドネットワークアクセスをタスクに付与できます。

なお、パブリック IP を使用しない場合は、エンドポイントを使用することでプルが可能になります。詳細は以下のドキュメントに記載されています。

「Application Load Balancer」を選択し、先ほど作成した ALB を選択します。

「ロードバランサーに追加」をクリックします。

作成したターゲットグループ名を選択します。その後、下までスクロールし「次のステップ」をクリックします。

「次のステップ」をクリックします。次の確認画面では「サービスの作成」をクリックします。

タスクのステータスが RUNNING に変わったら、以下の ALB の DNS 名をブラウザの URL 部分に張り付けます。

以下のように表示されていることを確認します。

以下のようにロードバランサーのターゲットグループに実行タスクが追加されていることが確認できます。

参考記事