공부/AWS

[AWS] Code Series로 Terraform CI/CD 환경 구성해보기

haejang 2021. 9. 18. 19:43
728x90
728x90

 

들어가면서


출처 : https://aws.amazon.com/ko/codepipeline/

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 섹션은 각 단계별 실행시킬 명령을 명시해놓는다

각 단계라는건 정해져 있으므로, 공식 도큐를 참고해보자

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file-example.html#appspec-file-example-server

 

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을 생성해주자

 

위에서 만든 Role 선택
In-place 방식에 EC2 instances 선택 - EC2에 달려있는 Tag를 선택해준다
나머지는 잘은 모르겠고,,,Load balancing Enable 되어있는거만 체크 해제 해주고 생성 완료해주자

 

4. CodePipeline 구성


AWS Console > CodePipeline > Pipelines > Create pipeline

 

Step 1 : 이름만 정해주자

 

Step 2 : Source를 정해준다 - CodeCommit 말고도 GitHub, Bitbucket, S3 등으로 지정할 수 있는걸 확인할 수 있다
Step 3 : Build는 Skip해준다
Step 4 : CodeDeploy Application과 Deployment group을 지정해준 후 완료하자

조금 기다리다 보면 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이 실행되어 서브넷이 생성되었다

성공!!

 

 

728x90
728x90