

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

다음 테이블에서는 파라미터를 사용하는 방법을 설명합니다.


| 제약 유형 | 지정 가능한 경우 | 
| --- | --- | 
| distinctInstance각 활성 태스크를 서로 다른 컨테이너 인스턴스에 배치합니다.Amazon ECS는 작업 배치를 위해 원하는 작업 상태를 확인합니다. 예를 들어 기존 작업의 원하는 상태가 `STOPPED`인 경우(하지만 마지막 상태는 그렇지 않음), `distinctInstance` 배치 제약에도 불구하고 새로 들어오는 작업을 동일한 인스턴스에 배치할 수 있습니다. 따라서 동일한 인스턴스에 마지막 `RUNNING` 상태인 작업 2개가 표시될 수 있습니다. 엄격한 작업 격리를 원하는 고객은 Fargate를 사용하는 것이 좋습니다. Fargate는 하드웨어 가상화 환경에서 각 작업을 실행합니다. 이러한 컨테이너화된 워크로드는 네트워크 인터페이스, Fargate 임시 스토리지, CPU 또는 메모리를 다른 작업과 공유하지 않습니다. 자세한 내용은 [Security Overview of 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/ko_kr/AmazonECS/latest/developerguide/task-placement-constraints.html)  | 
| memberOf표현식을 충족하는 컨테이너 인스턴스에 태스크를 배치. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/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 컨테이너의 OS 버전이 호스트의 OS 버전과 일치해야 하기 때문입니다. 컨테이너 이미지의 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 리소스 이름(ARN)이 포함됩니다. 자세한 내용은 [AWS Outposts의 Amazon Elastic Container Service](using-outposts.md) 섹션을 참조하세요.

`ecs.capability.external`  
이 속성이 있으면 인스턴스가 외부 인스턴스로 식별됩니다. 자세한 내용은 [외부 인스턴스에 대한 Amazon ECS 클러스터](ecs-anywhere.md) 섹션을 참조하세요.

### 사용자 지정 속성
<a name="ecs-custom-attributes"></a>

컨테이너 인스턴스에 사용자 지정 속성을 적용할 수 있습니다. 예를 들어 이름이 "stack"이고 값이 "prod"인 속성을 정의할 수 있습니다.

사용자 정의 속성을 지정할 때 다음 사항을 고려해야 합니다.
+ `name`은 1\$1128자의 문자를 포함해야 하며 이름에는 문자(대문자 및 소문자), 숫자, 하이픈, 밑줄, 슬래시, 백슬래시 또는 마침표가 포함될 수 있습니다.
+ `value`은 1\$1128자의 문자를 포함해야 하며 이름에는 문자(대문자 및 소문자), 숫자, 하이픈, 밑줄, 마침표, @ 기호, 슬래시, 백슬래시, 콜론 또는 공백이 포함될 수 있습니다. 값은 선행 또는 후행 공백을 포함할 수 없습니다.

# 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)을 참조하세요.

**연산자**  
비교 연산자. 다음의 연산자가 지원됩니다.


|  연산자  |  설명  | 
| --- | --- | 
|  ==, 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, not

괄호를 사용하여 우선순위를 지정할 수 있습니다.

```
(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
```

**예제: 태스크 비선호도**  
다음 표현식은 database 그룹에서 태스크를 호스팅하고 있지 않은 인스턴스를 선택합니다.

```
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) 서비스 `daemon-service` 작업 그룹의 다른 작업과 함께 인스턴스에 복제본 작업을 배치하고, 함께 지정된 모든 작업 배치 전략도 적용합니다. 이 제약으로 인해 대몬(daemon) 서비스 작업이 복제 서비스 작업보다 먼저 EC2 인스턴스에 배치됩니다.

`daemon-service`를 대몬(daemon) 서비스 이름으로 바꿉니다.

```
"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` 배치 제약에도 불구하고 새로 들어오는 작업을 동일한 인스턴스에 배치할 수 있습니다. 따라서 동일한 인스턴스에 마지막 `RUNNING` 상태인 작업 2개가 표시될 수 있습니다.

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