

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

# Amazon ECS 如何在容器執行個體上置放任務
<a name="task-placement"></a>

您可以使用任務置放來設定 Amazon ECS，將任務置放在符合特定條件 (例如可用區域或執行個體類型) 的容器執行個體上。

下列是任務置放元件：
+ 任務置放策略 – 用於選取容器執行個體進行任務置放或選取任務進行終止的演算法。例如，Amazon ECS 可以隨機選取容器執行個體，也可以選取讓任務均勻分佈到一組執行個體的容器執行個體。
+ 任務群組 – 一組相關任務，例如資料庫任務。
+ 任務置放限制條件 – 必須符合這些規則才能在容器執行個體上置放任務。若不符合限制條件，則任務不會置放且保持 `PENDING` 狀態。例如，您可以使用限制條件，僅將任務置放在特定執行個體類型上。

Amazon ECS 針對不同容量選項有不同的演算法。

## Amazon ECS 受管執行個體
<a name="managed-instances-launch-type"></a>

對於在 Amazon ECS 受管執行個體上執行的任務，Amazon ECS 必須決定任務的置放位置，以及縮減任務計數時要終止的任務。Amazon ECS 會根據容量提供者啟動範本中指定的執行個體需求、任務定義中指定的需求 (例如 CPU 與記憶體)，以及任務置放限制條件來作出此決定。

**注意**  
Amazon ECS 受管執行個體不支援任務置放策略。Amazon ECS 將盡力將任務分散至可存取的可用區域。

Amazon ECS 放置任務時，會使用下列程序來選取容器執行個體：

1. 識別滿足任務定義中 CPU、GPU、記憶體與連接埠需求的容器執行個體。

1. 識別滿足任務置放限制條件的容器執行個體。

1. 識別滿足容量提供者啟動範本中指定執行個體需求的容器執行個體。

1. 選取容器執行個體進行任務置放。

## EC2
<a name="ec2-launch-type"></a>

對於採用 EC2 啟動類型的任務，Amazon ECS 必須根據任務定義中所指定的需求 (例如 CPU 與記憶體)，決定任務置放位置。同樣地，當您縮減任務計數時，Amazon ECS 必須判斷要終止的任務。您可以套用任務置放策略和限制條件，來自訂 Amazon ECS 如何放置和終止任務。

預設任務置放策略取決於是手動執行任務 (獨立任務) 還是在某項服務中執行任務。如果任務是作為 Amazon ECS 服務的一部分來執行，任務置放策略會是使用 `attribute:ecs.availability-zone` 來 `spread`。不在服務中的任務沒有預設任務置放限制條件。如需詳細資訊，請參閱[在 Amazon ECS 上為容器排程](scheduling_tasks.md)。

**注意**  
任務置放策略是一種最佳作法。即使最佳置放選項無法使用，Amazon ECS 仍然會嘗試放置任務。不過，任務置放限制條件具有約束性，且可能妨礙任務置放。

您可以同時使用任務置放策略和限制條件。例如，您可以使用任務放置策略和任務放置限制，根據每個可用區域內的記憶體，跨可用區域和分箱封裝任務來分配工作，但僅適用於 G2 執行個體。

Amazon ECS 放置任務時，會使用下列程序來選取容器執行個體：

1. 識別滿足任務定義中 CPU、GPU、記憶體與連接埠需求的容器執行個體。

1. 識別滿足任務置放限制條件的容器執行個體。

1. 識別滿足任務置放策略的容器執行個體。

1. 選取容器執行個體進行任務置放。

## Fargate
<a name="fargate-launch-type"></a>

使用 Fargate 的任務不支援任務置放策略與限制條件。Fargate 將盡力將任務分散至可存取的可用區域。如果容量提供者同時包含 Fargate 和 Fargate Spot，則每個容量提供者的分散行為均各自獨立。

# Amazon ECS 受管執行個體自動擴展與任務置放
<a name="managed-instance-auto-scaling"></a>

Amazon ECS 受管執行個體使用智慧型演算法自動擴展叢集容量，並在整個基礎結構中有效率地置放任務。了解這些演算法的運作方式可協助您最佳化服務組態，並對置放行為進行疑難排解。

## 任務置放演算法
<a name="managed-instance-task-placement-algorithm"></a>

Amazon ECS 受管執行個體使用複雜的置放演算法，在排程任務時平衡可用性、資源使用率與網路需求。

### 可用區域分佈
<a name="managed-instance-az-spread-behavior"></a>

依預設，Amazon ECS 受管執行個體會將任務分佈到多個可用區域，以便優先考慮可用性：
+ 對於具有多項任務的服務，Amazon ECS 受管執行個體會盡可能確保分佈在不同可用區域中的至少 3 個執行個體
+ 此行為提供了容錯能力，但可能導致每個執行個體的資源使用率降低
+ 優先考慮可用區域分佈，而非裝箱最佳化

### 裝箱行為
<a name="managed-instance-bin-packing"></a>

雖然 Amazon ECS 受管執行個體可以執行裝箱以最大化資源使用率，但此行為會受到網路組態影響：
+ 若要實現裝箱，請將服務設定為使用單一子網路
+ 多子網路組態會優先考慮可用區域分佈，而非資源密度
+ 裝箱更可能發生在初始服務啟動期間，而非事件擴展期間

### ENI 密度考量
<a name="managed-instance-eni-density"></a>

對於使用 `awsvpc` 網路模式的服務，Amazon ECS 受管執行個體在作出置放決策時會考慮彈性網路介面 (ENI) 密度：
+ `awsvpc` 模式中的每項任務都需要專用的 ENI
+ 執行個體類型具有影響任務密度的不同 ENI 限制
+ 選取目標執行個體時，Amazon ECS 受管執行個體會考量 ENI 可用性

**注意**  
為最佳化置放決策，我們正在持續改進 ENI 密度計算。

## 容量提供者決策邏輯
<a name="managed-instance-capacity-provider-decisions"></a>

Amazon ECS 受管執行個體容量提供者會基於多種因素作出擴展與置放決策：

資源需求  
待定任務的 CPU、記憶體與網路需求

執行個體可用性  
現有執行個體的目前容量與使用率

網路限制條件  
子網路組態與 ENI 可用性

可用區域分佈  
跨多個可用區域維持容錯能力

## 組態選項
<a name="managed-instance-configuration-options"></a>

### 子網路選取策略
<a name="managed-instance-subnet-strategy"></a>

子網路組態會顯著影響任務置放行為：

多個子網路 (預設)  
優先考慮可用區域分佈以實現高可用性  
可能會導致每個執行個體的資源使用率降低  
建議用於需要容錯能力的生產工作負載

單一子網路  
啟用裝箱以提高資源使用率  
將任務集中在一個可用區域，以降低容錯能力  
適用於開發或成本最佳化工作負載

### 網路模式考量
<a name="managed-instance-network-mode-considerations"></a>

您選擇的網路模式會影響置放決策：
+ `awsvpc` 模式 – 每項任務都需要專用 ENI，用於限制每個執行個體的任務密度
+ `host` 模式 – 任務會直接使用主機的網路，置放主要由資源可用性驅動

### CPU 架構考量事項
<a name="managed-instance-cpu-architecture-considerations"></a>

`cpuArchitecture` 您在任務定義中指定的 用於在特定架構上放置任務。如果您未指定 `cpuArchitecture`，Amazon ECS 會根據容量提供者組態，嘗試在任何可用的 CPU 架構上放置任務。您可指定為 `X86_64` 或 `ARM64`。

## 對任務置放進行疑難排解
<a name="managed-instance-troubleshooting-placement"></a>

### 常見置放模式
<a name="managed-instance-common-placement-patterns"></a>

了解預期的置放模式有助於區分正常行為與潛在問題：

分散式分佈  
在部分利用的多個執行個體上分佈任務  
使用多個子網路時的正常行為  
表示優先考慮可用性而非資源效率

集中式置放  
在使用率較高的較少執行個體上置放多項任務  
使用單一子網路組態時的預期行為  
可能在初始服務啟動期間發生

不均勻分佈  
某些執行個體使用率很高，而某些執行個體未得到充分利用  
可能表示 ENI 限制或資源限制條件  
建議檢閱執行個體類型與網路組態

### 最佳化置放行為
<a name="managed-instance-placement-optimization"></a>

若要針對特定需求最佳化任務置放：

1. 評估可用性需求與成本最佳化需求

1. 根據優先順序選擇適當的子網路組態

1. 為網路模式選取具有足夠 ENI 容量的執行個體類型

1. 監控置放模式並視需要調整組態

## 最佳實務
<a name="managed-instance-best-practices"></a>
+ **對於生產工作負載** – 跨不同可用區域使用多個子網路以確保高可用性，接受資源使用率方面的權衡
+ **對於開發或測試** – 考慮使用單一子網路組態，最大化資源使用率並降低成本
+ **對於 `awsvpc` 模式** – 選擇具有足夠 ENI 容量的執行個體類型，避免出現置放限制條件
+ **對於成本最佳化** – 監控使用率模式並調整服務組態，平衡可用性與效率
+ **對於疑難排解** – 調查意外置放模式時，請檢閱子網路組態與網路模式

# 使用策略來定義 Amazon ECS 任務置放
<a name="task-placement-strategies"></a>

對於採用 EC2 啟動類型的任務，Amazon ECS 必須根據任務定義中所指定的需求 (例如 CPU 與記憶體)，決定任務置放位置。同樣地，當您縮減任務計數時，Amazon ECS 必須判斷要終止的任務。您可以套用任務置放策略和限制條件，來自訂 Amazon ECS 如何放置和終止任務。

預設任務置放策略取決於是手動執行任務 (獨立任務) 還是在某項服務中執行任務。如果任務是作為 Amazon ECS 服務的一部分來執行，任務置放策略會是使用 `attribute:ecs.availability-zone` 來 `spread`。不在服務中的任務沒有預設任務置放限制條件。如需詳細資訊，請參閱[在 Amazon ECS 上為容器排程](scheduling_tasks.md)。

**注意**  
任務置放策略是一種最佳作法。即使最佳置放選項無法使用，Amazon ECS 仍然會嘗試放置任務。不過，任務置放限制條件具有約束性，且可能妨礙任務置放。

您可以同時使用任務置放策略和限制條件。例如，您可以使用任務放置策略和任務放置限制，根據每個可用區域內的記憶體，跨可用區域和分箱封裝任務來分配工作，但僅適用於 G2 執行個體。

Amazon ECS 放置任務時，會使用下列程序來選取容器執行個體：

1. 識別滿足任務定義中 CPU、GPU、記憶體與連接埠需求的容器執行個體。

1. 識別滿足任務置放限制條件的容器執行個體。

1. 識別滿足任務置放策略的容器執行個體。

1. 選取容器執行個體進行任務置放。

您可以使用 `placementStrategy` 參數，在服務定義或任務定義中指定任務置放策略。

```
"placementStrategy": [
    {
        "field": "The field to apply the placement strategy against",
        "type": "The placement strategy to use"
    }
]
```

您可以在執行任務 ([RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html))、建立新服務 ([CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html)) 或更新現有服務 ([UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html)) 時指定策略。

下表說明可用的類型與欄位。


| type | 有效欄位值 | 
| --- | --- | 
| binpack 任務會放置於容器執行個體上，以便保留最少量的未使用 CPU 或記憶體。此策略會將使用中的容器執行個體數量減至最少。 當使用此策略並採取縮減動作時，Amazon ECS 會終止任務。此策略根據任務終止後保留在容器執行個體上的資源量來執行此操作。在任務終止後保留最多可用資源的容器執行個體，會終止該任務。 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/task-placement-strategies.html)  | 
| random 隨機放置任務。 | 未使用 | 
| spread根據指定的值平均放置任務。 服務任務會根據該服務的任務進行散佈。獨立的任務會以同一任務群組的任務為基礎分配。如需有關任務群組的詳細資訊，請參閱 [將相關的 Amazon ECS 任務分在同一組](task-groups.md)。當使用 `spread` 策略並執行縮減動作時，Amazon ECS 會選擇個在可用區域之間保持平衡的任務進行終止。在一個可用區域內，任務會被隨機選取。 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/task-placement-strategies.html)  | 

任務放置策略也可以為現有服務更新。如需詳細資訊，請參閱[Amazon ECS 如何在容器執行個體上置放任務](task-placement.md)。

您可以透過依照您希望執行的順序建立策略陣列來建立使用多個策略的任務放置策略。例如，如果您想要跨可用區域分散任務，然後在每個可用區域內根據記憶體對任務進行分箱封裝，請指定可用區域策略，然後指定記憶體策略。如需策略範例，請參閱 [Amazon ECS 任務置放策略範例](strategy-examples.md)。

# Amazon ECS 任務置放策略範例
<a name="strategy-examples"></a>

您可以使用下列動作指定任務置放策略：[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)。

**Topics**
+ [將任務平均分佈至可用區域](#even-az)
+ [將任務平均分佈至所有執行個體](#even-instance)
+ [根據記憶體對任務進行分箱封裝](#binpack)
+ [隨機放置任務。](#random)
+ [將任務平均分佈至各個可用區域，然後將任務平均分佈至每個可用區域內的執行個體](#az-instance)
+ [將任務平均分佈至各個可用區域，然後在每個可用區域內根據記憶體對任務進行分箱封裝](#az-memory)
+ [將任務平均分佈至執行個體，然後根據記憶體對任務進行分箱封裝](#instance-memory)

## 將任務平均分佈至可用區域
<a name="even-az"></a>

下列策略會將任務平均分散到各個可用區域。

```
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    }
]
```

## 將任務平均分佈至所有執行個體
<a name="even-instance"></a>

下列策略會將任務平均分散到所有執行個體。

```
"placementStrategy": [
    {
        "field": "instanceId",
        "type": "spread"
    }
]
```

## 根據記憶體對任務進行分箱封裝
<a name="binpack"></a>

下列策略會根據記憶體對任務進行分箱封裝。

```
"placementStrategy": [
    {
        "field": "memory",
        "type": "binpack"
    }
]
```

## 隨機放置任務。
<a name="random"></a>

下列策略會隨機放置任務。

```
"placementStrategy": [
    {
        "type": "random"
    }
]
```

## 將任務平均分佈至各個可用區域，然後將任務平均分佈至每個可用區域內的執行個體
<a name="az-instance"></a>

下列策略會將任務平均分散到各個可用區域，然後將任務平均分散到每個可用區域內的執行個體。

```
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    },
    {
        "field": "instanceId",
        "type": "spread"
    }
]
```

## 將任務平均分佈至各個可用區域，然後在每個可用區域內根據記憶體對任務進行分箱封裝
<a name="az-memory"></a>

下列策略會將任務平均分散到各個可用區域，然後根據每個可用區域內的記憶體對任務進行分箱封裝。

```
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    },
    {
        "field": "memory",
        "type": "binpack"
    }
]
```

## 將任務平均分佈至執行個體，然後根據記憶體對任務進行分箱封裝
<a name="instance-memory"></a>

下列策略會將任務平均分佈至所有執行個體，然後在每個執行個體內根據記憶體對任務進行分箱封裝。

```
"placementStrategy": [
    {
        "field": "instanceId",
        "type": "spread"
    },
    {
        "field": "memory",
        "type": "binpack"
    }
]
```

# 將相關的 Amazon ECS 任務分在同一組
<a name="task-groups"></a>

您可以識別一組相關任務，並將其放置在任務群組中。在使用 `spread` 任務置放策略時，會將所有具有相同任務群組名稱的任務視為一組。例如，假設您在一個叢集執行不同的應用程式，例如資料庫和 Web 伺服器。為了確保您在各個可用區域中之資料庫的平衡，請將它們新增至名為 `databases` 的任務群組，然後使用 `spread` 任務置放策略。如需詳細資訊，請參閱[使用策略來定義 Amazon ECS 任務置放](task-placement-strategies.md)。

任務群組也可用作任務放置限制條件。當您在 `memberOf` 限制條件中指定任務群組時，任務只會傳送到在指定任務群組中執行的容器執行個體。如需範例，請參閱 [Amazon ECS 任務置放限制條件範例](constraint-examples.md)。

根據預設，若未指定自訂任務群組名稱，獨立任務會使用任務定義系列名稱 (如 `family:my-task-definition`) 做為任務群組名稱。若任務做為服務的一部分啟動，它將使用服務名稱做為任務群組名稱，而且該名稱無法被變更。

任務群組需符合下列需求。
+ 任務群組名稱必須在 255 個字元以下。
+ 每個任務只能在一個群組中。
+ 啟動任務之後，就無法修改其任務群組。

# 定義 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"
    }
]
```