4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【AWS】ECSのクラスターの目的と作成の流れ

Posted at

AWSでDockerを扱うサービスである、ECS(Elastic Container Service)のクラスターの目的と作成方法について。

##目次

  1. ECSのクラスターとは?
  2. クラスターを使ったサービスの流れ
  3. クラスターの作成
  4. ECSのクラスターテンプレートの選択
  5. クラスターの設定
    5. クラスター名(必須)
    6. ネットワーキング(任意)
    7. Tags(任意)
    8. CloudWatch Container Insights(任意)
  6. サービスの作成
    10. サービスを作成するクラスターの選択
    11. 起動タイプの選択
    12. タスク定義
    13. サービス名
    14. サービスタイプとは?
    15. タスクの数
    16. 最小ヘルス率と最大率
    17. Blue/Greenデプロイタイプの場合
    18. Deployment circuit breaker
  7. デプロイメントの設定
    20. Blue/Green
    21. ローリングアップデート
    22. Deployment configuration
    23. CodeDeployのサービスロール
  8. ネットワーク構成
    24. VPCグループの設定
    26. ロードバランサーの設定
    27. ロードバランス用のコンテナを設定
    28. ヘルスチェックパスの設定
    29. 2つめのターゲットグループの作成
    30. Auto Scaling
  9. サービスの作成
  10. ELB(ロードバランサー)の修正
  11. ページの表示

##ECSのクラスターとは? AWSの説明では、タスクリクエストを実行できる1つ以上のコンテナインスタンスのリージョングループ。

実用例だと、一つのプロジェクトに対し、一つのクラスターを作り、中にサービスとして、ステージング環境や開発環境をいれる

各サービスの中にはタスクを作って、タスクの中で必要なコンテナを定義している。


**▼クラスター、サービス、タスク、コンテナの関係** ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/7ad69047-1527-7f65-42f7-543d1a6306f0.png)

ECSでクラスターを作成する場合は、単にクラスターを作成するだけでなく、サービスの作成、ロードバランサーの設定、デプロイ方法の指定も行う


##クラスターを使ったサービスの流れ 複数のサービスを一つのロードバランサーで切り分ける場合のAWSの設定方法について。

###・サービスの構造
クラスターはプロジェクトを管理しやすくするためのグループといった位置付け。

その中にproductionやstagingといったサービスを作成する。

実際のサービスの根幹となるコンテナはタスクの中に定義する。このタスクをサービスの上に乗っける。

###・ネットワーキングの構造
ユーザーがFQDN(sub.example.com)を入力すると、該当するエイリアスコードからホストドメインにつなげる。

ホストドメインにはロードバランサーが設定されており、渡されたFQDNに結び付けられたコンテナにトラフィックを送る。

コンテナはリクエストに応じて、DBなど必要な別のコンテナと連携してレスポンスを返す。

image.png


###クラスターの作成

##1. ECSのクラスターテンプレートの選択
どの仮想サーバーでコンテナを起動するか選択する。

image.png

タイプ 内容
ネットワーキングのみ Fargate起動タイプを使用してタスクを実行する
EC2 Linux + ネットワーク Linux コンテナを使用した EC2 起動タイプを使用してタスクのクラスターを起動する
EC2 Windows + ネットワーク EC2 起動タイプと Windows コンテナを使用してタスクのクラスターを起動する

Fargateは運用管理をAWSが行ってくれるメンテ・保守不要のサーバー(サーバーレス)

##2. クラスターの設定
サービスを起動するためのクラスターを作成する。クラスター自体の作成は超簡単。

###2-1. クラスター名(必須)
image.png

最大 255 文字の英字 (大文字と小文字)、数字、ハイフン、アンダースコアを使用できる。


###2-2. ネットワーキング(任意) クラスター用に新しいVPC(Virtual Private Cloudの略。 仮想プライベートクラウド)を作成する場合はチェックを入れる。
**▼作成する場合** クラスター専用のVPCを作成する場合は、CIDRブロック、サブネットを設定(デフォルトでも可)する。

image.png


###2-3. Tags(任意) クラスターの説明をKV(key-value)形式で記載できる。

クラスタ作成後にTagsタブから確認できる。

image.png


###2-4. CloudWatch Container Insights(任意) チェックマークを入れるとCloudWatchと連携して、CPUやメモリの使用状況のログが確認できるようになる。
**▼ECSクラスターのCloudWatch例**

image.png
image.png

###2-5. クラスターの作成
右下の「作成」ボタンをクリックしてクラスターを作成する。

以上でクラスターの作成は完了。


##3. サービスの作成 作成したクラスターの中にサービスを作成していく。

サービスを作成するにはECSのタスク定義で、コンテナの起動時の設定が完了している必要がある。

ECSでタスク定義する方法

###3-1. サービスを作成するクラスターの選択
作成したクラスターを選択する。

image.png

サービスタブの中で、左下の「作成」ボタンをクリックする。

###3-2. 起動タイプの選択
タスクを実行する仮想サーバ−の種類を選択する。選択しない場合はEC2がデフォルトとなる。

image.png

###3-3. タスク定義
ECSのタスク定義で作成した項目を選択する。

タスク定義を内容を変更して複数作った場合は、使用する番号(リビジョン)を選択する。

image.png

▼ECSのタスク定義

image.png


###3-4. サービス名 作成するサービスにつける名前を指定する。 クラスターを選択した時に、表示されるためわかりやすい名前にする。
image.png

↓ 表示例

image.png

▼Point
クラスターの名前でどのプロジェクトかは判定可能なため、サービスの名前は各サービスの環境の名前をつけるとわかりやすい。

・クラスター名: test-app
・サービス名1: production
・サービス名2: staging

###3-5. サービスタイプとは? **タスクが失敗したときの対応方法**を指定する。スケジュール戦略と呼ばれる。

サービスタイプ(スケジュール戦略)は①REPLICA戦略と②DAEMON戦略の2つがある。

Fagateを選択した場合は、REPLICA戦略のみとなる。(DAEMONはサポート外)

・REPLICA戦略
クラスター全体で必要数のタスクを配置して維持。

・DAEMON戦略
指定したすべてのタスク配置制約を満たすクラスター内のアクティブなコンテナインスタンスごとに、1 つのタスクのみをデプロイ。


###3-6. タスクの数 サービスタイプがレプリカの時のみ選択する。

上で指定したタスク定義で起動したインスタンス(コンテナ)のうち、クラスターで実行状態を保つ数を指定する。

起動するコンテナが1つのみの場合は1となる。複数のコンテナを起動し、起動状態を保ち続ける場合は、その数を記載する。

なお、デーモンの場合は、クラスターのコンテナインスタンス数に自動的に設定。


###3-7. 最小ヘルス率と最大率 ローリングアップデートのみ選択可能なオプション。

実行中のサービスをローリング更新するときに、サービスが維持するタスクの数を割合で指定する。

####最小ヘルス率とは?
RUNNING状態に保つ必要のあるサービスのタスクの下限数を%で指定したもの。

例えば必要なタスクが4つのサービスで、最小ヘルス率を50%とした場合、スケジューラーが新しいタスクを実行する時に、2つのタスクを停止して、クラスターの容量を開放する。

最小ヘルス率はデフォルトで100%。

####最大率
最大ヘルス率の略。RUNNINGまたはPENDING状態で使用できるサービスタスクの上限数を指定できる。

例えば必要なタスクが4つのサービスで、最大率が200%の場合、スケジューラは4つの古いタスクを停止する前に、4つの新しいタスクを開始することができる。

最大ヘルス率のデフォルト値は 200% です。

####Blue/Greenデプロイタイプの場合
実行中のサービスの更新がBlue/Green (CODE_DEPLOY) の場合は、最小ヘルス率・最大ヘルス率の値はデフォルト値に設定される。

最小ヘルス率: 100%
最大ヘルス率: 200%

つまり、本番環境のサービスを改修してローンチするときに、既存のタスクは停止せず起動したままの状態で、新しいサービスを起動する。

この方法であれば、新しいサービスに問題があった場合にすぐに古いサービスに戻すことができる。容量は使うが安全な更新。


###3-8. Deployment circuit breaker ローリングアップデートのみ選択可能なオプション。

サービスの更新に失敗した場合に、自動で昔の正常だったサービスに戻してくれる便利機能。

image.png

https://aws.amazon.com/jp/blogs/news/announcing-amazon-ecs-deployment-circuit-breaker-jp/

Blue/Greenの場合は自動的にRollbackしてくれるため設定不要

というか、ローリングアップデートの設定で、デフォルトの最小ヘルス率: 100%、最大ヘルス率: 200%、Deployment circuit breakerが有効でrollbackがオンになっているデプロイをBlue/Greenと呼ぶ。


##4. デプロイメントの設定 サービスを更新したときに、新しいサービスの起動方法を指定する。

image.png

###4-1. Blue/Green
ブルー・グリーンと呼ぶ。直近では主流のデプロイ方法。

サービスの更新を安全に行うために、既存のサーバーに手を加えるのではなく、既存のサーバーはそのまま維持しながら、新しいサーバーを起動するデプロイ方法。

新旧のサービスで状態を比較し、異常があればエラーとして報告してくれる。

また、新しいサービスが起動しない場合は、自動で旧のサービスに戻るため、サービスが落ちる心配がない。

Blueが古いサービス、Greenが新しいサービスを指している。

###4-2. ローリングアップデート
実行中のタスクを順々に停止して、順々に新しいサービスに切り替えていくデプロイ方法。

Blue/Greenよりも簡易的でスピーディな更新方法。

ただし、どれかのタスク更新で失敗した場合、更新済みのタスクと更新エラーのタスクが混在することになり、元に戻すのに手間がかかる。(このため、現在のトレンドはBlue/Green)

Deployment circuit breakerなど、より安全にサービスを更新する仕組みが用意されている。

ローリングアップデートの設定で、デフォルトの最小ヘルス率: 100%、最大ヘルス率: 200%、Deployment circuit breakerが有効でrollbackがオンになっているデプロイがBlue/Green。


###4-3. Deployment configuration デプロイ中にCodePlayが使用する条件を選択する。

旧サービスにアクセスしているトラフィックの何%ずつを新しいサービスに移行させるかの、%と経過時間を指定できる。

image.png

設定 内容
CodeDeployDefault.ECSAllAtOnce すべてのトラフィックを、新しいコンテナに一度に移行。
CodeDeployDefault.ECSLinear10PercentEvery1Minutes すべてのトラフィックが移行されるまで、1分ごとに10%を移行
CodeDeployDefault.ECSLinear10PercentEvery3Minutes すべてのトラフィックが移行されるまで、3分ごとに10%を移行
CodeDeployDefault.ECSCanary10Percent5Minutes
最初にトラフィックの10%を移行。残りの90%は5分後にデプロイ
CodeDeployDefault.ECSCanary10Percent15Minutes 最初にトラフィックの10%を移行。残りの90%は15分後にデプロイ

基本的にはCodeDeployDefault.ECSAllAtOnceを選択。


###4-4. CodeDeployのサービスロール CodeDeployがBlue/Greenで自動更新する際に、ユーザーに変わってAWSに許可を与えるためのIAMロール。

CodeDeploy IAMロール(ecsCodeDeployRole)として設定する。

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/codedeploy_IAM_role.html


##5. ネットワーク構成 ###5-1. VPCグループの設定 タスク定義のネットワークグループがAWS VPCの場合に設定可能。

タスク定義のプラットフォームにFagateを選択している場合は、AWS VPCのため設定できる。

image.png

・クラスターVPC
タスクやサービスのサブネットとセキュリティグループを表すオブジェクト。

・サブネット
タスクやサービスに関連づけるサブネットワーク。

image.png

・セキュリティグループ
タスクやサービスに関連づけるセキュリティグループ。

デフォルトは新規で自動割り当て。既存のセキュリティーグループから選ぶことも可能。

・パブリックIPの自動割り当て
ENI(Elastic Network Interface)がパブリックIPアドレスを受け取るかどうか。

EnableかDisableで選択する。


##5-2. ロードバランサーの設定 タスク間のトラフィックを分散させる。事前にEC2コンソールでロードバランサーを作成しておく必要がある。

image.png

ロードバランサーはApplication Load Balancer(HTTPやHTTPSを振り分ける)か、Network Load Balancer(超高性能タイプ)から選択できる。

###ロードバランサーとRoute53のエイリアスレコード
ロードバランサーでタスク内のコンテナにアクセスするために、Route53のエイリアスレコードを作成しておく。

ネットワーキングの流れは、

リクエスト
↓
ロードバランサ
↓
コンテナ

となる。

エイリアスレコードの作成手順


##5-3. ロードバランサー用のコンテナを設定 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/dcedb0e7-e1fa-866d-63ab-5cfd754cd196.png)

指定したタスクの中で定義したコンテナが選択できる。(コンテナが1つの場合は選択肢は1つ)

↓ 追加ボタンをクリック

image.png

・プロダクションリスナーポート
HTTP(80)かHTTPS(443)を選択。

指定したロードバランサーで設定してあるリスナーを選ぶ。


**▼ロードバランサーのリスナーの例** ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/461ca5b0-2f13-8e30-f5ae-40d23fd93b9c.png)

▼80番ポートの設定例
image.png

ここでは、80番ポートにアクセスした場合、443番にリダイレクトする指定になっている。このため、プロダクションリスナーポートは443を選択。

・テストリスナー
ロードバランサーでルーティングする前に飛び先のアプリケーションをテストする。

不要の場合はチェックを外す。


###5-3. ロードバランス用のコンテナを設定 ロードバランサーでトラフィックを接続するための、コンテナにターゲットグループを作成する。

image.png

▼ターゲットグループの名前
既存、または新規作成する。

▼ターゲットグループのプロトコル
コンテナの開放ポートに繋ぐ。80番を開けている場合はHTTPにする。

▼パスパターン
ロードバランサーのIF文で、〇〇のパスならの部分に当たる。

スラッシュ以下のパスしか入力できないため、FQDN(サブドメ)を入力したい場合は、ここはダミーを設定しておき、別途ロードバランサーで設定する。

▼評価順
if文を処理をかけていく順番。番号が小さい条件から検証していく。


###5-4. ヘルスチェックパスの設定 ヘルスチェックを実行するパスを設定する。 ロードバランサーで(ELBコンソール)で設定する。

image.png


###5-5. 2つめのターゲットグループの作成 デプロイの方法で**Blue/Greenを選択した場合は、ターゲットグループを2つ入力する必要がある**。

新しいGreenのターゲットグループ2にアクセスしたときにエラーが発生した場合、Blueのターゲットグループ1にトラフィックを戻すため。

image.png

▼パスパターン
選択不可。ターゲットグループ1のパスパターンを継承する。

###5-6. Auto Scaling
CloudWatchでアラームがでた場合に、オートスケーリングするかどうか。

image.png

Auto Scallingする場合は、最小・最大タスク数などを選ぶ。

###6. サービスの作成
作成ボタンを押すと、5つのサービスが一気に作成される。

  1. ロードバランサーのターゲットグループ1
  2. ロードバランサーのルール
  3. ロードバランサーのターゲットグループ2
  4. サービスの作成
  5. Blue/Green デプロイメント(CodeDeploy)

image.png

※注意
それぞれが別々のサービス上に作成されるため、ミスがあった場合は、全てを削除する必要がある。

↓ サービスを表示

image.png

以上でクラスターの作成が完了。

##7. ELB(ロードバランサー)の修正
5-3のロードバランス用のコンテナを設定ではFQDNを入力することができずダミーを入力したため、ELBコンソールから入力内容を修正する。

ELB(ロードバランサー)から指定のロードバランサーを選択し、ルールを表示する。

image.png

先ほどダミーで登録したルーティングが追加されている。

上の鉛筆マークをクリックしてこれを編集する。

image.png

FQDNを入力したいため、ホストヘッダーを選択する。

image.png

修正が完了したら、右上の「更新」をクリックして完了。


##ロードバランサーの注意点 バランサーはユーザーとサービスを繋ぐためとても重要。

間違って既存のルーティングを変更したり削除してしまうと、サービスにアクセスできなくなってしまうため注意が必要。

Route53とバランサーはサービスの根幹で、他のサービスともつながっている場合も多いため注意すること。


##8. ページの表示 以上で**AWS上での設定が完了**。

クラスターで該当のプロジェクトを確認したときに、RUNNINGになっていればOK。指定したURLを入力すればページを開くことができる。

ページはイメージの中で定義したルーティングやビューに従う。

ページが表示されない場合は、ヘルスチェックでサーバーが動いているか確認するなどの方法がある。(別途設定が必要)


**▼ヘルスチェックの例** ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/9527734e-f8db-d999-e1a3-0789e44d0e5b.png)
以上。
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?