

# 대몬 태스크 정의
<a name="managed-daemons-task-definitions"></a>

대몬 태스크 정의는 대몬의 블루프린트입니다. Amazon ECS Managed Daemons는 표준 Amazon ECS 태스크 정의와는 다른 전용 대몬 태스크 정의 리소스를 사용합니다. 대몬 태스크 정의를 등록하여 대몬의 컨테이너 이미지, 리소스 요구 사항 및 구성을 지정합니다.

## 대몬 태스크 정의 생성
<a name="managed-daemons-create-taskdef"></a>

AWS Management Console 또는 AWS CLI를 사용하여 대몬 태스크 정의를 생성할 수 있습니다.

### AWS Management Console 사용
<a name="managed-daemons-create-taskdef-console"></a>

1. Amazon ECS 콘솔을 엽니다. 탐색 창에서 **대몬 태스크 정의**를 선택합니다.

1. **새 대몬 태스크 정의 생성**을 선택합니다.

1. **대몬 태스크 정의 패밀리**에 고유한 이름을 입력합니다. 이름에 최대 255자의 영숫자, 하이픈 및 밑줄이 포함될 수 있습니다.

1. (선택 사항) **태스크 역할**에서는 컨테이너에서 실행 중인 애플리케이션에 권한을 부여하는 IAM 역할을 선택합니다. 컨테이너가 AWS API를 호출하지 않는 경우 비워 둡니다.

1. (선택 사항) **태스크 실행 역할**에서 `ecsTaskExecutionRole`을 선택합니다. Amazon ECS에서 컨테이너 이미지를 가져오고 로그를 게시하려면 이 역할이 필요합니다.

1. (선택 사항) **태스크 크기**에서 대몬에 대해 예약할 CPU 및 메모리를 지정합니다. 예: `0.25 vCPU` 및 `512 MB` 메모리.

1. 컨테이너 세부 정보 구성:
   + **컨테이너 이름** - 컨테이너 이름을 입력합니다. 이름에 최대 255자의 영숫자, 하이픈 및 밑줄이 포함될 수 있습니다.
   + **필수 컨테이너** - **예**를 선택합니다. 각 대몬 태스크 정의에는 하나 이상의 필수 컨테이너가 필요합니다. 필수 컨테이너에 장애가 발생하면 Amazon ECS는 전체 태스크를 중지합니다.
   + **이미지 URI** - Docker 이미지 URI를 입력합니다. Amazon ECR 이미지를 찾아보거나 Docker Hub 또는 기타 레지스트리의 퍼블릭 이미지를 사용할 수 있습니다.

1. (선택 사항) 필요한 경우 리소스 할당, 상태 확인, 환경 변수, 로그 수집 및 태그를 구성합니다.

1. 구성을 검토하고 **생성**을 선택합니다.

### AWS CLI 사용
<a name="managed-daemons-create-taskdef-cli"></a>

JSON 파일을 생성하고 `register-daemon-task-definition` 명령을 사용하여 대몬 태스크 정의를 등록합니다.

예제 JSON 파일:

```
{
    "family": "my-daemon-task",
    "containerDefinitions": [
        {
            "name": "daemon-container",
            "image": "public.ecr.aws/docker/library/busybox:latest",
            "essential": true,
            "command": ["sh", "-c", "while true; do echo 'Daemon running'; sleep 30; done"],
            "memoryReservation": 512
        }
    ]
}
```

다음 명령을 실행하여 대몬 태스크 정의 등록:

```
aws ecs register-daemon-task-definition --cli-input-json file://daemon-taskdef.json
```

## 대몬 태스크 정의 파라미터
<a name="managed-daemons-taskdef-parameters"></a>

대몬 태스크 정의를 등록할 때 다음 파라미터를 사용할 수 있습니다.

**필수 파라미터**
+ `family` - 태스크 정의 패밀리 이름입니다. 동일한 대몬 태스크 정의의 여러 개정을 그룹화합니다.
+ `containerDefinitions` - 대몬 태스크의 컨테이너를 설명하는 `DaemonContainerDefinition` 객체 배열입니다.

**선택적 파라미터**
+ `cpu` - 태스크 수준 CPU 단위 문자열(예: `"256"`).
+ `memory` - 태스크 수준 메모리 문자열(MiB 단위, 예: `"512"`).
+ `taskRoleArn` - 대몬 태스크의 컨테이너에 권한을 부여하는 IAM 역할의 ARN입니다.
+ `executionRoleArn` - Amazon ECS 컨테이너 에이전트가 사용자를 대신하여 AWS API를 호출하는 데 사용하는 IAM 역할의 ARN입니다(예: Amazon ECR에서 이미지 가져오기).
+ `volumes` – `DaemonVolume` 객체의 배열입니다. 대몬 볼륨은 `host` 및 `sourcePath`를 사용한 바인드 탑재만 지원합니다. 대몬 태스크 정의는 Amazon EBS, Amazon EFS, FSx for Windows File Server, Docker 볼륨 또는 임시 스토리지를 지원하지 않습니다.
+ `tags` - 대몬 태스크 정의에 태그를 지정하는 키-값 페어의 배열입니다.
+ `pidMode` - 대몬의 PID 네임스페이스 모드를 제어합니다.
+ `ipcMode` - 대몬의 IPC 네임스페이스 모드를 제어합니다.

## 네트워크 모드
<a name="managed-daemons-network-mode"></a>

대몬은 Amazon ECS가 자동으로 설정하는 특수 `daemon_bridge` 네트워크 모드를 사용합니다. 대몬 태스크 정의에서 네트워크 모드를 지정할 수 없습니다. 인스턴스의 모든 대몬은 단일 네트워크 네임스페이스를 공유하고 정적 대몬 브리지 IP 주소(IPv4의 경우 `169.254.172.2`, IPv6의 경우 `fd00:ec2::172:2`)를 통해 로컬에서 액세스할 수 있습니다. 애플리케이션 태스크(대몬이 아님)는 추가 네트워크 구성 없이 이 주소의 대몬과 통신할 수 있습니다.

대몬은 애플리케이션 태스크와는 별도의 네트워크 네임스페이스에서 실행되므로 대몬이 아닌 태스크는 대몬과의 포트 충돌에 대해 걱정할 필요가 없습니다. 하지만 모든 대몬 태스크는 동일한 네임스페이스를 공유하므로 동일한 인스턴스의 대몬은 동일한 포트에 바인딩할 수 없습니다. 여러 대몬을 배포할 때 각 대몬이 고유한 포트를 사용해야 합니다.

## 권한 있는 기능
<a name="managed-daemons-privileged"></a>

Amazon ECS 관리형 인스턴스에서 대몬은 시스템 수준 작업에 대해 권한 있는 Linux 기능을 지원합니다. 보안 에이전트, 네트워크 모니터링 도구 및 관찰성 에이전트가 제대로 작동하려면 커널 수준 액세스가 필요한 경우가 많습니다.

다음 두 가지 방법으로 기능 권한을 부여할 수 있습니다.

**전체 권한 모드**는 컨테이너에 모든 Linux 기능을 부여합니다. 에이전트에 광범위한 시스템 액세스가 필요한 경우 이 옵션을 사용합니다.

```
{
    "containerDefinitions": [{
        "name": "security-daemon",
        "image": "my-security-agent:latest",
        "privileged": true
    }]
}
```

**개별 기능**은 최소 권한 원칙에 따라 대몬에 필요한 권한만 부여합니다. `linuxParameters.capabilities` 필드를 사용하여 `SYS_ADMIN`, `NET_ADMIN`, `SYS_PTRACE`, `BPF`, `PERFMON` 등의 개별 기능을 추가합니다.

```
{
    "containerDefinitions": [{
        "name": "monitoring-daemon",
        "image": "my-monitoring-agent:latest",
        "linuxParameters": {
            "capabilities": {
                "add": ["NET_ADMIN", "SYS_PTRACE"]
            }
        }
    }]
}
```

## PID 및 IPC 네임스페이스 공유
<a name="managed-daemons-namespace-sharing"></a>

Amazon ECS 관리형 인스턴스에서 대몬은 PID 및 IPC 네임스페이스 공유를 지원하여 애플리케이션 태스크 프로세스 또는 IPC 리소스에 대한 가시성이 필요한 보안 에이전트, 모니터링 도구 및 관찰성 대몬과 같은 사용 사례를 가능하게 합니다.

`pidMode`  
유형: 문자열  
필수 여부: 아니요  
유효한 값: `none` \| `shared`  
기본값: `none`  
대몬의 PID 네임스페이스 모드입니다. `none`이 지정되거나 값이 제공되지 않으면 대몬은 다른 태스크로부터 격리된 자체 PID 네임스페이스에서 실행됩니다. `shared`가 지정되면 대몬은 호스트 PID 네임스페이스에 조인하여 `pidMode: "host"`를 사용하는 비대몬 태스크나 `pidMode: "shared"`를 사용하는 다른 대몬에서 액세스할 수 있게 됩니다.

`ipcMode`  
유형: 문자열  
필수 여부: 아니요  
유효한 값: `none` \| `shared`  
기본값: `none`  
대몬의 IPC 네임스페이스 모드입니다. `none`이 지정되거나 값이 제공되지 않으면 대몬은 다른 태스크로부터 격리된 자체 IPC 네임스페이스에서 실행됩니다. `shared`가 지정되면 대몬은 호스트 IPC 네임스페이스에 조인하여 `ipcMode: "host"`를 사용하는 비대몬 태스크나 `ipcMode: "shared"`를 사용하는 다른 대몬에서 액세스할 수 있게 됩니다.

다음 예제는 PID 및 IPC 네임스페이스 공유가 모두 활성화된 대몬 태스크 정의를 보여줍니다.

```
{
    "family": "my-monitoring-daemon",
    "pidMode": "shared",
    "ipcMode": "shared",
    "containerDefinitions": [
        {
            "name": "monitoring-agent",
            "image": "public.ecr.aws/my-company/monitoring-agent:latest",
            "essential": true
        }
    ]
}
```

`pidMode`가 `shared`로 설정된 대몬과 PID 네임스페이스를 공유하려면 비대몬 태스크는 태스크 정의에 `pidMode: "host"`를 지정해야 합니다. 이렇게 하면 태스크의 컨테이너가 대몬의 프로세스를 보고 프로세스 모니터링, 신호 전송 등의 사용 사례를 사용할 수 있습니다.

`ipcMode`가 `shared`로 설정된 대몬과 IPC 네임스페이스를 공유하려면 비대몬 태스크는 태스크 정의에 `ipcMode: "host"`를 지정해야 합니다. 이렇게 하면 태스크의 컨테이너가 공유 메모리 세그먼트, 메시지 대기열 등의 대몬의 IPC 리소스에 액세스할 수 있습니다.

## 볼륨
<a name="managed-daemons-volumes"></a>

Managed Daemons는 `sourcePath`가 지정된 호스트 볼륨을 사용하는 바인드 탑재를 지원합니다. 이를 통해 대몬 컨테이너는 호스트 디렉터리를 탑재하여 기본 Amazon EC2 인스턴스의 로그, 지표 및 시스템 정보에 액세스할 수 있습니다. 로그 수집 에이전트, 지표 내보내기 및 보안 스캐너는 일반적으로 이를 사용하여 호스트 수준 데이터에 대한 가시성을 확보합니다.

대몬 태스크 정의는 `sourcePath`에서 호스트 볼륨 사양을 지원합니다. 대몬 볼륨은 기본 컨테이너 인스턴스의 수명 주기 동안 유지됩니다.

**참고**  
Amazon EBS volumes, Amazon EFS volumes, FSx for Windows File Server 볼륨, Docker 볼륨 및 임시 스토리지는 대몬 태스트 정의에서 지원되지 않습니다.

**참고**  
대몬은 서로 볼륨 공유를 지원하지 않습니다. 각 대몬은 자체 독립 볼륨 구성으로 작동합니다.

다음 예제는 바인드 탑재가 있는 로그 수집기 대몬을 보여줍니다.

```
{
    "containerDefinitions": [{
        "name": "log-collector",
        "image": "fluent/fluentd:latest",
        "mountPoints": [{
            "sourceVolume": "var-log",
            "containerPath": "/var/log"
        }]
    }],
    "volumes": [{
        "name": "var-log",
        "host": {
            "sourcePath": "/var/log"
        }
    }]
}
```

## 지원되는 컨테이너 파라미터
<a name="managed-daemons-container-params"></a>

대몬 컨테이너 정의에서 정의하는 파라미터:
+ `image`(필수) - 컨테이너 이미지 URI
+ `name`(필수) - 컨테이너 이름
+ `cpu` - 컨테이너용으로 예약된 CPU 단위
+ `memory` / `memoryReservation` - 하드 및 소프트 메모리 제한
+ `essential` - 컨테이너의 필수 여부(기본값: true)
+ `command` / `entryPoint` - 컨테이너 명령 또는 진입점 재정의
+ `environment` / `environmentFiles` / `secrets` - 환경 구성
+ `privileged` - 권한 있는 모드에서 컨테이너 실행
+ `user` - 컨테이너를 실행할 사용자
+ `workingDirectory` - 컨테이너 내부의 작업 디렉터리
+ `readonlyRootFilesystem` - 읽기 전용으로 루트 파일 시스템 탑재
+ `mountPoints` - 볼륨 탑재 지점(호스트 및 sourcePath 포함 바인드 탑재)
+ `logConfiguration` - 로깅 구성(awslogs, splunk, awsfirelens 지원)
+ `healthCheck` - 컨테이너 상태 확인 구성
+ `dependsOn` - 컨테이너 시작 종속성
+ `ulimits` - 리소스 제한
+ `systemControls` - 커널 파라미터
+ `linuxParameters.capabilities` - 추가 또는 삭제를 위한 Linux 기능
+ `linuxParameters.initProcessEnabled` - 컨테이너에서 init 프로세스 실행
+ `repositoryCredentials` - 프라이빗 레지스트리에 대한 자격 증명
+ `restartPolicy` - 컨테이너 재시작 정책