1.はじめに
こんにちは。gura3です。本ブログが初投稿です。
至らぬ点等あるかと思いますが、お手柔らかにお願いします。
(以降の文章は常体で書きます。)
ー経緯ー
ECS専用EC2インスタンス内に3台のコンテナを起動する構成を検証していたら、
2台までしか起動出来ず、エラーが発生した。
EC2インスタンスにアタッチできるENIの数には制限があることがわかった。
更に、調べるとENIの上限を解放できるAmazonECSのENIトランキング機能というものがあるらしい。
設定手順を試してみた。
2.概要
2.1. 概要図
2.2. ENIトランキングに対応しているインスタンス
-
各インスタンスタイプのENI制限については、AWS公式のElastic Network Interfaceを参照
-
以下のURLから、ENIトランキング機能に対応しているEC2インスタンスタイプを確認する
AWS公式ドキュメント: Elastic Network Interface のトランキング
注意点
ENIトランキング機能に対応していないEC2インスタンスタイプは、ENIの数を拡張出来ない。
例)汎用インスタンスのt2ファミリー、t3ファミリーは拡張出来ない。
・t2.micro, t2.small, t2.medium, t2.large
今回は、「m5.large」を使用して拡張を行うことにした。
前提として、「m5.large」は通常、2つまでしかコンテナを作成できない
3.検証環境の準備
3.1. ECSクラスター作成
- クラスター名:test-cluster1
3.2. タスク定義作成
項目 | 設定内容 |
---|---|
ファミリー名 | test-httpd-task |
コンテナ名 | httpd |
イメージ | ECRにpush済のイメージ |
アプリケーション環境 | Amazon EC2 インスタンス |
タスクサイズ | CPU:.25v メモリ: .5GB |
タスクロール | - |
タスク実行ロール | EcsTaskExcutionRole |
ネットワークモード | aws vpc |
EC2インスタンスのタイプを「t2.micro」もしくは「t3.micro」で作成予定のとき、
デフォルトのタスクサイズ(CPU:1v、メモリ:3GB)では、メモリ不足でタスクが動かないので注意する
3.3.ALBを作成
-
ALB用セキュリティグループ
項目 設定内容 セキュリティグループ名 alb-sg タイプ HTTP プロトコル TCP ポート 80 ソース マイIPまたは0.0.0.0/0 -
ALB
項目 設定内容 ALB名 test-alb スキーム インターネット向け プロトコルVPC、サブネット 任意 セキュリティグループ alb-sg -
リスナー設定
項目 設定内容 プロトコル HTTP ポート 80 転送先 test-tg
3.4.ECSサービスの作成
-
環境およびデプロイ設定
項目 設定内容 コンピューティング設定 起動タイプ 起動タイプ ec2 アプリケーションタイプ ami-01703abf1e5cede54 ファミリー test-httpd-task サービス名 httpd-service サービスタイプ レプリカ 必要なタスク 1 -
ネットワーキング設定
- 任意のVPC、サブネットを選択
- 先ほど作成した、ALBを既存のロードバランサーとして選択
3.5.ECSonEC2インスタンス作成
-
インスタンス起動設定
項目 設定内容 インスタンス名 test-eni-trunking AMI名 amzn2-ami-ecs-hvm-2.0.20230301-x86_64-ebs AMI ID ami-01703abf1e5cede54 インスタンスタイプ m5.large DNSリクエスト応答 無効 IAMロール ecsInstanceRole ユーザデータ 以下 ユーザデータ#!/bin/bash echo ECS_CLUSTER=test-cluster1 >> /etc/ecs/ecs.config
※Amazon ECS に最適化された AMIのバージョン 1.28.1 以降でないと
ENIトランキング機能に対応していないため注意が必要。 -
インスタンス登録確認
4.コンテナを3つ起動してみる
-
サービスの必要なタスクの数を変更
- 「サービスの更新」ボタンをクリック
- 必要なタスクの数:3に変更
-
タスク実行状況を確認
3つ目のタスクを実行出来ない旨のエラーが発生している
service test-httpd-service was unable to place a task because no container instance met all of its requirements.
The closest matching container-instance 4bfe560f78fe4d1baf8da01e7e236078 doesn't have the agent connected.
For more information, see the Troubleshooting section of the Amazon ECS Developer Guide.
現状のままでは、3つ以上のタスクを起動出来ないことが分かった
5.ENIトランキング機能の有効化を行う
-
ECS>アカウント設定に移動
-
EC2再作成
- ENIトランキング機能の適用は、awsvpcTrunking 設定をオンにした後から起動されたEC2インスタンスのみが対象
- それ以前に起動されたインスタンスは、AWSVPC Trunking機能を使用できない。
有効後は必ずEC2インスタンスの再作成が必要
未だに、3つ目のタスクを実行出来ない旨のエラーが発生している
この後、EC2を作り直して何回やっても2つしかコンテナが起動しない
6.エラーの原因調査
-
googleでエラー文を入力して検索した
-
見つけた記事:[ Qiita ] awsvpcTrunking設定を試す【ECS】
↑途中までは同じ……その先が知りたい -
海外の方がissueとして質問しているのを発見:githubのプラットフォーム
↑返信を翻訳してみる
-
AWSマネジメントコンソールのECSのアカウント設定(awsvpcTrunkingの有効化)は、リージョンごとに適用される。
ユーザーやロールのようなIAMリソースはグローバルに設定されているものである。※リージョン特有のIAMリソースではない
awsvpcTrunkingの有効化は、マネジメントコンソール上からではなく、CLIからroot権限を使用して有効にする必要がある
上記を実施して、私の問題は解決した。
と、いう事で設定方法が間違っていたらしい。
まさかマネジメントコンソールを使用した設定方法が間違いだったとは!
改めて公式ドキュメント等を確認
下記リンクの、「コマンドラインを使用し、アカウント所有者としてユーザーまたはコンテナインスタンスの IAM ロールを引き上げられた ENI 制限に有効化するには」という箇所にCLIからの設定方法が記載されている
7.CLIからENIトランキングを有効化する
- AWS CLIを起動
- 以下のコマンド実行
aws ecs put-account-setting-default --name awsvpcTrunking --value enabled
- 結果(全てのロールに対してawsvpcTrunkingが有効になった)
8.コンテナを3つ起動してみる(リベンジ)
-
サービスの必要なタスクの数を変更