Runner
Atlantis
소개
- 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자 이상이어야 합니다.
- browserling: Generate Random Strings and Numbers 웹사이트를 이용 랜덤 문자열 생성
- 환경 변수로 설정
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를 확인하여 재발송을 시도할 수 있습니다.
- 웹 접속 확인
'Terraform > Terraform 101 Study' 카테고리의 다른 글
7주차 2편 테라폼으로 AWS EKS 배포 - EKS Workshop (0) | 2024.07.28 |
---|---|
7주차 1편 테라폼으로 AWS EKS 배포 - EKS Blueprints for Terraform (0) | 2024.07.28 |
5주차 1편 테라폼 Module (1) | 2024.07.14 |
4주차 2편 테라폼 State (0) | 2024.07.07 |