[AWS] ECS와 Kubernetes 비교에 대한 간단한 글(ECS 인프라 구축편)

Intro

안녕하세요, Noah입니다.
오늘은 Amazon ECS로 서비스를 구축하기 위한 환경 설정 방법에 대해 알아보겠습니다. ECS는 AWS에서 제공하는 강력한 컨테이너 관리 서비스로, AWS와의 통합을 통해 쉽게 컨테이너화된 애플리케이션을 운영할 수 있습니다.
이번 글에서는 인프라 구조부터 네트워킹 및 보안, 관리 및 모니터링 설정 방법, 그리고 클라우드 포메이션을 활용해 코드형 인프라(IaC) 인프라를 구축하는 방법까지 차례대로 다루어 보겠습니다.

그럼 시작해볼까요?





목차

ECS로 서비스를 구축하기 위해 필요한 환경 세팅

1. 인프라 구조도 작성

ECS 기반의 서비스 아키텍처를 설계할 때는 전체 시스템의 동작을 쉽게 파악하고 관리할 수 있는 구조도를 작성하는 것이 중요합니다. 아래는 기본적인 ECS 아키텍처 구성의 예시입니다.

  • ECS Cluster: ECS 서비스가 실행되는 컨테이너들을 관리하는 클러스터입니다.
  • Task Definition: 컨테이너의 이미지, CPU 및 메모리 할당량, 네트워크 설정 등 컨테이너의 실행 방식을 정의합니다.
  • Service: 특정 태스크가 실행되는 환경을 관리하며, 필요한 만큼의 태스크 수를 유지하고, Auto Scaling을 통해 자동으로 확장 또는 축소할 수 있습니다.
  • Application Load Balancer (ALB): ECS의 프런트엔드로, 사용자의 요청을 적절한 ECS 태스크로 라우팅합니다.
  • VPC와 서브넷: ECS 클러스터가 배포되는 가상 네트워크 환경으로, 서브넷을 통해 퍼블릭과 프라이빗 네트워크를 구성할 수 있습니다.
  • Security Group: 네트워크 접근 제어를 위해 구성하며, 각 컨테이너 및 ALB에 필요한 포트와 접근 권한을 설정합니다.

아래와 같은 ECS 기반 아키텍처 구조도를 통해 서비스 구성 요소의 관계를 쉽게 파악할 수 있습니다.

2. 관리 및 모니터링 도구 설정

ECS로 서비스 운영 시 효율적인 관리와 모니터링은 서비스 안정성을 유지하는 데 필수적입니다. AWS에서 제공하는 다양한 도구를 활용하면 ECS 환경을 효과적으로 모니터링하고 관리할 수 있습니다.

  • AWS CloudWatch: ECS 서비스의 성능 및 상태를 모니터링하는 데 가장 많이 사용되는 도구입니다. CloudWatch를 통해 CPU 및 메모리 사용량, 네트워크 트래픽 등을 모니터링할 수 있으며, 이상 징후가 발생할 경우 알림을 설정해 빠르게 대응할 수 있습니다.
  • AWS CloudTrail: 사용자의 API 호출 이력을 추적하여 ECS 서비스에 대한 접근 기록을 분석할 수 있습니다. 이를 통해 보안 침해 가능성을 모니터링하고, 서비스에 대한 변경 사항을 기록할 수 있습니다.
  • AWS X-Ray: ECS에서 실행 중인 애플리케이션의 트랜잭션을 추적하여 성능 병목을 분석하는 데 유용합니다. X-Ray는 트랜잭션을 시각화하여 서비스 간의 호출 시간, 지연 시간을 파악하는 데 도움을 줍니다.
  • ECS Insights: ECS에서 컨테이너 상태와 리소스 사용량을 실시간으로 모니터링할 수 있는 도구입니다. 특히 Fargate와의 통합을 통해 서버리스 환경에서도 컨테이너 모니터링이 가능합니다.

이와 같은 도구들을 통해 ECS 클러스터와 서비스 상태를 실시간으로 파악하고, 이상 상황 발생 시 빠르게 대응할 수 있습니다.

3. 네트워킹 및 보안 설정 방법

ECS의 네트워크 및 보안 설정은 서비스의 접근 제어와 네트워크 안정성을 위한 중요한 단계입니다. 기본적으로 VPC와 서브넷을 통해 네트워크를 구성하며, Security Group과 IAM 역할을 통해 보안을 강화할 수 있습니다.

  • VPC 및 서브넷 구성:
    • ECS 클러스터는 VPC (Virtual Private Cloud) 내에 배포되며, VPC 내에서 퍼블릭과 프라이빗 서브넷을 분리하여 배포할 수 있습니다.
    • 일반적으로 퍼블릭 서브넷에는 외부에서 접근 가능한 ALB를 배치하고, 프라이빗 서브넷에는 ECS 태스크를 배치하여 외부로부터 접근을 차단합니다.
    • 프라이빗 서브넷을 구성할 경우, NAT Gateway를 통해 ECS 태스크가 외부 네트워크와 통신할 수 있도록 설정합니다.
  • Security Group 설정:
    • Security Group은 ECS 클러스터와 ALB에 적용되어 인바운드 및 아웃바운드 트래픽을 제어합니다.
    • 예를 들어, ALB의 Security Group은 외부의 HTTP(S) 요청을 허용하도록 설정하고, ECS 클러스터의 Security Group은 ALB에서 전달되는 요청만 수락하도록 설정합니다.
  • IAM 역할:
    • ECS 서비스가 AWS의 다른 서비스에 접근할 수 있도록 IAM 역할을 설정합니다.
    • 예를 들어, ECS 태스크가 S3 버킷에 접근해야 한다면, 해당 IAM 역할에 S3 접근 권한을 추가하여 권한을 최소화한 상태로 접근할 수 있도록 합니다.

네트워크와 보안 설정은 ECS 서비스의 성능과 안전성을 높이는 데 필수적이므로, 각 서비스 및 자원에 맞는 보안 설정을 적용하는 것이 중요합니다.

AWS에서 CloudFormation을 통한 인프라 관리

Amazon Web Services(AWS)에서 인프라를 코드형으로 관리하는 대표적인 방식 중 하나가 CloudFormation입니다.
CloudFormation을 통해 환경을 코드로 정의하면, 인프라 설정을 효율적으로 추적하고 관리할 수 있을 뿐만 아니라 인프라의 상태를 일관되게 유지할 수 있습니다.
이번에는 AWS CloudFormation을 통해 실제 환경에서 인프라를 어떻게 관리하는지, 그리고 스택을 체계적으로 운영하는 방법을 요약해 보겠습니다.

1. CloudFormation을 통한 인프라 관리 방식

단일 템플릿 vs. 모듈화된 템플릿

CloudFormation 템플릿은 보통 다음 두 가지 방식으로 구성할 수 있습니다:

  • 단일 템플릿 방식: 모든 리소스를 한 파일에 정의하는 방식입니다. 환경이 단순하거나 소규모 프로젝트일 때 적합하며, 관리해야 할 파일이 하나이므로 초기 학습 곡선이 낮습니다. 그러나 리소스가 많아질수록 파일이 복잡해지고, 변경 시 충돌이 발생하기 쉬워 대규모 환경에는 적합하지 않을 수 있습니다.
  • 모듈화된 템플릿 방식: 여러 파일로 템플릿을 나누어 관리하는 방식입니다. 보통 네트워크, 애플리케이션, 보안, 로드 밸런서와 같은 기능별 파일로 나누어 관리합니다. 이렇게 하면 각 파일을 독립적으로 업데이트할 수 있어, 변경과 확장이 용이합니다. AWS에서는 StackNested Stack 기능을 통해 서로 다른 스택을 참조할 수 있어, 각 모듈이 독립적으로 작동할 수 있습니다.

예시

예를 들어, VPC 설정은 vpc.yaml, ECS 서비스 구성은 ecs_service.yaml, 그리고 보안 설정은 security.yaml과 같이 나눌 수 있습니다.
이를 통해 네트워크나 보안 설정이 변경되어도 애플리케이션에는 영향을 미치지 않고, 독립적으로 업데이트할 수 있습니다.

2. CloudFormation 스택 구성 및 업데이트

AWS에서는 CloudFormation을 통해 스택(Stack)이라는 단위로 리소스를 관리합니다. 스택은 CloudFormation 템플릿을 기반으로 생성된 리소스의 집합입니다. 다음은 스택을 설정하고 업데이트하는 기본적인 관리 과정입니다:

  1. 스택 생성
    CloudFormation 콘솔이나 AWS CLI에서 템플릿 파일을 사용해 스택을 생성합니다. 스택을 생성하면 템플릿에 정의된 리소스들이 한 번에 프로비저닝됩니다.
  2. 스택 업데이트
    인프라 설정을 변경해야 할 때는 기존 스택을 업데이트합니다. CloudFormation은 변경된 부분만 감지하여 필요한 리소스만 수정하므로 효율적입니다. 업데이트 시 Change Set 기능을 사용하면 변경 내용 미리 보기를 통해 예상 결과를 검토하고, 안전하게 업데이트할 수 있습니다.
  3. 스택 삭제
    더 이상 필요하지 않은 스택은 삭제하여 모든 리소스를 정리할 수 있습니다. 스택이 삭제되면 해당 스택에서 생성된 모든 리소스가 자동으로 삭제됩니다.

3. 스택 운영 시 중요한 AWS 관리 도구들

AWS에서 CloudFormation을 통해 안정적인 인프라 관리를 위해 다양한 도구를 활용할 수 있습니다.

  • AWS CloudTrail
    CloudFormation에서 수행된 API 호출 이력을 추적하여, 누가 언제 어떤 변경을 했는지 로그를 남깁니다. 이를 통해 변경 내역을 분석하고 보안성을 높일 수 있습니다.
  • AWS CloudWatch
    CloudWatch는 CloudFormation이 배포한 리소스의 성능을 모니터링합니다. 예를 들어, ECS의 CPU 및 메모리 사용량을 추적하거나, ALB의 트래픽 패턴을 파악할 수 있습니다.
  • AWS Config
    AWS Config는 리소스가 템플릿에 정의된 규정에 맞게 설정되어 있는지 지속적으로 검사합니다. 만약 규정에 맞지 않는 설정이 발견되면 자동으로 알림을 생성하거나 규정에 맞게 수정할 수 있습니다.
  • AWS CodePipeline
    코드 배포와 인프라 배포를 자동화하려면 CodePipeline을 사용할 수 있습니다. CodePipeline을 통해 CloudFormation 스택 업데이트와 애플리케이션 코드를 자동으로 배포하고 CI/CD 파이프라인을 구성하여 변경 사항을 효율적으로 관리합니다.

4. CloudFormation의 권장 사항과 주의사항

CloudFormation을 통한 인프라 관리는 편리하지만, 운영 중 다음 권장 사항과 주의사항을 참고해야 합니다.

  • 버전 관리
    템플릿 파일은 Git과 같은 버전 관리 시스템에서 관리하여 변경 이력을 추적하고 협업의 효율성을 높입니다.
  • 테스트 환경에서 사전 검증
    변경 사항을 바로 프로덕션에 적용하지 않고, 개발 환경이나 스테이징 환경에서 사전에 검증합니다. 특히 보안 설정, 네트워크 설정, IAM 역할 변경은 예기치 않은 접근 제한을 초래할 수 있어 검증이 필수입니다.
  • IAM 정책 최소 권한 원칙
    CloudFormation이 사용하는 IAM 역할에는 최소 권한만 부여합니다. 예를 들어, ECS 리소스를 관리할 때는 ECS 관련 권한만 부여하는 식으로 접근을 제한합니다.
  • Change Set 기능 활용
    스택 업데이트 전에 Change Set을 생성하여 예상되는 변경 사항을 미리 확인하고, 예기치 않은 리소스 변경이나 삭제를 방지합니다.

5. ECS(Fargate) 사용 시 CloudFormation을 활용해 코드형 인프라(IaC)를 구축하는 예시

코드형 인프라(IaC)를 통해 인프라를 관리하면 변경 사항을 코드로 추적할 수 있어, 안정성과 재사용성이 높아집니다. AWS에서는 CloudFormation을 통해 ECS 클러스터를 코드로 정의하고 배포할 수 있습니다.
CloudFormation을 사용하면 인프라를 코드로 관리할 수 있어, 환경의 상태를 쉽게 파악하고 필요에 따라 신속하게 복구할 수 있습니다.

  • ECS Cluster 생성: 아래는 CloudFormation 템플릿에서 ECS 클러스터를 정의하는 기본 예시입니다.

      Resources:
        MyECSCluster:
          Type: AWS::ECS::Cluster
          Properties:
            ClusterName: my-ecs-cluster
        
    
  • VPC와 서브넷 설정: ECS 클러스터가 위치할 네트워크 환경을 정의합니다.

      Resources:
        MyVPC:
          Type: AWS::EC2::VPC
          Properties:
            CidrBlock: 10.0.0.0/16
            EnableDnsSupport: true
            EnableDnsHostnames: true
        
        PublicSubnet:
          Type: AWS::EC2::Subnet
          Properties:
            VpcId: !Ref MyVPC
            CidrBlock: 10.0.1.0/24
            MapPublicIpOnLaunch: true
        
    
  • ECS Task Definition 및 서비스 설정: 태스크 정의는 컨테이너의 설정을 관리하며, 서비스는 태스크가 항상 일정 개수로 유지되도록 관리합니다.

      Resources:
        MyTaskDefinition:
          Type: AWS::ECS::TaskDefinition
          Properties:
            Family: my-task
            Cpu: "256"
            Memory: "512"
            NetworkMode: awsvpc
            RequiresCompatibilities:
              - FARGATE
            ContainerDefinitions:
              - Name: my-container
                Image: nginx
                Essential: true
                PortMappings:
                  - ContainerPort: 80
                    Protocol: tcp
        
        MyService:
          Type: AWS::ECS::Service
          Properties:
            Cluster: !Ref MyECSCluster
            TaskDefinition: !Ref MyTaskDefinition
            DesiredCount: 2
            LaunchType: FARGATE
            NetworkConfiguration:
              AwsvpcConfiguration:
                AssignPublicIp: ENABLED
                Subnets:
                  - !Ref PublicSubnet
                SecurityGroups:
                  - !Ref MySecurityGroup
        
    
  • Application Load Balancer와 연결: ALB를 추가하여 외부 요청을 처리하고, 이를 ECS 서비스에 연결합니다.

      Resources:
        MyALB:
          Type: AWS::ElasticLoadBalancingV2::LoadBalancer
          Properties:
            Name: my-alb
            Scheme: internet-facing
            Subnets:
              - !Ref PublicSubnet
        
        MyListener:
          Type: AWS::ElasticLoadBalancingV2::Listener
          Properties:
            DefaultActions:
              - Type: forward
                TargetGroupArn: !Ref MyTargetGroup
            LoadBalancerArn: !Ref MyALB
            Port: 80
            Protocol: HTTP
        
    



Outro

이번 글에서는 ECS로 서비스를 구축하기 위한 환경 세팅 방법을 다루었습니다.
인프라 구조도 작성부터 네트워크 및 보안 설정, CloudFormation을 활용한 코드형 인프라 구성까지 한눈에 볼 수 있도록 정리해 보았습니다.
ECS를 활용한 인프라 구축 과정은 처음에는 복잡하게 느껴질 수 있지만, AWS의 다양한 도구와 자동화된 설정을 통해 충분히 효율적으로 관리할 수 있습니다.

다음 글에서는 쿠버네티스 환경 설정 방법에 대해 설명드리겠습니다!

긴 글 읽어주셔서 감사합니다. 질문이 있으시면 언제든지 댓글로 남겨주세요!