새소식

AWS

AWS에서 Terraform, ECS Fargate 및 CloudMap을 사용하여 마이크로 서비스 인프라를 구축하는 방법 | part 1

  • -

소개

이 블로그 게시물에서는 Terraform, ECS Fargate 및 CloudMap을 사용하여 AWS에서 마이크로서비스 인프라를 구축하는 방법을 알아봅니다.

 

마이크로서비스는 애플리케이션을 잘 정의된 인터페이스를 통해 서로 통신하는 작고 독립적인 서비스 모음으로 구성하는 아키텍처 스타일입니다. 이 접근 방식에는 확장성, 유연성 및 유지 관리 용이성을 비롯한 여러 가지 이점이 있습니다.

 

AWS는 Amazon Elastic Container Service(ECS) 및 Amazon CloudMap을 포함하여 마이크로서비스 인프라를 구축하는 데 사용할 수 있는 여러 서비스를 제공합니다. ECS는 컨테이너화된 애플리케이션을 쉽게 실행, 확장 및 유지 관리할 수 있는 완전 관리형 컨테이너 오케스트레이션 서비스입니다. CloudMap은 Virtual Private Cloud(VPC) 내에서 서비스 인스턴스를 등록하고 검색할 수 있게 해주는 서비스 검색 서비스입니다.

 

인프라 배포 프로세스를 자동화하기 위해 IaC 오픈 소스인  Terraform 사용합니다 . Terraform을 사용하면 AWS 리소스를 생성하고 관리하는 데 사용할 수 있는 선언적 구성 언어로 인프라를 정의할 수 있습니다.

 

 

전제 조건

다음은 Terraform, ECS Fargate 및 CloudMap을 사용하여 AWS에서 마이크로서비스 인프라를 구축하기 위한 초기 설정단계 입니다.

  1. Terraform을 설치합니다(Terraform 설치 Guide)
  2. Administrator 권한이 있는 AWS 계정을 생성합니다.
  3. 이 자습서에서 생성할 모든 main.tf 파일에 AWS Provider를 정의합니다.(AWS Provider 정의하기)
    (Terragrunt 를 사용하여 모든 파일에서 이 코드를 반복하게 지 않을 수도 있습니다.)

이번에는 outputs을 사용하여 스택 간에 통신하기 위해 remote Terraform state를 사용합니다 .
Terraform에서 원격 상태는 원격 서버 또는 버전 제어 시스템과 같은 중앙 위치에 인프라 상태를 저장하는 방법입니다. 이는 공동 작업, 업무 분리 및 환경 격리를 비롯한 여러 시나리오에서 유용할 수 있습니다.
Terraform 상태를 원격으로 저장하는 한 가지 방법은 AWS에서 제공하는 클라우드 스토리지 서비스인 Amazon S3를 사용하는 것입니다. Terraform에서 S3를 원격 상태 백엔드로 사용하려면 s3Terraform 구성에서 백엔드를 구성할 수 있습니다.
다음은 Terraform에서 백엔드를 구성하는 방법의 예입니다.

terraform {
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "state.tfstate"
    region = "ap-northeast-2"
  }
}

이 예에서 s3백엔드로 "my-terraform-state"라는 S3 버킷을 사용하고 "state.tfstate" 키에 파일에 상태를 저장하도록 구성합니다. regison 은 S3 버킷이 있는 리전을 지정합니다.

 

 

소스 코드

예제 소스 코드 다운로드

Project 구조

  • services-apps : 게시물의 뒷부분에서 논의할 기본 nodejs express 애플리케이션입니다.
                             (uno, due, tre 세가지 어플리케이션의 소스 코드입니다.)
  • stacks : VPC, DNS, ECS, ALB, ECR 및 여러 서비스(TASK DEFINITION, ECS SERVICE)와 같은 인프라 생성을 위한 Terraform 파일입니다.

 

AWS Infrastructure

이 섹션에서는 모든 구성 요소와 인프라 구축 방법에 대해 설명합니다. 각 Resource 별로 sh 명령어로 인프라를 배포합니다.
다음 명령은 Terraform을 사용하여 인프라를 초기화하고 제공하는 데 사용되는 명령입니다.
— terraform init 명령은 Terraform 구성 디렉터리를 초기화하는 데 사용됩니다. 새 Terraform 구성을 작성하거나 버전 제어에서 기존 구성을 복제한 후 실행해야 하는 첫 번째 명령입니다.
— terraform plan 명령은 Terraform에 대한 실행 계획을 만드는 데 사용됩니다. 구성을 적용할 때 Terraform이 수행할 작업을 미리 보는 데 사용됩니다.
—terraform apply 명령은 구성의 원하는 상태 또는 terraform plan 명령에 의해 생성된 미리 결정된 작업 집합에 도달하는 데 필요한 변경 사항을 적용하는 데 사용됩니다.

 

VPC

AWS Virtual Private Cloud(VPC)는  인터넷과 격리된 가상 네트워크에서 AWS 리소스를 시작할 수 있게 해주는 클라우드 컴퓨팅 서비스입니다. VPC를 통해 사용자는 IP 주소 범위, 서브넷 및 보안 정책을 포함하여 네트워크 아키텍처를 정의하고 사용자 지정할 수 있습니다. 이 예제에서는 10줄의 코드 내에서 vpc 인프라를 제공하기 위해 terraform module 을 사용하고 있습니다.

/stacks/vpc/main.tf

module "vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name = "gyko-vpc"
  cidr = "10.0.0.0/16"

  azs             = ["ap-northeast-2a", "ap-northeast-2c"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24"]

  enable_dns_hostnames = true
  enable_dns_support   = true

  enable_nat_gateway = true
  single_nat_gateway = true

  tags = {
    group       = "gyko"
    Environment = "dev"
  }
}

 

output 섹션에 주의하십시오. 다른 스택에서 사용할 수 있도록 다음 값을 내보내는 것이 중요합니다.

/stacks/vpc/outputs.tf

output "gyko_vpc_id" {
  description = "gyko subnet private 1"
  value       = module.vpc.vpc_id
}

output "gyko_private_subnets_ids" {
  description = "gyko private subnets ids"
  value       = module.vpc.private_subnets
}

output "gyko_public_subnets_ids" {
  description = "gyko public subnets ids"
  value       = module.vpc.public_subnets
}

Deploy

$ cd stacks/vpc
$ terraform init
$ terraform plan
$ terraform apply

 

 

DNS

클라우드맵이란?

Amazon Cloud Map(클라우드 맵)은 Amazon Web Services(AWS)에서 제공하는 서비스로 클라우드 기반 애플리케이션에서 사용하는 리소스와 서비스를 검색하고 연결할 수 있습니다. 애플리케이션이 클라우드에서 실행되든 온프레미스에서 실행되든 관계없이 애플리케이션이 의존하는 리소스와 서비스를 관리하고 검색할 수 있는 간단하고 확장 가능한 방법을 제공합니다. 클라우드 맵을 사용하면 서비스의 논리적 그룹인 사용자 지정 네임스페이스를 생성하고 이러한 네임스페이스 내에서 검색하려는 리소스 및 서비스를 등록할 수 있습니다. 그런 다음 Cloud Map의 API를 사용하여 애플리케이션에서 이러한 리소스와 서비스를 검색하고 연결할 수 있습니다. Cloud Map은 DNS(도메인 이름 시스템) 및 SD(서비스 검색) 프로토콜을 사용하여 리소스 검색 및 연결을 활성화합니다.

 

 

 

코드는 다음과 같습니다.

 

/stacks/dns/main.tf

resource "aws_service_discovery_private_dns_namespace" "gyko_dns_discovery" {
  name        = var.gyko_private_dns_namespace
  description = "gyko dns discovery"
  vpc         = data.terraform_remote_state.vpc.outputs.gyko_vpc_id
}

 

var.gyko_private_dns_namespace 는 variable.tf 파일 내부에 선언된 변수입니다 .

/stacks/dns/variables.tf

variable "gyko_private_dns_namespace" {
  description = "gyko private dns namespace"
  default     = "gyko-app.test"
}

gyko-app.test 는 private internal domain 의 이름이 됩니다. 모든 마이크로 서비스의 이름은 /stacks/services/ 폴더 하위의 Infra 코드에 선언된 my-custom-microservice.gyko-app.test 와 같은 하위 도메인이 됩니다.

이 스택은 vpc 스택에 의존하므로 vpc 인프라가 AWS 계정 내에 아직 배포되지 않은 경우 이러한 리소스를 배포할 수 없습니다.

 

data "terraform_remote_state" "vpc" {
  backend = "s3"
  config = {
    bucket = "gyko-infra"
    key    = "vpc.tfstate"
    region = "ap-northeast-2"
  }
}

위의 Terraform 구성은 Amazon Simple Storage Service(S3) 버킷에 저장된 원격 상태의 데이터 소스를 정의합니다.

이름이 "vpc"인 terraform_remote_state 데이터 소스는 S3 버킷에 저장된 Terraform 구성에 정의된 리소스의 상태를 검색합니다. state는 "ap-northeast-2" 리전의 "gyko-infra" 버킷에 있는 "vpc.tfstate"라는 파일에 저장됩니다.

 

데이터 소스의 목적은 구성의 다른 리소스 및 모듈이 원격 상태에서 정의된 리소스의 출력을 참조할 수 있도록 하는 것입니다. 이는 여러 Terraform 구성 간에 리소스 또는 구성을 공유하려는 경우 또는 별도의 구성에 정의된 모듈을 사용하려는 경우에 유용할 수 있습니다.

 

데이터 소스를 사용하려면 data.terraform_remote_state.vpc.OUTPUT_NAME 구문을 사용하여 원격 상태의 출력을 참조할 수 있습니다. 여기서 "OUTPUT_NAME"은 참조하려는 출력의 이름입니다.

Deploy

$ cd stacks/dns
$ terraform init
$ terraform plan
$ terraform apply

 

ECS

Amazon Elastic Container Service(ECS) Fargate는 기본 EC2 인스턴스를 관리할 필요 없이 컨테이너를 실행할 수 있게 해주는 Amazon ECS용 완전 관리형 컴퓨팅 엔진입니다. Fargate를 사용하면 애플리케이션을 실행하는 인프라가 아니라 애플리케이션을 구축하고 실행하는 데 집중할 수 있습니다.

Terraform에서 이 aws_ecs_cluster리소스는 Amazon Elastic Container Service(ECS) 클러스터를 생성하는 데 사용됩니다. ECS 클러스터는 Amazon ECS에서 실행하는 작업 또는 서비스의 논리적 그룹입니다.

 

/stacks/ecs/main.tf

resource "aws_ecs_cluster" "gyko_ecs_cluster" {
  name = "gyko_ecs_cluster"
}

 

지금은 모든 서비스 스택 내부에 생성될 ECS 클러스터, 서비스, 작업 정의 및 관련 역할만 생성하겠습니다.

Deploy

$ cd stacks/ecs
$ terraform init
$ terraform plan
$ terraform apply

 

ALB

Amazon Web Services(AWS) Application Load Balancer(ALB)는 하나 이상의 가용 영역에서 EC2 인스턴스, 컨테이너 및 IP 주소와 같은 여러 대상에 수신 애플리케이션 트래픽을 자동으로 분산시키는 로드 밸런싱 서비스입니다.Public ALB는 인터넷에서 액세스할 수 있는 ALB입니다.인터넷에서 액세스할 수 있는 DNS 이름과 연결된 Pubilc IP 주소에서 들어오는 트래픽을 수신 대기합니다.

resource "aws_lb" "gyko_alb" {
  load_balancer_type = "application"
  subnets            = data.terraform_remote_state.vpc.outputs.gyko_public_subnets_ids
  security_groups    = ["${aws_security_group.gyko_alb_sg.id}"]
}

resource "aws_security_group" "gyko_alb_sg" {
  description = "controls access to the ALB"
  vpc_id      = data.terraform_remote_state.vpc.outputs.gyko_vpc_id

  ingress {
    protocol    = "tcp"
    from_port   = 80
    to_port     = 80
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    protocol    = "tcp"
    from_port   = 443
    to_port     = 443
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

이 Terraform 구성은 ALB에 대한 AWS Application Load Balancer(ALB) 및 Amazon Elastic Compute Cloud(EC2) 보안 그룹을 생성합니다.

이름이 "gyko_alb"인 aws_lb 리소스는 지정된 로드 밸런서 유형, 서브넷 및 보안 그룹으로 ALB를 생성합니다. 로드 밸런서 유형은 ALB임을 나타내는 "application"으로 설정됩니다. 서브넷 및 보안 그룹은 구성의 다른 위치에서 정의된 데이터 원본 및 리소스를 사용하여 지정됩니다.

 

이름이 "gyko_alb_sg"인 aws_security_group 리소스는 ALB에 대한 EC2 보안 그룹을 생성합니다. 보안 그룹에는 모든 IP 주소에서 TCP 포트 80 및 443으로 들어오는 트래픽을 허용하는 인바운드 규칙과 모든 아웃바운드 트래픽을 허용하는 아웃바운드 규칙이 있습니다.

 

앞에서 설명한 대로 VPC 스택에서 VPC 데이터를 가져옵니다.

data "terraform_remote_state" "vpc" {
  backend = "s3"
  config = {
    bucket = "gyko-infra"
    key    = "vpc.tfstate"
    region = "ap-northeast-2"
  }
}

Deploy

$ cd stacks/alb
$ terraform init
$ terraform plan
$ terraform apply

 

수고하셨습니다!!

AWS 에 모든 인프라를 배포했습니다. part2 에서는 Docker image를 저장하기 위해 ECR Repository 를 배포하고 로드밸런서에서 마이크로 서비스 클러스터로 라우팅되는 HTTP 요청을 처리하는 서비스를 생성해 보겠습니다.

 

2023.06.05 - [AWS] - AWS에서 Terraform, ECS Fargate 및 CloudMap을 사용하여 마이크로 서비스 인프라를 구축하는 방법 | part 2

 

AWS에서 Terraform, ECS Fargate 및 CloudMap을 사용하여 마이크로 서비스 인프라를 구축하는 방법 | part 2

2023.05.30 - [AWS] - AWS에서 Terraform, ECS Fargate 및 CloudMap을 사용하여 마이크로 서비스 인프라를 구축하는 방법 | part 1 AWS에서 Terraform, ECS Fargate 및 CloudMap을 사용하여 마이크로 서비스 인프라를 구축하

rhrlfdud.tistory.com

 

 

to be continued...

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.