Terraform으로 AWS ECS Fargate + Route53 웹 서비스 배포하기

Key Kim
6 min readDec 27, 2020

--

이번 글에서는 Terraform으로 컨테이너 오케스트레이션 서비스인 AWS ECS Fargate 를 생성하고, Route53을 사용해 준비한 도메인과 fargate를 연결하는 내용을 다룹니다.

개발 환경

OS : Ubuntu 18.04, 4.19.104-microsoft-standard (WSL2)

Terraform : 0.13.3

Route53 에 준비한 도메인을 등록하는 코드와, ECS Fargate 생성 코드를 서로 다른 workspace에서 작성하겠습니다.

먼저 Route53에 보유한 도메인을 등록하는 코드부터 작성해봅시다.

도메인 등록

모든 코드는 아래에 있습니다.

terraform workspace를 생성해줍시다.

terraform workspace new domain

workspace가 생성되었으면 아래와 같은 폴더 구조를 만듭니다.

main.tf

name에는 등록하려는 도메인 주소(hello.com 등 ) 가 들어가게 됩니다.

variables.tf

output.tf

도메인과 연동할 네임서버들을 출력 하도록 설정합니다.

var.tfvars

variables.tf 에 필요한 값을 매핑해줍니다.

region     = <your-region, 저의 경우 us-east-2>
access_key = <your-aws-access-key>
secret_key = <your-aws-access-secret-key>
domain = <your-domain address, 저의 경우 keykim.me>

아래 명령어를 이용해 작성한 코드의 인프라를 생성 해봅시다.

terraform init example/domain/
terraform apply -var-file=example/domain/var.tfvars example/domain

성공하면 자신의 도메인과 연결할 네임 서버들의 리스트가 output으로 나옵니다.

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.Outputs:name_server = [
"server-1",
...
]

위 네임 서버들을 도메인 관리 페이지에서 등록해주세요.

ECS Fargate + Route53

모든 코드는 아래에 있습니다.

fargate 인프라를 생성하기 위해 workspace를 변경해줍니다.

terraform workspace new fargate

아래와 같이 폴더구조를 만들어줍니다.

main.tf

network.tf

vpc, subnet 등 네트워크 관련 설정을 해줍니다.

가용성을 위해 3개의 availability zone에 각각 서비스를 배포합니다.

sg.tf

보안그룹을 설정해줍니다. 인바운드로 들어오는 80, 443을 열고, outbound는 모두 허용해줍니다.

ecr.tf

aws ecr을 생성합니다. ecs fargate는 aws ecr에 있는 이미지를 가져와서 구동시킵니다.

ecs.tf

ecs cluster를 생성합니다.

생성/삭제할 때 종속성으로 인해 문제가 발생할 수 있으므로 depends on 리스트에 ecs와 관련된 서비스들을 나열하여 관련 서비스들이 먼저 수행될 수 있도록 합니다.

acm.tf

위에서 생성한 domain에 사용할 https 인증서를 생성합니다.

route53.tf

위에서 생성한 route53 서비스 데이터를 가져오고, 생성한 https 인증서를 적용합니다.

lb.tf

ecs fargate 부하분산을 수행해줄 로드밸런서입니다.

autoscaling.tf

컨테이너에 부하가 심해질 경우 오토스케일링을 적용하는 룰입니다.

최대 3개, 최소 1개를 범위안에서 컨테이너가 생성되며 80%의 메모리와 60% CPU 사용률을 기반으로 오토스케일이 적용됩니다.

logs.tf

엑세스 로그가 저장되는 bucket입니다.

또한 cloud watch 도 생성해줍니다.

variables.tf

클러스터 생성 시 사용되는 모든 변수입니다.

container_port, host_port는 컨테이너 내부, 외부 포트로, 사용하는 도커 이미지에 맞게 변경해주세요.

저의 경우 nginx를 사용하기때문에 80:80으로 두었습니다.

var.tfvar

variables.tf에 필요한 변수를 채워주시면 됩니다.

region     = <your-region, 저의 경우 us-east-2>
access_key = <your-aws-access-key>
secret_key = <your-aws-access-secret-key>
domain = <your-domain address, 저의 경우 keykim.me>
bucket_name = <s3 이름>
app_name = <서비스 이름, 저의 경우 service>

service.conf.json.tpl

마지막으로, 컨테이너 옵션을 설정해줍니다.

위에서 생성한 코드를 배포해봅시다.

terraform init example/fargate/
terraform apply -var-file=example/fargate/var.tfvars example/fargate

결과

시간이 되면 포스터 내용에 더해 Github actions CI/CD 파이프라인을 구성하는 방법과 Blue/Green 배포에 대해서 포스팅하겠습니다.

감사합니다.

--

--