본문 바로가기
Terraform/Terraform 101 Study

5주차 2편 테라폼 Runner

by 개발자 영만 2024. 7. 14.

Runner

Atlantis

소개

https://isn-t.tistory.com/46

  • Atlantis는 테라폼을 이용한 인프라 자동화 도구로, 주로 Pull Request를 통해 Terraform 워크플로우를 쉽게 실행할 수 있게 해줍니다.
  • Atlantis는 GitHub, GitLab, Bitbucket과 같은 버전 관리 시스템과 통합되어 테라폼 작업을 자동화합니다. PR 생성 시 terraform plan을 실행하고, 결과를 PR에 댓글로 달아줍니다. 사용자가 atlantis apply 명령을 댓글로 달면 terraform apply를 실행하여 그 결과도 PR에 남깁니다.
  • 모든 테라폼 변경 작업은 PR을 통해 수행되므로, 팀 내 모든 구성원이 인프라 변경 내용을 쉽게 파악하고 리뷰할 수 있습니다.
  • Atlantis는 인프라 변경, 승인 및 사용자 활동에 대한 자세한 로그를 제공하여 변경 이력을 쉽게 추적할 수 있습니다.
  • Atlantis는 특정 디렉토리 또는 워크스페이스를 잠금 상태로 유지하여, PR이 병합되거나 수동으로 잠금 해제될 때까지 다른 변경 사항이 적용되지 않도록 합니다.

 

설치 가이드

링크 : https://www.runatlantis.io/docs/installation-guide.html

 

Installation Guide | Atlantis

 

www.runatlantis.io

 

실습 따라하기

AWS EC2 생성

  • 다음은 AWS EC2 인스턴스를 Atlantis 서버로 설정하기 위한 CloudFormation 스택 배포 방법입니다.
  • 먼저 CloudFormation yaml 파일을 다운로드합니다.
# Keypair 이름 설정
MYKEYNAME=<각자 자신의 AWS EC2 서울 리전 Keypair 이름>

# CloudFormation 스택 배포
aws cloudformation deploy \
  --template-file t101-atlantis-ec2.yaml \
  --stack-name t101 \
  --parameter-overrides KeyName=$MYKEYNAME SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 \
  --region ap-northeast-2

# CloudFormation 스택 상태 모니터링
while true; do 
  date
  AWS_PAGER="" aws cloudformation list-stacks \
    --stack-status-filter CREATE_IN_PROGRESS CREATE_COMPLETE CREATE_FAILED DELETE_IN_PROGRESS DELETE_FAILED \
    --query "StackSummaries[*].{StackName:StackName, StackStatus:StackStatus}" \
    --output table
  sleep 1
done

# EC2 공인 IP 확인
aws cloudformation describe-stacks \
  --stack-name t101 \
  --query 'Stacks[*].Outputs[0].OutputValue' \
  --output text

AWS EC2 SSH 접속 및 기본 정보 확인

# AWS EC2 인스턴스에 SSH로 접속
ssh -i ~/.ssh/XXXX.pem ubuntu@$(aws cloudformation describe-stacks --stack-name t101 --query 'Stacks[*].Outputs[0].OutputValue' --output text)

# 계정 확인
whoami

# AWS CLI 버전 확인
aws --version

# AWS 자격증명 설정
aws configure

# 설정된 자격증명 확인
aws s3 ls

# 테라폼 버전 확인
terraform version

# Git 버전 확인
git version

# Atlantis 버전 확인
ls -l
./atlantis version

공인 IP 혹은 도메인 노출 설정

  • Atlantis는 GitHub, GitLab, Bitbucket 등의 서비스 또는 GitHub/GitLab Enterprise 설치 환경에서 접근할 수 있는 위치에 있어야 합니다.
  • 이를 위해 ngrok 같은 도구를 사용하여 로컬 포트를 랜덤한 공용 호스트 이름으로 포워딩할 수 있습니다.
# URL 변수 지정
URL="http://$(curl -s ipinfo.io/ip):4141"
echo $URL
  • 집에서 자신의 PC에 Atlantis를 설치 후 사용하는 경우 공유기에서 TCP 4141 포트를 포워딩 설정합니다.

GitHub에서 Private Repository 생성

  • 깃허브에 로그인합니다.
  • 새로운 깃허브 저장소를 생성합니다.
    • Owner: 원하는 소유자를 선택
    • Repository name: t101-cicd
    • Private 선택
  • Create repository 버튼을 클릭합니다.

GitHub Personal Access Token 생성

  • 오른쪽 상단의 프로필 아이콘을 클릭하고 Settings 클릭
  • 왼쪽 사이드바에서 Developer settings 클릭
  • Personal access tokens 클릭하고 Tokens (classic)을 선택
  • Generate new token 버튼을 클릭
    • Note : Atlantis
    • Expiration : 30 days
    • Select scopes : repo (모든 리포지토리에 대한 전체 제어)

Atlantis를 위한 Access Token 생성

  • 테스트를 위해 본인의 사용자 계정을 사용할 수 있지만, 전용 CI 사용자나 @atlantis라는 새 사용자를 생성하여 모든 API 작업을 수행하는 것을 권장합니다.
  • Atlantis가 Pull Request에 댓글을 달고 커밋 상태를 설정할 수 있도록 접근 토큰을 생성하는 방법을 안내합니다.
  • 먼저 GitHub Personal Access Token 생성 (위에서 설명)
  • 토큰을 환경 변수로 설정
TOKEN="{YOUR_TOKEN}"

Webhook Secret 생성

  • Atlantis는 Webhook Secret을 사용하여 Git 호스트로부터 수신한 웹훅의 유효성을 검증합니다.
  • Webhook Secret은 선택 사항이지만 보안을 위해 매우 권장됩니다.
  • 랜덤 문자열 생성기를 사용하여 Webhook Secret을 생성할 수 있습니다. 이 문자열은 24자 이상이어야 합니다.
  • 환경 변수로 설정
SECRET="{YOUR_RANDOM_STRING}"

Webhook 추가

  • 생성된 Webhook Secret을 사용하여 GitHub, GitLab 또는 Bitbucket 리포지토리에 웹훅을 추가합니다.
  • t101-cicd 리포지토리의 Settings 클릭
  • 사이드바에서 Webhooks 클릭 후 Add webhook 버튼을 클릭
    • Payload URL : ngrok에서 출력된 URL에 /events를 추가. 예) http://<EC2공인IP>:4141/events
    • Content type : application/json
    • Secret : 위에서 생성한 랜덤 문자열
    • SSL verification : Disable (not recommended)
    • Let me select individual events 선택 후 다음 이벤트 체크
      • Issue comments
      • Pull request reviews
      • Pushes
      • Pull requests
    • Active가 체크된 상태로 Add webhook 버튼을 클릭

Atlantis 서버 시작

  • Atlantis 서버를 시작하기 위해 두 개의 변수를 설정하고, 명령어를 실행합니다.
  • 예) REPO_ALLOWLIST="github.com/Y-mannn/t101-cicd"
USERNAME="{the username of your GitHub, GitLab or Bitbucket user}"
REPO_ALLOWLIST="$YOUR_GIT_HOST/$YOUR_USERNAME/$YOUR_REPO"
  • 위의 변수들은 Atlantis가 접근할 Git 리포지토리와 관련된 설정입니다.
  • Bitbucket 서버를 사용하는 경우, $YOUR_GIT_HOST는 도메인 이름이 되고, $YOUR_USERNAME은 프로젝트 이름이 됩니다.
# 필요한 변수 설정
URL="http://$(curl -s ipinfo.io/ip):4141"
USERNAME='###'
TOKEN='###'
SECRET='###'
REPO_ALLOWLIST="github.com/###/t101-cicd"

# 변수 설정 확인
echo $URL $USERNAME $TOKEN $SECRET $REPO_ALLOWLIST

# Atlantis 서버 실행
./atlantis server \
  --atlantis-url="$URL" \
  --gh-user="$USERNAME" \
  --gh-token="$TOKEN" \
  --gh-webhook-secret="$SECRET" \
  --repo-allowlist="$REPO_ALLOWLIST"
  
# 포트 확인 : 새 터미널을 열고 TCP 4141 포트가 열려 있는지 확인
ss -tnlp

  • (참고) GitHub Webhook Ping 실패 시 재발송 확인
    • Recent Deliveries를 확인하여 재발송을 시도할 수 있습니다.

  • 웹 접속 확인