데몬 태스크 정의
데몬 태스크 정의
Amazon ECS Managed Daemons용 데몬 태스크 정의를 만들고, 네트워크 모드, 권한 있는 기능(capabilities), PID/IPC 네임스페이스 공유, 볼륨, 지원되는 컨테이너 파라미터를 알아봐요.
출처: 문서
본문
데몬 태스크 정의는 데몬의 설계도(blueprint)예요. Amazon ECS Managed Daemons는 표준 Amazon ECS 태스크 정의와 구별되는 전용 데몬 태스크 정의 리소스를 사용해요. 데몬의 컨테이너 이미지, 리소스 요구 사항, 구성을 지정하려면 데몬 태스크 정의를 등록합니다.
데몬 태스크 정의 만들기 (Creating a daemon task definition)
AWS Management Console 또는 AWS CLI를 사용해 데몬 태스크 정의를 만들 수 있어요.
AWS Management Console 사용
- Amazon ECS 콘솔을 엽니다. 내비게이션 창에서 Daemon task definitions을 선택합니다.
- Create new daemon task definition을 선택합니다.
- Daemon task definition family에 고유한 이름을 입력합니다. 이름은 최대 255자의 영숫자, 하이픈, 밑줄을 포함할 수 있어요.
- (선택 사항) Task role에서 컨테이너에서 실행되는 애플리케이션에 권한을 부여하는 IAM 역할을 선택합니다. 컨테이너가 AWS API를 호출하지 않는다면 비워 둡니다.
- (선택 사항) Task execution role에서
ecsTaskExecutionRole을 선택합니다. Amazon ECS는 이 역할이 컨테이너 이미지를 가져오고 로그를 게시하는 데 필요해요. - (선택 사항) Task size에서 데몬에 예약할 CPU와 메모리를 지정합니다. 예를 들어 0.25 vCPU와 512 MB 메모리.
- 컨테이너 세부 정보를 구성합니다:
- Container name - 컨테이너 이름 입력 (최대 255자의 영숫자, 하이픈, 밑줄).
- Essential container - Yes 선택. 각 데몬 태스크 정의는 최소한 하나의 essential 컨테이너가 필요해요. essential 컨테이너가 실패하면 Amazon ECS가 전체 태스크를 중지해요.
- Image URI - Docker 이미지 URI 입력. Amazon ECR 이미지를 탐색하거나 Docker Hub 등의 레지스트리에서 공개 이미지를 사용할 수 있어요.
- (선택 사항) 필요에 따라 리소스 할당, 상태 검사, 환경 변수, 로그 수집, 태그를 구성합니다.
- 구성을 검토하고 Create를 선택합니다.
AWS CLI 사용
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
데몬 태스크 정의 파라미터 (Daemon task definition parameters)
데몬 태스크 정의를 등록할 때 다음 파라미터를 사용할 수 있어요.
필수 파라미터
- family - 태스크 정의 family 이름. 같은 데몬 태스크 정의의 여러 리비전을 그룹화해요.
- containerDefinitions - 데몬 태스크의 컨테이너를 설명하는
DaemonContainerDefinition객체 배열.
선택 파라미터
- cpu - 태스크 수준 CPU 단위(문자열, 예:
"256"). - memory - 태스크 수준 메모리(MiB, 문자열, 예:
"512"). - taskRoleArn - 데몬 태스크의 컨테이너에 권한을 부여하는 IAM 역할의 ARN.
- executionRoleArn - Amazon ECS container agent가 사용자를 대신해 AWS API 호출(예: Amazon ECR에서 이미지 가져오기)을 하기 위해 사용하는 IAM 역할의 ARN.
- volumes -
DaemonVolume객체 배열. 데몬 볼륨은host와sourcePath를 가진 bind mount만 지원해요. 데몬 태스크 정의는 Amazon EBS, Amazon EFS, FSx for Windows File Server, Docker 볼륨, 임시 스토리지(ephemeral storage)를 지원하지 않아요. - tags - 데몬 태스크 정의에 태그를 달기 위한 키-값 쌍 배열.
- pidMode - 데몬의 PID 네임스페이스 모드를 제어해요.
- ipcMode - 데몬의 IPC 네임스페이스 모드를 제어해요.
네트워크 모드 (Network mode)
데몬은 Amazon ECS가 자동으로 설정하는 특수 daemon_bridge 네트워크 모드를 사용해요. 데몬 태스크 정의에서는 네트워크 모드를 지정할 수 없어요. 인스턴스의 모든 데몬은 단일 네트워크 네임스페이스를 공유하며, 정적 데몬 브리지 IP 주소(IPv4의 경우 169.254.172.2, IPv6의 경우 fd00:ec2::172:2)를 통해 로컬로 접근할 수 있어요. 애플리케이션 태스크(비데몬)는 추가 네트워크 구성 없이 이 주소에서 데몬과 통신할 수 있어요.
데몬은 애플리케이션 태스크와 별도의 네트워크 네임스페이스에서 실행되므로, 비데몬 태스크는 데몬과의 포트 충돌을 걱정할 필요가 없어요. 그러나 모든 데몬 태스크가 같은 네임스페이스를 공유하므로 같은 인스턴스의 데몬들은 같은 포트에 바인딩할 수 없어요. 여러 데몬을 배포할 때는 각 데몬이 고유한 포트를 사용하도록 하세요.
권한 있는 기능 (Privileged capabilities)
Amazon ECS Managed Instances에서 데몬은 시스템 수준 작업을 위한 권한 있는(privileged) Linux capabilities를 지원해요. 보안 에이전트, 네트워크 모니터링 도구, 관측성 에이전트는 제대로 동작하려면 커널 수준 접근이 필요한 경우가 많아요.
두 가지 방식으로 capabilities를 부여할 수 있어요:
전체 권한 모드(Full privileged mode) - 모든 Linux capabilities를 컨테이너에 부여해요. 에이전트가 광범위한 시스템 접근이 필요할 때 사용하세요:
{
"containerDefinitions": [{
"name": "security-daemon",
"image": "my-security-agent:latest",
"privileged": true
}]
}
개별 capabilities(Individual capabilities) - 최소 권한 원칙에 따라 데몬이 필요한 권한만 부여해요. 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 네임스페이스 공유 (PID and IPC namespace sharing)
Amazon ECS Managed Instances에서 데몬은 PID와 IPC 네임스페이스 공유를 지원해, 애플리케이션 태스크 프로세스나 IPC 리소스에 대한 가시성이 필요한 보안 에이전트, 모니터링 도구, 관측성 데몬 같은 사용 사례를 가능하게 해요.
pidMode
- Type: String, Required: No, Valid values:
none|shared, Default:none - 데몬의 PID 네임스페이스 모드.
none이 지정되거나 값이 제공되지 않으면 데몬은 다른 태스크와 격리된 자체 PID 네임스페이스로 실행돼요.shared가 지정되면 데몬은 호스트 PID 네임스페이스에 참여해,pidMode: "host"를 사용하는 비데몬 태스크나pidMode: "shared"를 사용하는 다른 데몬이 접근할 수 있게 돼요.
ipcMode
- Type: String, Required: No, Valid values:
none|shared, Default: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 리소스에 접근할 수 있어요.
볼륨 (Volumes)
Managed Daemons는 sourcePath 사양을 가진 호스트 볼륨을 사용하는 bind mount를 지원해요. 이를 통해 데몬 컨테이너가 호스트 디렉터리를 마운트해 기본 Amazon EC2 인스턴스의 로그, 지표, 시스템 정보에 접근할 수 있어요. 로그 수집 에이전트, 지표 내보내기 도구, 보안 스캐너가 호스트 수준 데이터에 대한 가시성을 얻기 위해 주로 이 기능을 사용해요.
데몬 태스크 정의는 sourcePath가 있는 호스트 볼륨 사양을 지원해요. 데몬 볼륨은 기본 컨테이너 인스턴스의 수명 주기 동안 지속돼요.
참고 — Amazon EBS 볼륨, Amazon EFS 볼륨, FSx for Windows File Server 볼륨, Docker 볼륨, 임시 스토리지는 데몬 태스크 정의에서 지원되지 않아요. 참고 — 데몬은 서로 간에 볼륨 공유를 지원하지 않아요. 각 데몬은 자체 독립 볼륨 구성으로 운영돼요.
bind mount가 있는 로그 수집 데몬 예시:
{
"containerDefinitions": [{
"name": "log-collector",
"image": "fluent/fluentd:latest",
"mountPoints": [{
"sourceVolume": "var-log",
"containerPath": "/var/log"
}]
}],
"volumes": [{
"name": "var-log",
"host": {
"sourcePath": "/var/log"
}
}]
}
지원되는 컨테이너 파라미터 (Supported container parameters)
데몬 컨테이너 정의는 다음 파라미터를 지원해요:
- image (필수) - 컨테이너 이미지 URI
- name (필수) - 컨테이너 이름
- cpu - 컨테이너에 예약된 CPU 단위
- memory / memoryReservation - 하드 및 소프트 메모리 한도
- essential - 컨테이너가 essential인지 여부 (기본값:
true) - command / entryPoint - 컨테이너 명령 또는 진입점 오버라이드
- environment / environmentFiles / secrets - 환경 구성
- privileged - 컨테이너를 권한 모드로 실행
- user - 컨테이너를 실행할 사용자
- workingDirectory - 컨테이너 내부의 작업 디렉터리
- readonlyRootFilesystem - 루트 파일시스템을 읽기 전용으로 마운트
- mountPoints - 볼륨 마운트 지점(
host와sourcePath를 가진 bind mount만) - logConfiguration - 로깅 구성(
awslogs,splunk,awsfirelens지원) - healthCheck - 컨테이너 상태 검사 구성
- dependsOn - 컨테이너 시작 종속성
- ulimits - 리소스 한도
- systemControls - 커널 파라미터
- linuxParameters.capabilities - 추가하거나 제거할 Linux capabilities
- linuxParameters.initProcessEnabled - 컨테이너에서 init 프로세스 실행
- repositoryCredentials - 프라이빗 레지스트리용 자격 증명
- restartPolicy - 컨테이너 재시작 정책