설명
ECS 태스크 정의의 network_mode는 태스크의 네트워크 연결 방식을 정합니다. Fargate는 awsvpc를 요구합니다. EC2 기반 태스크에서는 운영체제와 워크로드에 따라 다른 모드도 사용할 수 있으며, none처럼 외부 네트워크 통신을 차단하는 모드가 항상 취약한 것은 아닙니다.
awsvpc는 태스크에 별도 네트워크 인터페이스를 제공해 태스크 단위로 보안 그룹을 적용할 수 있게 합니다. 이 모드를 선택해도 보안 그룹, 서브넷과 라우팅을 적절히 제한해야 합니다.
잠재적 영향
- 실행 환경에서 지원하지 않는 모드를 사용하면 태스크 등록이나 실행에 실패할 수 있습니다.
- 필요한 통신보다 넓게 허용하면 태스크나 호스트에 대한 접근 범위가 의도보다 커질 수 있습니다.
해결 방법
- Fargate에서는
network_mode: awsvpc를 사용하세요. EC2에서는 호스트 공유와 포트 매핑 요구를 확인하고 워크로드에 맞는 모드를 선택하세요. awsvpc서비스에는 적절한 서브넷과 최소 권한의 보안 그룹을 지정하세요.- 태스크 정의 변경 후 새 리비전을 서비스에 적용하고 포트, 로드 밸런서와 필요한 외부 연결을 점검하세요.
예시
네트워크 모드를 비교하는 발췌입니다. 기본 NGINX 이미지의 수신 포트에 맞춰 포트 매핑은 80으로 지정했습니다. 서비스의 서브넷, 보안 그룹과 실행 역할 등은 별도로 구성해야 합니다.
변경 전
yaml
- name: Task Definition 생성
community.aws.ecs_taskdefinition:
family: nginx
containers:
- name: nginx
essential: true
image: nginx
portMappings:
- containerPort: 80
hostPort: 80
launch_type: FARGATE
cpu: 512
memory: 1024
state: present
network_mode: default
Linux에서 default는 bridge로 처리되며, 이 예시의 Fargate와 호환되지 않습니다.
변경 후
yaml
- name: Task Definition 생성
community.aws.ecs_taskdefinition:
family: nginx
containers:
- name: nginx
essential: true
image: nginx
portMappings:
- containerPort: 80
hostPort: 80
launch_type: FARGATE
cpu: 512
memory: 1024
state: present
network_mode: awsvpc
Fargate에 필요한 awsvpc를 사용합니다. 태스크 정의만 등록한다고 기존 서비스가 새 리비전을 사용하는 것은 아니므로 서비스 배포도 확인하세요.