ECSついて以前以下のような記事を執筆しましたが、ECSのサービスについてさらに深堀りして理解していきたいと思いましたので (理解が浅いと感じたため)、本ブログを執筆いたします。
ECSのそもそもの用語がわからない人については上記のブログを参考にしていただけると、ECSってなぁに?というのがなんとなくわかるかと思います。
おさらいにはなりますが、ECSというAWSサービスを使用する上で押さえておく必要のある用語は以下です。
- クラスター
- タスク
- タスク定義
- サービス
今回、この中の[サービス]について深ぼっていきます。
[サービス]を作成する中にもいくつか用語が出てくるため、その一つ一つの理解が必要と感じました。
※なお、コンテナってなんですか?という点についても先ほどのリンクに記載がありますのでそちらを参照いただければと思います。
※前提として、本ブログではECS on Fargateの内容でお話をしていきます。ECS on EC2についてはお話しません。
※本ブログ内で出てくる、各名称については業務の内容とは一切関係ありませんが、AWSコンテナ設計・構築[本格]入門を参考にしています。
サービスとは?
サービスとはどのタスク定義を使い、必要なタスク数 (常時起動しておくべきタスク (コンテナ)の数を定義するもの = AutoScalingと同義)を決め、ALBやNLBとの紐づけを行い、サービスで定義したタスクに対してトラフィックを負荷分散の設定を行うもの、というのがざっくりとした概要となります。
CloudFormationやTerraformなどのコードで構築できるのももちろん必要で重要なのですが、UI上でどんな項目があって、その意味がなんなのか?を理解した上でコード化する方が理解も深まるかと思いますので、本記事では手動設定する上での内容を見ていきながら理解していきたいと思います。
※CloudFormation化したコードの内容については別途記事で解説していけたらと思っています。
コンピューティング設定 (アドバンスト)
コンピューティングオプションの[キャパシティープロバイダー戦略] [起動タイプ]ってなんですか?
キャパシティプロバイダーとは?
正直自分なりに言葉に落とし込みができなかったので、こちらの記事の内容を引用します。
Fargateをスポットで7割引で使うFargate Spotとは #reinbent | DevelopersIO
「ECSのタスク数増減戦略をより詳細に設定するためのECSの新機能」です。
ECS on Fargateの場合、FargateをSpotで使用できるというのが大きな特徴のようです。
Fargateを使用する場合には「FARGATE」「FARGATE_SPOT」の2種類から選択することが可能です。
Fargateのタスクの実行数についてはBase
とWeight
を設定して構成することができます。
Base
: 最小実行タスク数を指定します。文字通り最低いくつのタスク数を起動させておくのか?を指定します。
Weight
: FARGATEとFARGATE_SPOTをどのような割合で起動させるか?を指定します。
Base
とWeight
については以下に記事でかなり詳しく解説していました。
Fargate Spotの安全な運用を考える キャパシティ編 – Qiita
この記事を読んでやっと理解が追いついてきたのですが、Base
とサービスで設定する「必要タスク数」は少し考え方が異なるということを理解しておかなければなりません。
Base
はあくまで「最小実行タスク数」であり、
必要タスク数は「常に起動しておくべき望ましいタスク数」である。
必要タスク数はBase
よりも多く設定する必要がある。
以下の図は必要タスク数を6と指定しているが、FARGATEとFARGATE_SPOTをどのような割合で起動させますか?という図となっている。
6つタスク数のうちFARGATEで起動させる最小実行タスク数を2と指定しているため、FARGATEのタスク数は2となる。
残り4つのタスク数をどのように割り振るか?というと、Weightで指定したFARGATEを1、FARGATE_SPOTを1と指定しているため、FARGATEが2、FARGATE_SPOTが2、合計FARGATE4タスク、FARGATE_SPOT2タスクということになる。
Fargate SpotはSpotインスタンスと近しいもののため、AWSの都合でタスクが急に終了することもあるようです。(AWSの空きキャパシティを利用することで、通常の70%OFFの価格で利用できるというメリットがある)
Fargate Spotは空きキャパシティが確保できなくなった場合には中断される可能性があるため、システムの稼働を続けるためにはキャパシティをどのように確保しなければいけないのか?などの考慮が必要になるため、非常に難しいもの、であるというのはわかります。
起動タイプとは?
こちらは画面上にも記載がありますが、キャパシティプロバイダー戦略を使用しないでタスクを起動するのため、単純にタスクの必要数を決めるタイプです。
プラットフォームバージョンとは?
そもそもプラットフォームとは、ソフトウェアやサービスを動かすための土台です。
ゲームに例えると、Nintendo Switchはソフトを動作させるための基盤となるのでプラットフォームである、ということになります。
WindowsやLinuxなどのOSもプラットフォームです。OSという土台 (WindowsやLinux)があって、アプリケーションを動かすことができます。
話を戻して、ここで言っているプラットフォームバージョンとはFargateという土台のバージョンを何にしますか?を設定する項目です。
Fargateのプラットフォームバージョンにもいくつかありまして、最新のLatestを選択すると1.4.0のプラットフォームバージョンが使用されます。
プラットフォームバージョンが新しいものほど使用できる機能が充実してききますので、基本的には最新のプラットフォームバージョンを選択しておいて良いかと思いますが、注意点としては現状は[Latest]を選択した場合、最新の1.4.0が使用されますが、今後1.5.0がリリースされた場合の初期のうちはLatestが1.5.0になるかはAWSの公式を確認しないとわからないため、AWS公式を確認した上で1.5.0を選択する、などが必要になります。
また、古いプラットフォームを使用していて、最新のプラットフォームに移行したら動かなくなった、などのあるあるも存在するので、この点についてAWS公式でどんな点に注意しなければいけないのか?などを確認しておく必要があります。
AWS公式に書かれている内容は以下のようなものです。
- インターフェイス VPC エンドポイントを使用している場合は、次の点を考慮してください。
- Amazon ECR でホストされているコンテナイメージを使用する場合、com.amazonaws.region.ecr.dkrとcom.amazonaws.region.ecr.apiの両方のAmazon ECR VPC エンドポイントおよび Amazon S3 ゲートウェイエンドポイントが必要です。詳細については、Amazon Elastic コンテナレジストリ ユーザーガイドの Amazon ECR Interface VPC エンドポイント(AWS PrivateLink)を参照してください。
- Secrets Managerのシークレットを参照するタスク定義を使用してコンテナの機密データを取得する場合は、 Secrets Managerのインターフェイス VPC エンドポイントを作成する必要があります。詳細については、AWS Secrets Manager ユーザーガイドのVPC EndpointでSecrets Managerを使用するを参照してください。
- Systems Managerパラメータストアのパラメータを参照するタスク定義を使用してコンテナの機密データを取得する場合は、SystemsManagerのインターフェイスVPCエンドポイントを作成する必要があります。詳細については、AWS Systems ManagerユーザーガイドのVPCエンドポイントでSystemsManagerを使用するを参照してください。
- タスクに関連付けられた Elastic Network Interface (ENI) のセキュリティグループに、タスクと使用している VPC エンドポイント間のトラフィックを許可するために作成されたセキュリティグループルールがあることを確認します。
デプロイ設定
アプリケーションタイプのサービス or タスクとは?
ここでは「サービス」と「タスク」の二つの選択肢がありますが、用途によってどちらを選択するかがかわってきます。
主な違いは
- 指定したタスクを維持するのか、しないのか? (1回限りのプロセス用タスクを使用する場合には「タスク」、持続的に使用するタスクの場合には「サービス」を使用する)
- タスクの起動と停止は手動で実行またはAmazon EventBridgeスケジューラを使用して起動する、処理が終わったら手動でタスクを停止する、などの方法がある。
AWS公式参考
- AWS ECSタスクとしてアプリケーションを実行する
- Amazon EventBridge スケジューラを使用してスケジュールに基づいて Amazon ECSタスクを実行する
- Amazon ECSタスクを停止する
- ELBとの連携ができるのか?できないのか?
など
上記の通り、どちらを使用するかは用途のよって異なるかと思いますが、アプリケーションを実行するコンテナを使いたい、という場合には「サービス」を選択し、バッチジョブでその場限りで終了させて費用を抑えたいといった場合には「タスク」を選択する、といった判断ができるのではないでしょうか?
(もちろんこの辺については要件によって異なってきます)
サービスタイプ
サービスタイプには「レプリカ」「デーモン」の二つがありますが、「デーモン」についてはFargateでの利用は負荷のため割愛します。
レプリカとは?
クラスター全体で指定した数のタスクを実行し続けるサービスです。
タスクが停止した場合には、ECSが自動的に新しいタスクを起動して置き換えます。
デプロイオプション
デプロイタイプとは?
「ローリングアップデート」と「ブルー/グリーンデプロイメント」という二つのデプロイの手法がありますが、今回は「ローリングアップデート」について解説します。
※「ブルーグリーンデプロイメント」については、それだけでかなりのボリュームになりそうなため別途記事で改めて解説していきたいと思います。
ローリングアップデートとはローラー作戦という言葉を聞いたことがあるかもしれませんが、ローラーをかけるように順繰り複数コンテナをアップデートしてきます。
図で表すと以下のようになります。
1.アップデート前の通常稼働時は以下のような状態です。
2.ECRのimage、タスク定義のリビジョンを更新、サービスを更新を開始します。
3.更新が開始されるとコンテナがアップデートを開始し始めます。片方のコンテナがアップデートを開始し、もう片方は既存コンテナイメージの状態で稼働しています。
4.片方のコンテナのアップデートが完了すると、もう片方のコンテナもアップデートを開始する。
上記の流れがローリングアップデートの流れとなります。
簡易的な図で表すと上図となりますが、実際には「最小実行タスク」「最大実行タスク」を設定することになります。
例えば、
- 必要タスク数: 2
- 最小実行タスク: 100%
- 最大実行タスク: 200%
とした場合、必要タスク数に対して%を考慮するので、既存コンテナを停止する前に新しいコンテナを2つ起動開始します。
新しいコンテナ2つの起動が開始されると、必要タスク数を維持しようとするため、2つの既既存コンテナは停止をし始めます。
まとめ
ECSのサービスで設定する項目についてまとめてみましたが、こうして見ていくとかなりの設定項目がありますね。
初めてECSを使用するときには、一体これは何を言っているんだと思いましたが、一つ一つかみ砕いていくとだいぶ理解が進んだように思います。
まだ説明しきれていない点がありますが、その点については別途記事をアップしていければと思っております。