Amazon ECS タスク配置の制約事項
タスク配置の制約事項は、タスク配置中に考慮されるルールです。少なくとも 1 つのコンテナインスタンスが制約に一致する必要があります。制約に一致するインスタンスがない場合、タスクは PENDING
状態のままになります。新しいサービスを作成するか、既存のサービスを更新するときに、サービスのタスク用にタスク配置制約を指定できます。スタンドアロンタスクのタスク配置制約を指定することもできます。詳細については、「Amazon ECS タスクの配置」を参照してください。
制約は、制約タイプとクラスタークエリ言語の式で設定されます。制約タイプは必須ですが、式はオプションです。
制約タイプ
Amazon ECS では、次のタイプのタスク配置制約事項をサポートします。
distinctInstance
-
各タスクを別々のコンテナインスタンスに配置します。タスクの実行時または新しいサービスの作成時に、このタスク配置の制約事項を指定できます。
memberOf
-
式を満たすコンテナインスタンスにタスクを配置します。制約事項に関する式の構文の詳細については、「クラスタークエリ言語」を参照してください。
次のアクションを使用して
memberOf
タスク配置の制約事項を指定できます。-
タスクの実行
-
新しいサービスの作成
-
新しいタスク定義の作成
-
既存のタスク定義の新しいリビジョンの作成
-
属性
コンテナインスタンスに属性と呼ばれるカスタムメタデータを追加できます。各属性には名前とオプションの文字列値があります。Amazon ECSが提供する組み込み属性を使用することも、カスタム属性を定義することもできます。
次のセクションでは、組み込み型、オプション型、カスタム型属性のサンプルが含まれています。
組み込み属性
Amazon ECSは次の属性を自動的にコンテナインスタンスに適用します。
ecs.ami-id
-
インスタンスの起動に使用される AMI の ID。この属性の値の例は「
ami-1234abcd
」です。 ecs.availability-zone
-
インスタンスのアベイラビリティーゾーン。この属性の値の例は「
us-east-1a
」です。 ecs.instance-type
-
インスタンスのインスタンスタイプ。この属性の値の例は「
g2.2xlarge
」です。 ecs.os-type
-
インスタンスのオペレーティングシステム。この属性に指定できる値は
linux
とwindows
です。 ecs.os-family
-
インスタンスのオペレーティングシステムのバージョン。
Linux インスタンスの場合、有効な値は
LINUX
です。Windows インスタンスの場合、ECS は値をWINDOWS_SERVER_<
形式で設定します。有効な値は、OS_Release
>_<FULL or CORE
>WINDOWS_SERVER_2022_FULL
、WINDOWS_SERVER_2022_CORE
、WINDOWS_SERVER_20H2_CORE
、WINDOWS_SERVER_2019_FULL
、WINDOWS_SERVER_2019_CORE
、およびWINDOWS_SERVER_2016_FULL
です。これは、Windows コンテナおよび Windows containers on AWS Fargate にとって重要です。なぜなら、すべての Windows コンテナの OS バージョンがホストのそれと一致する必要があるからです。コンテナイメージの Windows バージョンがホストと異なる場合、コンテナは起動しません。詳細については、マイクロソフトのドキュメント Web サイトの「Windows コンテナバージョンの互換性
」を参照してください。 クラスターが複数の Windows バージョンを実行している場合、次の配置制約を使用して、同じバージョンで実行されている EC2 インスタンスにタスクが配置されるようにすることができます:
memberOf(attribute:ecs.os-family == WINDOWS_SERVER_<OS_Release>_<FULL or CORE>)
。詳細については、「Amazon ECS に最適化された AMI メタデータを取得する」を参照してください。 ecs.cpu-architecture
-
インスタンスの CPU アーキテクチャ。この属性の値の例は
x86_64
とarm64
です。 ecs.vpc-id
-
インスタンスが起動された VPC。この属性の値の例は「
vpc-1234abcd
」です。 ecs.subnet-id
-
インスタンスが使用しているサブネット。この属性の値の例は「
subnet-1234abcd
」です。
オプションの属性
Amazon ECS では、コンテナインスタンスに次の属性を追加することができます。
ecs.awsvpc-trunk-id
-
この属性が存在する場合、インスタンスにトランクネットワークインターフェイスがあります。詳細については、「Elastic Network Interface のトランキング」を参照してください。
ecs.outpost-arn
-
この属性が存在する場合は、Outpost の Amazon Resource Name (ARN) が含まれます。詳細については、「AWS OutpostsのAmazon Elastic Container Service」を参照してください。
ecs.capability.external
-
この属性が存在する場合、インスタンスは外部インスタンスとして識別されます。詳細については、「外部インスタンス(Amazon ECS Anywhere)」を参照してください。
カスタム属性
コンテナインスタンスに、カスタム属性を適用できます。例えば、「stack」という名前で「prod」という値の属性を定義できます。
カスタム属性を指定するとき、次の点を考慮する必要があります。
-
name
は、1~128 文字で指定する必要があります。文字 (大文字と小文字)、数字、ハイフン、アンダースコア、スラッシュ、バックスラッシュ、ピリオドを使用できます。 -
value
は、1 ~ 128 文字で指定する必要があります。文字 (大文字と小文字)、数字、ハイフン、アンダースコア、ピリオド、アットマーク (@)、スラッシュ、バックスラッシュ、コロン、またはスペースを使用できます。値の先頭または末尾にホワイトスペースを含めることはできません。
属性の追加
インスタンス登録時に、コンテナエージェントを使用して、または AWS Management Consoleを使用して手動で、カスタム属性を追加できます。使用可能な Amazon ECS コンテナエージェントの設定パラメータについては、GitHub の「Amazon ECS コンテナエージェント
カスタム属性をコンソールを使用して追加するには
コンソール (https://console.aws.amazon.com/ecs/v2
) を開きます。 -
ナビゲーションペインで、[クラスター] を選択し、次にクラスターを選択します。
-
[インフラストラクチャ] を選択し、
-
コンテナインスタンスを選択し、その後 [属性] を選択します。
-
[Add] (追加) を選択します。
-
[属性名] と [値] に、属性の名前と値を入力し、[送信] を選択します。
追加する属性ごとにこの手順を繰り返します。
AWS CLI を使用してカスタム属性を追加する
次の例では、put-attributesコマンドを使用してカスタム属性を追加する方法を説明します。
例: 単一属性
以下は、指定のコンテナインスタンスにカスタム属性「stack=prod」を追加する例です。
aws ecs put-attributes --attributes name=stack,value=prod,targetId=
arn
例: 複数の属性
以下は、指定のコンテナインスタンスにカスタム属性「stack=prod」および「project=a」を追加する例です。
aws ecs put-attributes --attributes name=stack,value=prod,targetId=
arn
name=project,value=a,targetId=arn
クラシックコンソールでの属性に関するフィルタリング
コンテナインスタンスにフィルタを適用して、カスタム属性を表示できます。
クラシックコンソールを使用して、属性によってコンテナインスタンスにフィルターを適用する
コンソール (https://console.aws.amazon.com/ecs/v2
) を開きます。 -
ナビゲーションペインで、[クラスター] を選択し、次にクラスターを選択します。
-
[インフラストラクチャ] を選択し、
-
コンテナインスタンスを選択します。
-
[キーまたは値でカスタム属性をフィルタリング] のテキストフィールドを使用して、フィルターを適用する属性を入力または選択します。形式はAttributeName:AttributeValueである必要があります。
AWS CLIを使用して属性でコンテナインスタンスにフィルタを適用する
次の例は、list-constainer-instancesコマンドを使用して、属性でコンテナインスタンスをフィルタリングする方法を示しています。フィルタの構文の詳細については、「クラスタークエリ言語」を参照してください。
例: 組み込み属性
次の例では、g2.2xlargeのインスタンスをリスト表示する組み込み属性を使用しています。
aws ecs list-container-instances --filter "attribute:ecs.instance-type == g2.2xlarge"
例: カスタム属性
次の例では、カスタム属性「stack=prod」を持つインスタンスがリスト表示されます。
aws ecs list-container-instances --filter "attribute:stack == prod"
例: 属性値を除外する
次の例では、カスタム属性が「stack」であり属性値が「prod」ではないインスタンスをリスト表示します。
aws ecs list-container-instances --filter "attribute:stack != prod"
例: 複数の属性値
次の例では、組み込み属性を使用して、タイプが t2.small
または t2.medium
のインスタンスをリスト表示します。
aws ecs list-container-instances --filter "attribute:ecs.instance-type in [t2.small, t2.medium]"
例: 複数の属性
次の例は、組み込み属性を使用して us-east-1a アベイラビリティーゾーンの T2 インスタンスをリスト表示します。
aws ecs list-container-instances --filter "attribute:ecs.instance-type =~ t2.* and attribute:ecs.availability-zone == us-east-1a"
制約事項の例
以下はタスク配置の制約事項の例です。
この例では、memberOf
制約を使用して T2 インスタンスにタスクを配置します。次のアクションを使用して指定できます。CreateService、UpdateService、RegisterTaskDefinition、および RunTask。
"placementConstraints": [ { "expression": "attribute:ecs.instance-type =~ t2.*", "type": "memberOf" } ]
この例では、memberOf
制約を使用して、指定されたタスク配置方法に従って、daemon-service
タスクグループ内のデーモンサービスタスクを持つインスタンスに、レプリカタスクを配置します。この制約により、デーモンサービスタスクはレプリカサービスタスクよりも前に EC2 インスタンスに配置されます。
daemon-service
を デーモンサービスの名前に置き換えます。
"placementConstraints": [ { "expression": "task:group == service:
daemon-service
", "type": "memberOf" } ]
この例では、memberOf
制約を使用して、指定されたタスク配置方法に従って、databases
タスクグループ内の他のタスクとともにインスタンスにタスクを配置します。タスクグループの詳細については、「タスクグループ」を参照してください。次のアクションを使用して指定できます。CreateService、UpdateService、RegisterTaskDefinition、および RunTask。
"placementConstraints": [ { "expression": "task:group == databases", "type": "memberOf" } ]
distinctInstance
制約は、グループ内の各タスクを別のインスタンスに配置します。次のアクションを使用して指定できます。CreateService、UpdateService、および RunTask。
"placementConstraints": [ { "type": "distinctInstance" } ]