[AWS] Code Series로 Terraform CI/CD 환경 구성해보기
들어가면서
AWS Code Series란? AWS의 CodeCommit, CodeBuild, CodeDeploy, CodePipeline을 통칭하는 단어
- CodeCommit : AWS의 GitHub (버전 관리 서비스) - [AWS] CodeCommit 사용법 참고
- CodeBuild : 소스코드 컴파일해주고 빌드해주는 서비스 (Source Repository의 buildspec.yml 파일대로 빌드)
- CodeDeploy : 배포하고자 하는 대상(Application)을 Deployment Group으로 배포시켜줌 (appspec.yml 파일대로)
- 가능 배포 대상 : EC2/On-premis, Lambda, ECS
- CodePipeline : Source - Build - Deploy 과정을 관리해주는 서비스 (위의 서비스들이 아닌 GitHub, Jenkins 등 써드파티도 혼용 가능)
Terraform은 IaC 도구이기 때문에 별도의 Build 과정이 필요가 없다...따라서 아래 그림과 같은 형태로 CI/CD 환경을 구성해보겠다
사실 테라폼은 테라폼 클라우드라는 편한 서비스가 있지만,,,,그냥 간단하게 이런 구성을 해보는 것이 목적이다
CodeCommit에 코드를 Push하기만 하면 EC2에서 Terraform apply
를 진행해 자동으로 리소스가 생성되는 것을 확인해보도록 하자
시작!
1. EC2 준비 (Amazon Linux 2)
Terraform을 실행시키기 위한 terraform
과, CodeDeploy와 통신할 수 있는 codedeploy-agent
를 설치해야 한다
# Terraform 설치
# 최신 버전 확인 : https://www.terraform.io/downloads.html
wget https://releases.hashicorp.com/terraform/1.0.7/terraform_1.0.7_linux_amd64.zip
unzip terraform_1.0.7_linux_amd64.zip
sudo mv terraform /usr/bin/
# CloudDeploy-Agent 설치
sudo yum install ruby -y
wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
# CodeDeploy Agent Start (restart를 해야된다...start만 하면 안됨;)
sudo service codedeploy-agent status
sudo service codedeploy-agent restart
# 실시간 로그 확인
tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log
EC2용 IAM Role도 만들어주자
+ AmazonEC2RoleforAWSCodeDeploy
Policy도 같이 붙여줘야 한다!!
EC2 > Actions > Security > Modify IAM Role 에서 해당 Role을 붙여주자
EC2 준비는 끝났다
2. CodeCommit & Code 준비
AWS Console > CodeCommit > Create Repository
CodeCommit 사용법은 이전 글을 참조하도록 하자. 근데 귀찮으면 그냥 기존에 사용하던 GitHub을 사용해도 된다
아무튼 honglab-tftest-repo 란 Repository를 만들었고, 여기에 아래 파일들을 올려두었다
vpc.tf
provider "aws" {
region = "ap-northeast-1"
}
variable "vpc_cidr" {
description = "CIDR for the VPC"
default = "10.0.0.0/16"
}
variable "tag" {
default = "Terraform"
}
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "${var.tag}-VPC"
}
}
실행시킬 Terraform Code이다. 간단하게 VPC만 넣어놨다
appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/terraform/
hooks:
AfterInstall:
- location: /deploy_scripts/run_terraform.sh
timeout: 300
runas: root
CodeDeploy가 이 파일에 적힌 대로 Deploy를 하게 된다
files 섹션은 Source Repository의 어느 부분을 대상의 어디로 옮길건지에 대한 설명이다
나는 내 Repository 전체를 배포할 EC2의 /home/ec2-user/terraform/ 이란 경로에 옮길 것이다
hooks 섹션은 각 단계별 실행시킬 명령을 명시해놓는다
각 단계라는건 정해져 있으므로, 공식 도큐를 참고해보자
deploy_scripts/run_terraform.sh
terraform -chdir=/home/ec2-user/terraform/ init
terraform -chdir=/home/ec2-user/terraform/ apply -auto-approve
# Terraform 0.14 Version 이전이면 아래 명령으로 사용
# terraform init /home/ec2-user/terraform/
# terraform apply -auto-approve /home/ec2-user/terraform/
appspec.yml 파일에 적힌대로, AfterInstall 단계에서 실행될 파일이다
terraform 파일이 있는 경로에서 init과 apply를 진행하며, yes를 누를 필요 없게 하기 위해 -auo-approve 옵션을 붙였다
0.14 이하 버전을 사용한다면, -chdir 옵션 없이 폴더 경로를 그대로 넣어서 실행시킬 수 있다
파일들이 이렇게 들어와 있으면 다음 단계로 넘어가자
3. CodeDeploy Application & Deployment Group 준비
우선 IAM Role부터 만들자
use case를 고를 때 CodeDeploy > CodeDeploy만 눌러준 후 쭉 Next를 눌러주면 된다
(자동으로 AWSCodeDeployRole 이란 Policy가 붙어있게 됨)
AWS Console > CodeDeploy > Applications > Create application
Compute platform을 EC2/On-premis로 골라준다
자동으로 해당 application 화면의 Deployment group 탭이 보일텐데, Create deployment group을 눌러주자
Deployment Group을 생성해주자
4. CodePipeline 구성
AWS Console > CodePipeline > Pipelines > Create pipeline
조금 기다리다 보면 Source -> Deploy 순으로 진행되는 상황을 볼 수 있다
(처음엔 Source 단계에서 오류가 날 때도 있는데...그냥 Retry 눌러보면 다시 될 때도 있으니까 너무 당황하지 말자)
성공했다!
VPC가 생성된걸 확인할 수 있다
Subnet 리소스도 함 만들어서 Push만 해보겠다
resource "aws_subnet" "main_subnet" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.0.0/24"
availability_zone = "ap-northeast-1a"
map_public_ip_on_launch = true
tags = {
Name = "${var.tag}-Subnet"
}
}
위의 코드를 vpc.tf
밑에 추가해준 후 push를 해봤다
Push만 해도 자동으로 Terraform이 실행되어 서브넷이 생성되었다
성공!!