初めに
先日 AWS より以下の発表がありました。
Announcing Amazon ECS Managed Instances
※Google翻訳結果の引用
AWS は本日、Amazon Elastic Container Service (Amazon ECS) マネージドインスタンスの提供開始を発表しました。これは、インフラストラクチャ管理のオーバーヘッドを削減しながら、Amazon EC2 の全機能にアクセスできるように設計された、新しいフルマネージドコンピューティングオプションです。インフラストラクチャ運用を AWS にオフロードすることで、ECS マネージドインスタンスは、ワークロードを迅速に起動および拡張し、パフォーマンスを向上させ、総所有コストを削減するのに役立ちます。
ECSの起動タイプが増えるという、ECSを触れている人にとってはかなりインパクトのある発表だったかと思います。
かくいう私も ECS 上で動作するコンテナ製品である HULFT10 for Container Services を Marketplace に出品している身なので、今後この機能とどうやって向き合っていくべきなのか悩んでいます。
HULFT for Container Services は CloudFormation を利用して、ユーザー環境の ECS に HULFT コンテナを導入してもらう製品です。
導入時のオプションとして、ECS on EC2 と ECS on Fargate どちらで動作させるかを選択できるようにしています。
もともと、できればインフラは AWS のフルマネージドを利用して動作する仕組みを作りたかったので Fargate 版のみを提供する予定だったのですが、後述する理由から EC2 版でしか実現できない機能があり、EC2版も提供することとなりました。
今回 ECS マネージドインスタンスが提供されることで、フルマネージドで EC2 版のみで実現できている機能を提供できるのではないかということで、実現可能かどうかを調査しました。
検証内容
以下の二つを検証しました。
- ユーザーデータ入力を使用した EC2 インスタンスの起動を指定可能か
- CloudFormationで導入された ECS on EC2 環境を ECS マネージドインスタンス環境に移行可能か
ユーザーデータ入力を使用した EC2 インスタンスの起動を指定可能か
HULFT10 for Container Services では新規 VPC に ECS を導入する都合上、既存システムの EFS にアクセスするためには、ECSタスクでのマウントではなく、EC2 上でEFSをマウントする必要がありました。
これを実現するために、ユーザーデータ入力により、EC2 インスタンス起動時に EFS のマウントを実施しています。
今回対応したマネージドインスタンスでユーザーデータによる EFS のマウントが可能なのかを検証しました。
CloudFormationで導入された ECS on EC2 環境を ECS マネージドインスタンス環境に移行可能か
CloudFormation で HULFT10 for Container Services を導入済みのユーザーが、マネージドインスタンスを利用した起動設定に切り替えることができるのか(CloudFormation の設定と競合しない形で設定できるか)を検証しました。
検証結果
ユーザーデータ入力を使用した EC2 インスタンスの起動を指定可能か
キャパシティープロバイダーの作成時にマネージドインスタンス属性を設定可能でしたが、ユーザーデータ入力の設定はありませんでした。
CloudFormation のリファレンスにも見当たりません。
また、使用されている OS が Bottlerocket というコンテナホスティング用の専用 OS と説明されているため、ユーザーデータ入力が使用できたとしても、EFS のマウントは難しそうです。
CloudFormationで導入された ECS on EC2 環境を ECS マネージドインスタンス環境に移行可能か
マネージドインスタンスの使用は、オプションで指定するものではなく、launchType として選択するものでした。そのため、既存のテンプレートの launchType を MANAGED_INSTANCES
に修正する必要がありそうです。
実際にコンソール操作でマネージドインスタンス導入後に元のCloudFormationテンプレートでスタック更新を実施し確認をしたところ、タスク定義が更新され、サービスの再起動が行われても、マネージドインスタンスで動作している状況が保持されていました。
タスク定義の「アプリケーション環境」は EC2
に戻っていたのですが、サービス側の「キャパシティープロバイダー戦略」の設定が残っていたため、この動作となったようです。
タスク定義とサービスの設定でちぐはぐになってしまっていてあまりよくない状況ですし、コンテナインスタンスには Auto Scaling グループ設定により起動している使用されていない EC2 が待機することになります。正式な移行には専用の CloudFormation テンプレートが必要そうです。
検証詳細
以下は上記検証のために実際に操作した内容です。
設定を変更するクラスターは HULFT10 for Container Services を 「Deployment to ECS on EC2」で導入したものです。
キャパシティープロバイダーの作成
対象クラスターの「インフラストラクチャ」からマネージドインスタンス用のキャパシティプロバイダーを作成します。
スケーリングタイプにマネージドインスタンスが新規追加されていました。
マネージドインスタンスの作成には専用の「インフラストラクチャロール」の作成が必要です。
「新しいインフラストラクチャロールを作成」ボタンから作成しました。
IAM ロール作成後、ロールにインラインポリシーで iam:PassRole
を追加しました。
この権限を追加しないと、デプロイ時に以下のエラーが発生します。
service ecs-control-hulft-XXXX-ap-northeast-1-01 was unable to place a task. Reason: ResourceInitializationError: Unable to launch instance(s) for capacity provider test-managed. UnauthorizedOperation: You are not authorized to perform this operation. User: arn:aws:sts::XXXX:assumed-role/ecsInfrastructureRole/ECSFargateManagedInstances is not authorized to perform: iam:PassRole on resource: arn:aws:iam::XXXX:role/ecsInstancerole-hulft-XXXX because no identity-based policy allows the iam:PassRole action. RequestId: XXXX.
このページで説明されていました。
メモリは GiB ではなく MiB 指定でした
インスタンス属性を追加のオプションも確認しましたが、残念ながら使用したかった「ユーザーデータ入力」はありませんでした。
ネットワーク設定は EC2 に設定しているものと同じものを設定します。
以上の設定で作成を実行すると、キャパシティプロバイダー上に作成したマネージドインスタンスが表示されました。
起動テンプレート
キャパシティプロバイダーの作成後に、マネージドインスタンス用の起動テンプレートが作成されていました。
Auto Scaling グループで使用するものと同じテンプレートのようだったので、もしかしたらここからユーザーデータの入力を設定できるかもしれません(望み薄ですが……)
タスク定義の更新
タスク定義の「起動タイプ」を Amazon EC2 インスタンス
から マネージドインスタンス
に変更します。
EC2 を利用していた理由のボリュームのバインドマウントの部分は、Fargate 起動タイプと同じ扱いのようでした。
サービスの更新
サービスの更新で「タスク定義のリビジョン」を更新し、「コンピューティング設定 (- アドバンスト)」を開きます。
「キャパシティプロバイダー戦略」を選択し、先ほど作成したキャパシティプロバイダーを選択し、更新を実行します。
起動確認
しばらくすると、コンテナインスタンスにキャパシティプロバイダーで起動されたインスタンスが登録されました(Auto Scaling グループは事前に停止しています)
起動したタスクの情報からも、起動タイプがマネージドインスタンスであることを確認できます。
お疲れ様でした。
最後に
ここまで読んでいただきありがとうございます。
今回は HULFT の起動タイプとしては対応を見送りたいと思いますが、今後のアップデートに期待して情報収集を続けていきます。