코드커밋(codeCommit) 테라폼 클라우드(Terraform Cloud) 연동

Hognod·2023년 11월 20일

1. 구성도

Screenshot-8027826

  • AWS CodeCommit: Clients로 부터 생성할 Infra에 대한 .tf 코드 파일을 Push 받아 보관 및 형상관리
  • Amazon CloudWatch: AWS CodeCommit의 변경사항을 캡쳐하여 AWS CodeBuild에게 변경된 사항에 대한 이벤트 처리를 요청
  • AWS CodeBuild: terraform initterraform apply 명령어를 수행하여 실질적인 Infra 생성에 대한 역할 수행
  • Amazon S3: CodePipeline의 Artifact Store 역할
  • Terraform Cloud: Terraform을 활용하여 Infra 생성을 하기 위한 UI 화면 및 Workspace, Sensitive Variables 등의 기능 제공

2. CodeCommit 설정

CodeCommit은 AWS의 버전 관리 서비스이다. GRC라는 유틸을 사용하는 것을 AWS는 권장하며 Git 자격 증명 설정 대신 IAM 사용자로 바로 접근이 가능하다.

2.1. pip 설치

curl -O https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py --user
  • python3.7 버전 이상이 설치되어 있어야 한다.

2.2. git, grc(git-remote-codecommit) 설치

sudo yum install -y git
pip3 install git-remote-codecommit

2.3. awscli 설치

grc 사용을 위한 자격증명용이므로 Role이 적용된 EC2의 경우 생략 가능

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version

[Output]

aws-cli/2.11.6 Python/3.11.2 Linux/5.4.0-137-generic exe/x86_64.ubuntu.20 prompt/off
aws configure
AWS Access Key ID [None]: AKIA...WH5
AWS Secret Access Key [None]: 8Jep...Y/p
Default region name [None]: ap-northeast-2
Default output format [None]: <Enter>
aws sts get-caller-identity

[Output]

{
    "UserId": "AID...IEP",
    "Account": "070...981",
    "Arn": "arn:aws:iam::070...981:user/<Name>"
}

2.4. Repository 생성

  1. CodeCommit 서비스의 좌측 사이드바 리포지토리 항목 선택
  2. 리포지토리 생성 버튼 클릭

create_repo

  1. 리포지토리 명 입력 후 완료버튼 클릭하여 리포지토리 생성

  2. 리포지토리 Clone

repo_clone

git clone codecommit::ap-northeast-2://test-repo
  1. Test 파일 Push 및 확인
cd test-repo
vi test.txt
test
git add .
git commit -m '1st commit'
git push origin main

push_check

3. CodeBuild 설정

  1. CodeBuild 서비스의 좌측 사이드바 프로젝트 빌드 항목 선택
  2. 빌드 프로젝트 생성 버튼 클릭

create_build1

  1. 프로젝트 이름 입력 및 소스 항목을 생성해 둔 CodeCommit의 리포지토리로 지정

build_project_configuration

  1. hashicorp/terraform 이미지를 사용하도록 지정 및 서비스 Role 생성

Screenshot

environment

  • Docker Hub 레지스트리의 Hashicorp 지원 공식 이미지를 가져오는 설정
  • 서비스 역할은 이미 역할이 존재할 경우 기존 서비스 역할 라디오 버튼을 선택하여 해당 역할을 지정, 그렇지 않을 경우 새 서비스 역할 라디오 버튼을 선택하여 새로운 역할을 생성
  • 환경 변수
    • 이름: TF_TOKEN_app_terraform_io
    • 값: Terraform Cloud의 Token 입력
  1. Buildspec 파일 사용 라디오 버튼 선택 후 빌드 프로젝트 생성 버튼 클릭

build_spec

  1. 빌드 프로젝트 생성 확인

Screenshot-8039090

4. CodePipeline 설정

  1. CodePipeline 서비스의 좌측 사이드바 파이프라인 항목 선택
  2. 파이프라인 생성 버튼 클릭

pipeline

  1. 파이프라인 이름 입력 및 아티팩트 스토어 지정 후 다음 버튼 클릭

pipeline2

  • 서비스 역할은 이미 역할이 존재할 경우 기존 서비스 역할 라디오 버튼을 선택하여 해당 역할을 지정, 그렇지 않을 경우 새 서비스 역할 라디오 버튼을 선택하여 새로운 역할을 생성
  • 아티팩트 스토어 또한 기존 S3 버킷을 사용하려면 사용자 지정 위치 라디오 버튼을 선택, 그렇지 않을 경우 기본 위치 라디오 버튼을 선택하여 새로운 S3 버킷 생성
  1. 소스 공급자AWS CodeCommit 선택 후 리포지토리 이름브랜치 이름을 생성한 CodeCommit에 맞게 선택한 후 변경 감지 옵션을 Amazon CloudWatch Events로 선택하여 다음 버튼 클릭

pipeline3

  • 변경 감지 옵션을 AWS CodePipeline으로 선택할 경우 코드가 변경됨을 감지하고 반영하는 시간이 매우 길어짐
  1. 빌드 공급자AWS CodeBuild 선택 후 프로젝트 이름을 생성한 프로젝트에 맞게 선택한 후 다음 버튼 클릭

build-stage

  1. 배포 스테이지 건너뛰기 버튼 클릭

Screenshot_2

  1. 건너뛰기 버튼 클릭

Screenshot

build

  • buildspec.yml 파일이 포함된 코드 파일들이 없어서 Build에 실패한 것을 확인할 수 있다.

5. Terraform Cloud 설정

https://app.terraform.io

  1. 위의 링크를 클릭하여 Terraform Cloud 로그인
  2. 우측 상단 New - Workspace 버튼 혹은 가운데 Create a workspace 버튼을 클릭하여 Workspace 생성

Workspace

  1. 가운데 CLI-Driven Workflow 선택

cli_driven

  1. Workspace 이름 작성 후 Create 버튼 클릭

workspace_name

  1. 생성된 Workspace의 좌측 사이드바에서 Variables 선택
    + Add variable 버튼 클릭하여 Environment Variable 항목으로 AWS 환경변수 입력

variables

  • 변수 생성 시 Sensitive 항목에 체크하여 위 이미지의 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 변수와 같이 암호화하여 변수를 저장할 수 있다.

6. 코드 적용 및 실행

2.4. 과정에서 clone한 test-repo 디렉토리에서 작업 진행

cd test-repo

6.1. buildspec.yml 파일 작성

이벤트가 발생했을 때 CodeBuild에서 진행할 명령어를 정의

vi buildspec.yml
version: 0.2

phases:
  build:
    commands:
      - terraform init
      - terraform apply -auto-approve

6.2. Test용 테라폼 코드 작성

Test용 VPC 생성 코드 작성

vi vpc.tf
terraform {

  cloud {
    organization = "<Terraform Cloud Organization>"

    workspaces {
      name = "test-workspace"
    }
  }
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  
  tags = {
    Name = "test-vpc"
  }
}
  • organization 항목에 Terraform Cloud의 Organization 값을 넣어준다.

6.3. 코드 Push 및 Terraform 동작 확인

git add .
git commit -m 'test code push'
git push origin main

AWS 좌측 사이드바의 파이프라인 선택 후 정상 빌드 확인

build_success

Terraform Cloud 좌측 사이드바의 Runs 선택 후 VPC 생성 확인

create_success

VPC 생성 확인

Screenshot-0460715

0개의 댓글