Help us understand the problem. What is going on with this article?

Amazon ECSでALBとFargate使ってNginxのコンテナを動かしてみる

Amazon ECSについて

Amazon ECS(Amazon Elastic Container Service)とはDockerコンテナを実行させるためのサービスです。

ECSでのコンテナの動かし方には2種類あり、EC2上で動かすものと、Fargateと呼ばれるインスタンスを抽象化してコンテナのみ扱うものがあります。

今回はFargateを使用する方のECSの設定を行っていきます。

Dockerイメージの準備

まずはnginxのイメージを元にしたDockerのイメージを作成します。

Dockerfile作成

FROM nginx:latest

COPY index.html /usr/share/nginx/html

EXPOSE 80
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>INDEX</h1>
</body>
</html>

Dokerイメージをビルドします。

docker build -t nginx-test .

Amazon ECRへpush

リポジトリからpullする必要がありますのでDocker用のリポジトリが必要となります。
幸いAWSにはAmazon ECRというリポジトリサービスがありますのでこちらを使用します。

aws ecr get-login --no-include-email --region ap-northeast-1
-> 出力されたコマンドを実行する
docker tag nginx-test:latest xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:1
docker push xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:1

ECSの設定

作業の流れとしては

  1. タスク定義作成
  2. クラスター作成
  3. ALB作成
  4. サービス作成

となります。

タスク定義

ECSのタスク定義を開きます。

Screen Shot 2019-11-28 at 15.51.30.png

新しいタスク定義の作成をクリックし、起動タイプをFargateにします。

Screen Shot 2019-11-28 at 15.51.46.png

タスク定義とコンテナの設定

タスク定義名を設定します。

Screen Shot 2019-12-06 at 17.53.21.png

タスクの実行ロール IAMロール

タスク実行ロールは初めてだと自動的に作成されます。

Screen Shot 2019-12-04 at 15.25.24.png

タスクサイズ

タスクサイズですが、特定の組み合わせでしか設定できません。組み合わせについてはこちらにあります。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-cpu-memory-error.html
今回はミニマムのメモリ 0.5GB / CPU 0.25 vCPU で設定します。

Screen Shot 2019-12-06 at 17.54.51.png

コンテナの定義

コンテナの設定をします。

コンテナの追加をクリックして、コンテナのリポジトリやタグを設定します。

Screen Shot 2019-12-06 at 17.55.42.png

コンテナの追加

イメージは先程pushしたECRのリポジトリとタグを記載します。

ポートマッピング部分にはリッスンさせるportを設定します。

Screen Shot 2019-11-28 at 15.57.22.png

その他はそのままで作成します。

Screen Shot 2019-12-06 at 17.58.04.png

クラスター

クラスターの作成をクリックします。

Screen Shot 2019-11-28 at 16.44.20.png

クラスターテンプレートの選択

Fargateの場合はネットワーキングのみを選択します。

Screen Shot 2019-11-28 at 16.44.31.png

クラスターの設定

クラスター名をいれて完了です。

Screen Shot 2019-11-28 at 16.46.29.png

ALB作成

ロードバランサーの作成をクリックします。

Screen Shot 2019-11-28 at 16.48.36.png

ロードバランサーの種類の選択

種類からALBを選びます。

Screen Shot 2019-11-28 at 16.48.43.png

ロードバランサーの設定

ロードバランサーの設定です。

リスナーは一旦80だけにします。

設置するアベイラビリティーゾーンを選択します(今回はデフォルトのVPCを使用します)。

Screen Shot 2019-11-28 at 16.59.11.png

セキュリティグループの設定

セキュリティグループを設定します。

80に対して0.0.0.0からアクセスできるような設定のものにします。

Screen Shot 2019-12-06 at 19.21.27.png

ルーティングの設定

ルーティングの設定です。

ターゲットグループは新しいターゲットグループに、ターゲットの種類をIPにしてポートを80とします。

Screen Shot 2019-12-06 at 18.10.47.png

ターゲットの登録

ターゲットの登録はここでは行わないのでそのまま確認に進みます(登録はECSで行います)。

Screen Shot 2019-11-28 at 17.03.53.png

確認し、作成します。

サービスの作成

ECSの画面からサービスの作成をクリックします。

Screen Shot 2019-11-28 at 16.47.00.png

サービスの設定

サービスの設定でタスク定義を先程作成したものにします。

起動タイプはFargate、タスクの数がコンテナの数になります。

Screen Shot 2019-12-06 at 14.26.05.png

デプロイメントはローリングアップデートにします。

そして次のステップに進みます。

Screen Shot 2019-12-06 at 14.28.56.png

VPCとセキュリティグループ

ネットワークの設定です。
 
サブネットには設置するサブネットを設定します(今回はデフォルトのVPC使います)。

セキュリティグループは新規作成されるものをそのまま使用します。

Screen Shot 2019-12-06 at 14.30.44.png

Load balancing

ヘルスチェックの猶予期間を飛ばして、Load balancingの項目に進みます。

ロードバランサーの種類をALBにしてロードバランサー名のボックスから先程作成したALBを選択します。

Screen Shot 2019-12-06 at 14.33.28.png

ロードバランス用のコンテナ

ロードバランス用のコンテナでロードバランサーへ追加ボタンをクリックします。

Screen Shot 2019-12-06 at 14.34.39.png

ターゲットグループ名に先程作成したターゲットグループを指定します。

Screen Shot 2019-12-06 at 14.38.33.png

サービス検出はそのままで問題ありません。

オートスケーリングの設定は今回なしにします。

Screen Shot 2019-11-28 at 18.25.09.png

しばらく待つとタスクにコンテナが作成されます。

Screen Shot 2019-12-06 at 14.52.24.png

ALBのDNSにアクセスすると、index.htmlの内容が表示されます。

Screen Shot 2019-12-06 at 17.43.42.png

コンテナの更新

コンテナの更新方法ですが

  1. タスク定義の更新(新しいリビジョンの作成)
  2. サービスを更新(タスク定義のリビジョンを上げて更新)

となります。

docker更新

まずは、index.htmlの内容を書き換えます。

index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>Hello</h1>
</body>
</html> 

ビルドして、ECRにpushします。

docker build -t nginx-test .
docker tag nginx-test:latest xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:2
docker push xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:2

タスク定義の更新

タスク定義の一覧からnginx-test-taskを選択し、新しいリビジョンを作成をクリックします。

Screen Shot 2019-12-06 at 18.31.46.png

コンテナの定義から設定してあるコンテナを選択し、更新画面にいきます。

コンテナの編集

イメージのタグを1から2に変更し、更新をクリックします。

Screen Shot 2019-12-06 at 18.34.06.png

作成すると、タスク定義の新しいリビジョンが作成されます。

Screen Shot 2019-12-06 at 18.36.06.png

クラスターのサービス一覧からnginx-test-serviceを選択し、更新ボタンをクリックします。

Screen Shot 2019-12-06 at 18.38.05.png

リビジョンを1から2に変更してサービスを更新します。

Screen Shot 2019-12-06 at 18.38.55.png

すると、リビジョン2のタスクが作成されていきます。

Screen Shot 2019-12-06 at 18.40.06.png

RUNNINGになるとALBからアクセス可能になります。

Screen Shot 2019-12-06 at 18.40.53.png

ALBにアクセスしてみると、index.htmlが書き換わって表示されました。

Screen Shot 2019-12-06 at 18.31.02.png

リビジョン:1のタスクたちはしばらく時間が立つと自動で停止されます。

おわりに

以上でECSのFargateの基本的な使い方の説明は終わりです。

ECS固有の名称が多く初めてだと分かりづらいかと思いますが一度流れをつかめば理解しやすいと思います。

実際の運用時はコンテナの配置をprivateなVPCにしたりデプロイメントをCodePipelineつかったりAuto Scalingを有効にしたりとかでしょうか。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away