

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 定義 Amazon ECS 用於任務的容器執行個體
<a name="task-placement-constraints"></a>

任務置放限制條件是有關容器執行個體的規則，Amazon ECS 透過其判斷是否允許任務在該執行個體上執行。至少有一個容器執行個體必須符合限制條件。如果沒有符合條件限制的執行個體，則任務將會保持 `PENDING` 狀態。當您建立新服務或更新現有服務時，您可以為服務的任務指定任務放置限制條件。

您可以使用 `placementConstraint` 參數，在服務定義、任務定義或任務中指定任務置放限制條件。

```
"placementConstraints": [
    {
        "expression": "The expression that defines the task placement constraints",
        "type": "The placement constraint type to use"
    }
]
```

下表說明如何使用這些參數。


| Constraint type (限制條件類型) | 可指定的時機 | 
| --- | --- | 
| distinctInstance將每個作用中任務置放在不同的容器執行個體上。Amazon ECS 會查看任務置放所需的任務狀態。例如，如果現有任務的所需狀態為 `STOPPED` (但上次狀態不是)，則儘管存在 `distinctInstance` 置放限制條件，新的傳入任務仍可置放於同一執行個體上。因此，您可能會在同一執行個體上看到 2 項上次狀態為 `RUNNING` 的任務。 建議需要為任務實現嚴格隔離的客戶採用 Fargate。Fargate 會在硬體虛擬化環境中執行每個任務。此舉可確保這些容器化工作負載，不會與其他任務共用網路介面、Fargate 暫時性儲存、CPU 或記憶體。如需詳細資訊，請參閱 [的安全概觀 AWS Fargate](https://d1.awsstatic.com/whitepapers/AWS_Fargate_Security_Overview_Whitepaper.pdf)。 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/task-placement-constraints.html)  | 
| memberOf在滿足運算式的容器執行個體上放置任務。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/task-placement-constraints.html) | 

使用 `memberOf` 限制條件類型時，可以使用叢集查詢語言來建立表達式，該語言定義了 Amazon ECS 可以置放任務的容器執行個體。表達式可讓您依屬性將容器執行個體分組。表達式位於 `placementConstraint` 的 `expression ` 參數中。

## Amazon ECS 容器執行個體屬性
<a name="attributes"></a>

您可以將自訂中繼資料新增至容器執行個體，稱為*屬性*。每個屬性都有名稱和選用字串值。您可以使用 Amazon ECS 所提供的內建屬性，或定義自訂屬性。

以下章節包含範例內建屬性、選擇性屬性和自訂屬性。

### 內建屬性
<a name="ecs-automatic-attributes"></a>

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 容器的作業系統版本必須符合主機的作業系統版本。如果容器映像的 Windows 版本與主機不同，則容器不會啟動。如需詳細資訊，請參閱 Microsoft 文件網站上的 [Windows 容器版本相容性](https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2022%2Cwindows-11)。  
如果您的叢集執行多個 Windows 版本，您可以使用置放條件限制：`memberOf(attribute:ecs.os-family == WINDOWS_SERVER_<OS_Release>_<FULL or CORE>)`，確保將任務置放在執行相同版本的 EC2 執行個體上。如需詳細資訊，請參閱[擷取 Amazon ECS 最佳化 Windows AMI 中繼資料](retrieve-ecs-optimized_windows_AMI.md)。

`ecs.cpu-architecture`  
執行個體的 CPU 架構。此屬性的範例值為 `x86_64` 和 `arm64`。

`ecs.vpc-id`  
執行個體啟動所在位置的 VPC。此屬性的範例值為 `vpc-1234abcd`。

`ecs.subnet-id`  
執行個體使用的子網路。此屬性的範例值為 `subnet-1234abcd`。

**注意**  
Amazon ECS 受管執行個體支援下列屬性子集：  
`ecs.subnet-id`
`ecs.availability-zone`
`ecs.instance-type`
`ecs.cpu-architecture`

### 選擇性屬性
<a name="ecs-optional-attributes"></a>

Amazon ECS 可能會將以下屬性新增到您的容器執行個體。

`ecs.awsvpc-trunk-id`  
如果此屬性存在，執行個體則具有一個幹線網路界面。如需詳細資訊，請參閱[增加 Amazon ECS Linux 容器執行個體網路介面數量](container-instance-eni.md)。

`ecs.outpost-arn`  
如果此屬性存在，它會包含 Outpost 的 Amazon Resource Name (ARN)。如需詳細資訊，請參閱[上的 Amazon Elastic Container Service AWS Outposts](using-outposts.md)。

`ecs.capability.external`  
若存在此屬性，執行個體將被識別為外部執行個體。如需詳細資訊，請參閱[外部執行個體的 Amazon ECS 叢集](ecs-anywhere.md)。

### 自訂屬性
<a name="ecs-custom-attributes"></a>

您可以將自訂屬性套用至容器執行個體。例如，您可以定義名稱為 "stack" 且值為 "prod" 的屬性。

在指定自訂屬性時，必須考慮下列事項。
+ `name` 必須包含 1 至 128 個字元，而名稱可能包含字母 (大小寫)、數字、連字號、底線、正斜線、反斜線或句號。
+ `value` 必須包含 1 至 128 個字元，而且可能包含字母 (大小寫)、數字、連字號、底線、句號、@ 符號、正斜線、反斜線、冒號或空格。值不得包含任何前置或結尾空格。

# 建立表達式以定義 Amazon ECS 任務的容器執行個體
<a name="cluster-query-language"></a>

叢集查詢是可讓您將物件分組的運算式。例如，您可以依屬性 (例如可用區域、執行個體類型或自訂中繼資料) 將容器執行個體分組。如需詳細資訊，請參閱[Amazon ECS 容器執行個體屬性](task-placement-constraints.md#attributes)。

在您定義一組容器執行個體之後，即可自訂 Amazon ECS 以根據群組在容器執行個體上放置任務。如需詳細資訊，請參閱 [將應用程式作為 Amazon ECS 任務執行](standalone-task-create.md) 和 [建立 Amazon ECS 滾動更新部署](create-service-console-v2.md)。您也可以在列出容器執行個體時套用群組篩選條件。

## 運算式語法
<a name="expression-syntax"></a>

運算式的語法如下：

```
subject operator [argument]
```

**主旨**  
要評估的屬性或欄位。

`agentConnected`  
依 Amazon ECS 容器代理程式連線狀態來選取容器執行個體。您可以使用此篩選條件來搜尋具有代理程式已中斷連線的執行個體容器。  
有效運算子：equals (==)、not\$1equals (\$1=)、in、not\$1in (\$1in)、matches (=\$1)、not\$1matches (\$1\$1)

`agentVersion`  
依 Amazon ECS 容器代理程式版本來選取容器執行個體。您可以使用此篩選條件，尋找正在執行過期版本 Amazon ECS 容器代理程式的執行個體。  
有效運算子：equals (==)、not\$1equals (\$1=)、greater\$1than (>)、greater\$1than\$1equal (>=)、less\$1than (<)、less\$1than\$1equal (<=)

`attribute:attribute-name`  
依屬性選取容器執行個體。如需詳細資訊，請參閱[Amazon ECS 容器執行個體屬性](task-placement-constraints.md#attributes)。

`ec2InstanceId`  
依 Amazon EC2 執行個體 ID 選取容器執行個體。  
有效運算子：equals (==)、not\$1equals (\$1=)、in、not\$1in (\$1in)、matches (=\$1)、not\$1matches (\$1\$1)

`registeredAt`  
依容器執行個體註冊日期來選取容器執行個體。您可以使用此篩選條件，尋找新註冊執行個體或非常舊的執行個體。  
有效運算子：equals (==)、not\$1equals (\$1=)、greater\$1than (>)、greater\$1than\$1equal (>=)、less\$1than (<)、less\$1than\$1equal (<=)  
有效日期格式：2018-06-18T22:28:28\$100:00, 2018-06-18T22:28:28Z, 2018-06-18T22:28:28, 2018-06-18

`runningTasksCount`  
依執行中的任務數量來選取容器執行個體。您可以使用此篩選條件來尋找空白或接近空白 (在其上執行的任務很少) 的執行個體。  
有效運算子：equals (==)、not\$1equals (\$1=)、greater\$1than (>)、greater\$1than\$1equal (>=)、less\$1than (<)、less\$1than\$1equal (<=)

`task:group`  
依任務群組選取容器執行個體。如需詳細資訊，請參閱[將相關的 Amazon ECS 任務分在同一組](task-groups.md)。

**運算子**  
比較運算子。下列是支援的運算子。


|  運算子  |  Description  | 
| --- | --- | 
|  ==、equals  |  字串相等  | 
|  \$1=、not\$1equals  |  字串不相等  | 
|  >、greater\$1than  |  大於  | 
|  >=、greater\$1than\$1equal  |  大於或等於  | 
|  <、less\$1than  |  小於  | 
|  <=、less\$1than\$1equal  |  小於或等於  | 
|  exists  |  主旨存在  | 
|  \$1exists、not\$1exists  |  主旨不存在  | 
|  in  |  引數清單中的值  | 
|  \$1in、not\$1in  |  不在引數清單中的值  | 
|  =\$1、matches  |  模式相符  | 
|  \$1\$1、not\$1matches  |  模式不相符  | 

**注意**  
單一運算式不能包含括號。不過，可以使用括號指定複合運算式中的優先順序。

**引數**  
對於許多運算子而言，引數是一種常值。

`in` 和 `not_in` 運算子需要有參數清單做為引數。您可以指定引數清單，如下所示：

```
[argument1, argument2, ..., argumentN]
```

matches 和 not\$1matches 運算子需要有符合 Java 一般運算式語法的引數。如需詳細資訊，請參閱 [java.util.regex.Pattern](http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html)。

**複合運算式**

您可以使用下列布林值運算子來合併運算式：
+ &&, 和
+ \$1\$1, 或
+ \$1, 非

您可以使用括號來指定優先順序：

```
(expression1 or expression2) and expression3
```

## 範例運算式
<a name="expression-examples"></a>

下列是範例運算式。

**範例：字串相等**  
下列運算式會選取具有指定之執行個體類型的執行個體。

```
attribute:ecs.instance-type == t2.small
```

**範例：引數清單**  
下列運算式會選取 us-east-1a 或 us-east-1b 可用區域中的執行個體。

```
attribute:ecs.availability-zone in [us-east-1a, us-east-1b]
```

**範例：複合運算式**  
下列運算式會選取不在 us-east-1d 可用區域中的 G2 執行個體。

```
attribute:ecs.instance-type =~ g2.* and attribute:ecs.availability-zone != us-east-1d
```

**範例：任務親和性**  
下列運算式會選取在 `service:production` 群組中託管任務的執行個體。

```
task:group == service:production
```

**範例：任務反親和性**  
下列運算式會選取未在資料庫群組中託管任務的執行個體。

```
not(task:group == database)
```

**範例：執行中任務計數**  
下列運算式會選取僅執行一項任務的執行個體。

```
runningTasksCount == 1
```

**範例：Amazon ECS 容器代理程式版本**  
下列運算式會選取正在執行低於 1.14.5 版本容器代理程式的執行個體。

```
agentVersion < 1.14.5
```

**範例：執行個體註冊時間**  
下列運算式會選取在 2018 年 2 月 13 日之前註冊的執行個體。

```
registeredAt < 2018-02-13
```

**範例：Amazon EC2 執行個體 ID**  
下列運算式會選取具有下列 Amazon EC2 執行個體 ID 的執行個體。

```
ec2InstanceId in ['i-abcd1234', 'i-wxyx7890']
```

# Amazon ECS 任務置放限制條件範例
<a name="constraint-examples"></a>

下列是任務置放條件限制的範例。

此範例使用 `memberOf` 限制條件在 T2 執行個體上置放任務。可以使用下列動作來指定：[CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html)、[UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html)、[RegisterTaskDefinition](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html) 和 [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html)。

```
"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` 任務群組中的其他任務放置到執行個體上，還要顧及其他被指定的任何任務置放策略。如需有關任務群組的詳細資訊，請參閱 [將相關的 Amazon ECS 任務分在同一組](task-groups.md)。可以使用下列動作來指定：[CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html)、[UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html)、[RegisterTaskDefinition](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html) 和 [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html)。

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

`distinctInstance` 條件限制會在不同執行個體的群組中放置每個任務。可以使用下列動作來指定：[CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html)、[UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html) 和 [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html)

Amazon ECS 會查看任務置放所需的任務狀態。例如，如果現有任務的所需狀態為 `STOPPED` (但上次狀態不是)，則儘管存在 `distinctInstance` 置放限制條件，新的傳入任務仍可置放於同一執行個體上。因此，您可能會在同一執行個體上看到 2 項上次狀態為 `RUNNING` 的任務。

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