Amazon ECS용 솔루션 아키텍처 설계
Amazon ECS용 솔루션 아키텍처 설계
애플리케이션이 컨테이너 에서 실행될 수 있도록 아키텍처를 설계해야 해요. 컨테이너는 소프트웨어 애플리케이션이 실행되는 데 필요한 모든 것을 담고 있는 표준화된 소프트웨어 개발 단위예요. 여기에는 관련 코드, 런타임, 시스템 도구, 시스템 라이브러리가 포함돼요.
출처: 문서
본문
컨테이너는 이미지 라는 읽기 전용 템플릿에서 생성돼요. 컨테이너 이미지는 애플리케이션과 그 종속성을 포함하는 정적 아티팩트예요. 이미지는 일반적으로 Dockerfile 에서 빌드돼요. Dockerfile은 컨테이너 빌드 지침이 포함된 일반 텍스트 파일이에요. 빌드된 후 이 이미지는 Amazon ECR 같은 레지스트리 에 저장되어 다운로드할 수 있어요.
이미지를 만들고 저장한 후 Amazon ECS 태스크 정의 를 만들어요. 태스크 정의는 애플리케이션의 청사진이에요. 이는 애플리케이션을 구성하는 파라미터와 하나 이상의 컨테이너를 설명하는 JSON 형식의 텍스트 파일이에요. 예를 들어 이를 사용해 이미지와 운영 체제 파라미터를 지정하고, 사용할 컨테이너, 애플리케이션에 열 포트, 태스크의 컨테이너와 함께 사용할 데이터 볼륨을 지정할 수 있어요. 태스크 정의에 사용할 수 있는 특정 파라미터는 내 특정 애플리케이션의 요구에 따라 달라져요.
태스크 정의를 정의한 후 클러스터 에서 서비스 또는 태스크로 배포해요. 클러스터는 클러스터에 등록된 용량 인프라에서 실행되는 태스크 또는 서비스의 논리적 그룹이에요. 태스크는 클러스터 내 태스크 정의의 인스턴스화(instantiation)예요. 독립 실행형 태스크를 실행하거나 서비스의 일부로 태스크를 실행할 수 있어요. Amazon ECS 서비스 를 사용해 Amazon ECS 클러스터에서 원하는 수의 태스크를 동시에 실행하고 유지할 수 있어요. 작동 방식은 어떤 태스크가 어떤 이유로 실패하거나 중지되면 Amazon ECS 서비스 스케줄러가 태스크 정의를 기반으로 다른 인스턴스를 시작해 이를 대체하고 서비스의 원하는 태스크 수를 유지한다는 것이에요.
컨테이너 에이전트 는 Amazon ECS 클러스터 내 각 컨테이너 인스턴스에서 실행돼요. 에이전트는 현재 실행 중인 태스크와 컨테이너의 리소스 사용률에 대한 정보를 Amazon ECS로 보내요. Amazon ECS에서 요청을 받을 때마다 태스크를 시작하고 중지해요.
태스크 또는 서비스를 배포한 후 다음 도구 중 하나를 사용해 배포와 애플리케이션을 모니터링할 수 있어요.
- CloudWatch
- Runtime Monitoring
용량(Capacity) 용량은 컨테이너가 실행되는 인프라예요. Amazon ECS는 클러스터에 세 가지 인프라 유형을 제공해요.
- Amazon ECS Managed Instances - AWS가 계정에서 실행되는 기본 Amazon EC2 인스턴스를 프로비저닝, 패치, 스케일링을 포함해 완전히 관리해요. 이 옵션은 성능, 비용 효율성, 운영 단순성의 최적의 균형을 제공해요.
- 서버리스(Fargate) - 인프라를 관리하지 않고 태스크가 사용하는 리소스에 대해서만 비용을 지불해요. 변동이 심한 워크로드와 빠른 시작에 이상적이에요.
- Amazon EC2 인스턴스 - 인스턴스 선택, 구성, 유지를 포함해 기본 Amazon EC2 인스턴스를 직접 관리해요.
다음과 같은 경우 Amazon ECS Managed Instances를 사용해 주세요.
- Fargate의 단순성과 기반 인프라에 대한 더 많은 제어를 원하는 경우. 예측 가능한 성능과 비용 최적화가 필요하고, AWS가 인프라 관리를 처리하면서 유연성을 유지하고 싶은 경우.
다음과 같은 경우 Fargate를 사용해 주세요.
- 인프라를 관리하지 않고 애플리케이션에 집중하고 싶은 경우. 변동이 심하거나 예측할 수 없는 워크로드가 있고, 컨테이너를 시작하면서 가장 간단한 배포 옵션을 원하는 경우.
다음과 같은 경우 Amazon EC2 인스턴스를 사용해 주세요.
- 특수 하드웨어 요구 사항(GPU 가속, 고성능 컴퓨팅)이 필요한 경우. 용량 예약이나 특정 인스턴스 유형이 필요하고, 특권(privileged) 기능이나 사용자 지정 AMI가 필요한 경우.
클러스터를 만들 때 인프라를 지정해요. 태스크 정의를 등록할 때도 인프라 유형을 지정해요. 태스크 정의는 인프라를 "시작 유형(launch type)"이라고 지칭해요. 용량 제공자도 사용할 수 있어요.
서비스 엔드포인트 서비스 엔드포인트는 IPv4(Internet Protocol version 4) 또는 IPv6(Internet Protocol version 6)를 사용해 프로그래밍 방식으로 서비스에 연결하는 데 사용하는 Amazon ECS 진입점의 URL이에요. 기본적으로 Amazon ECS에 프로그래밍 방식으로 연결하기 위해 만드는 요청은 IPv4 요청만 지원하는 서비스 엔드포인트를 사용해요. IPv4 또는 IPv6 요청으로 Amazon ECS에 프로그래밍 방식으로 연결하려면 듀얼 스택 엔드포인트를 사용할 수 있어요. 듀얼 스택 엔드포인트 사용에 대한 정보는 Using Amazon ECS dual-stack endpoints 를 참고해 주세요.
네트워킹 AWS 리소스는 서브넷에 생성돼요. EC2 인스턴스를 사용할 때 Amazon ECS는 클러스터를 만들 때 지정한 서브넷에 인스턴스를 시작해요. 태스크는 인스턴스 서브넷에서 실행돼요. Fargate 또는 온프레미스 가상 머신의 경우 태스크를 실행하거나 서비스를 만들 때 서브넷을 지정해요.
애플리케이션에 따라 서브넷은 프라이빗 또는 퍼블릭 서브넷일 수 있으며, 서브넷은 다음 AWS 리소스 중 하나에 있을 수 있어요.
- 가용 영역(Availability Zones)
- 로컬 영역(Local Zones)
- Wavelength 영역(Wavelength Zones)
- AWS 리전(AWS Regions)
- AWS Outposts
자세한 내용은 Amazon ECS applications in shared subnets, Local Zones, and Wavelength Zones 또는 Amazon Elastic Container Service on AWS Outposts 를 참고해 주세요.
다음 방법 중 하나를 사용해 애플리케이션이 인터넷에 연결하도록 할 수 있어요.
- 인터넷 게이트웨이가 있는 퍼블릭 서브넷 - 많은 대역폭이나 최소 지연 시간이 필요한 퍼블릭 애플리케이션이 있을 때 퍼블릭 서브넷을 사용해 주세요. 적용 시나리오에는 비디오 스트리밍과 게임 서비스가 있어요.
- NAT 게이트웨이가 있는 프라이빗 서브넷 - 컨테이너를 직접적인 외부 액세스로부터 보호하고 싶을 때 프라이빗 서브넷을 사용해 주세요. 적용 시나리오에는 결제 처리 시스템이나 사용자 데이터와 비밀번호를 저장하는 컨테이너가 있어요.
- AWS PrivateLink - 트래픽을 공개 인터넷에 노출하지 않고 VPC, AWS 서비스 및 온프레미스 네트워크 간에 프라이빗 연결을 원할 때 AWS PrivateLink를 사용해 주세요.
기능 액세스 Amazon ECS 계정 설정을 사용해 다음 기능에 액세스할 수 있어요.
- Container Insights - CloudWatch Container Insights는 컨테이너화된 애플리케이션과 마이크로서비스에서 나오는 메트릭과 로그를 수집, 집계, 요약해요. 메트릭에는 CPU, 메모리, 디스크, 네트워크 같은 리소스의 사용률이 포함돼요.
- awsvpc trunking - 특정 EC2 인스턴스 유형의 경우 새로 시작된 컨테이너 인스턴스에서 추가 네트워크 인터페이스(ENI)를 사용할 수 있어요.
- 태깅 권한 부여 - 사용자는
ecsCreateCluster같은 리소스를 만드는 작업에 대한 권한이 있어야 해요. 리소스 생성 작업에 태그가 지정되면 AWS는ecs:TagResource작업에 대해 추가 권한 부여를 수행해 사용자나 역할이 태그를 만들 권한이 있는지 확인해요. - Fargate FIPS-140 규정 준수 - Fargate는 민감한 정보를 보호하는 암호화 모듈에 대한 보안 요구 사항을 지정하는 FIPS-140(Federal Information Processing Standard)을 지원해요. 이는 현재 미국 및 캐나다 정부 표준이며, FISMA(Federal Information Security Management Act) 또는 FedRAMP(Federal Risk and Authorization Management Program)를 준수해야 하는 시스템에 적용돼요.
- Fargate 태스크 퇴역 시간 변경 - 패치를 위해 Fargate 태스크가 퇴역하기 전 대기 기간을 구성할 수 있어요.
- 듀얼 스택 VPC - 태스크가 IPv4, IPv6 또는 둘 다로 통신할 수 있게 허용해요.
- Amazon Resource Name(ARN) 형식 - 태깅 권한 부여 같은 특정 기능은 새 Amazon Resource Name(ARN) 형식을 요구해요.
자세한 내용은 Access Amazon ECS features with account settings 를 참고해 주세요.
IAM 역할 IAM 역할은 계정에 만들 수 있는 특정 권한을 가진 IAM ID예요. Amazon ECS에서 컨테이너나 서비스 같은 Amazon ECS 리소스에 권한을 부여하는 역할을 만들 수 있어요. 일부 Amazon ECS 기능은 역할이 필요해요. 자세한 내용은 IAM roles for Amazon ECS 를 참고해 주세요.
로깅 로깅과 모니터링은 Amazon ECS 워크로드의 신뢰성, 가용성, 성능을 유지하는 중요한 측면이에요. 다음 옵션을 사용할 수 있어요.
- Amazon CloudWatch logs - 로그를 Amazon CloudWatch로 라우팅
- FireLens for Amazon ECS - 로그를 AWS 서비스 또는 AWS Partner Network 목적지로 라우팅해 로그 저장 및 분석. AWS Partner Network는 고객 제품을 빌드, 마케팅, 판매하기 위해 프로그램, 전문성, 리소스를 활용하는 파트너의 글로벌 커뮤니티예요.
컨테이너 이미지 모범 사례 다음은 Amazon ECS 컨테이너 이미지의 핵심 원칙이에요.
- 모든 종속성을 이미지에 포함
- 컨테이너당 하나의 프로세스 실행
- 정상적인 종료(graceful shutdown)를 위해 SIGTERM 처리
- 로그를 stdout과 stderr로 작성
- 고유한 태그 사용, 프로덕션에서 latest 회피