Amazon ECS タスク配置の制約事項 - Amazon Elastic Container Service

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

インスタンスのオペレーティングシステム。この属性に指定できる値は linuxwindows です。

ecs.os-family

インスタンスのオペレーティングシステムのバージョン。

Linux インスタンスの場合、有効な値は LINUX です。Windows インスタンスの場合、ECS は値を WINDOWS_SERVER_<OS_Release>_<FULL or CORE> 形式で設定します。有効な値は、WINDOWS_SERVER_2022_FULLWINDOWS_SERVER_2022_COREWINDOWS_SERVER_20H2_COREWINDOWS_SERVER_2019_FULLWINDOWS_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_64arm64 です。

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 コンテナエージェント」を参照してください。

カスタム属性をコンソールを使用して追加するには
  1. コンソール (https://console.aws.amazon.com/ecs/v2) を開きます。

  2. ナビゲーションペインで、[クラスター] を選択し、次にクラスターを選択します。

  3. [インフラストラクチャ] を選択し、

  4. コンテナインスタンスを選択し、その後 [属性] を選択します。

  5. [Add] (追加) を選択します。

  6. [属性名][値] に、属性の名前と値を入力し、[送信] を選択します。

    追加する属性ごとにこの手順を繰り返します。

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

クラシックコンソールでの属性に関するフィルタリング

コンテナインスタンスにフィルタを適用して、カスタム属性を表示できます。

クラシックコンソールを使用して、属性によってコンテナインスタンスにフィルターを適用する
  1. コンソール (https://console.aws.amazon.com/ecs/v2) を開きます。

  2. ナビゲーションペインで、[クラスター] を選択し、次にクラスターを選択します。

  3. [インフラストラクチャ] を選択し、

  4. コンテナインスタンスを選択します。

  5. [キーまたは値でカスタム属性をフィルタリング] のテキストフィールドを使用して、フィルターを適用する属性を入力または選択します。形式は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 インスタンスにタスクを配置します。次のアクションを使用して指定できます。CreateServiceUpdateServiceRegisterTaskDefinition、および 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 タスクグループ内の他のタスクとともにインスタンスにタスクを配置します。タスクグループの詳細については、「タスクグループ」を参照してください。次のアクションを使用して指定できます。CreateServiceUpdateServiceRegisterTaskDefinition、および RunTask

"placementConstraints": [ { "expression": "task:group == databases", "type": "memberOf" } ]

distinctInstance 制約は、グループ内の各タスクを別のインスタンスに配置します。次のアクションを使用して指定できます。CreateServiceUpdateService、および RunTask

"placementConstraints": [ { "type": "distinctInstance" } ]