본문 바로가기
DevOps

[T1014-실습] Terraform Runner

by 서어켜엉 2024. 7. 14.
해당 내용은 cloudNet@ 팀의 가시다 님이 진행하는 테라폼 스터디 T101 4기에서 실습한 내용을 정리한 것입니다.

 

Atlantis

https://techblog.pet-friends.co.kr/펫프렌즈가-devops-조직없이-인프라를-관리하는-방법-ce27449bc201

 

설치가이드

 

Requirements | Atlantis

 

www.runatlantis.io

  • Git host 에 대한 액세스 자격 증명을 만든다. (Github, Gitlab 등 )
  • 개인(또는 회사) 인프라에 Atlantis 서버 배포 
  • Atlantis가 pull 요청에 응답할 수 있는 Webhook을 git host 에 구성한다.
  • Atlantis가 실제로 Terraform Command를 실행할 수 있는 Provider 자격증명을 세팅한다.
  • 예제코드
    • cloudformation 실행 전 aws ec2 콘솔에서 keypair 생성 
    • key pair 경로를 ~/.ssh 로 복사
    • chmod 600 kp-smlim.pem. --> 권한 변경하지 않으면 에러 발생.
    • Atlantis 서버 용 EC2 배포

t101-atlantis-ec2.yaml
0.01MB

Cloudformation yaml 파일 

# CloudFormation yaml 파일 다운로드 : 위 노션 파일 클릭 후 다운 로드

# CloudFormation 스택 배포
MYKEYNAME=<각자 자신의 AWS EC2 서울 리전 Keypair 이름>
MYKEYNAME=kp-smlim
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 접속 : 기본정보 확인
# ubuntu EC2에 SSH 접속
ssh -i ~/.ssh/kp-gasida.pem ubuntu@$(aws cloudformation describe-stacks --stack-name t101 --query 'Stacks[*].Outputs[0].OutputValue' --output text)
---------------------------
# 계정 확인
whoami

# aws 자격증명 설정 : (옵션) IAM profile로 설정 -> 단 이경우 tf 파일에 설정 필요
aws --version
aws configure
AWS Access Key ID [None]: ####
AWS Secret Access Key [None]: ####
Default region name [None]: ap-northeast-2
Default output format [None]: 

# aws 자격증명 확인
aws s3 ls

# 테라폼 버전 확인
terraform version

#
git version

#
ls -l
./atlantis version
  • 실습 Github 레포지토리 생성

실습용 github 레포지토리(private) 생성

  • git Token 생성
    • profile - setting - develper setting - Personal access tokens - tokens(classic)
    • check repo
  • Atlantis Server 에서 TOKEN="{Your Token}" 환경변수 설정
  • Webhook secret 생성
    • 최소 24 characters 
    • random passwd 생성 기능 사용 ( 실습 시 )
    • Atlantis server 환경변수 SECRET="{your_random_string}"
  • Webhook 설정
    • payload URL = Atlantis Server IP + /path
      • ex) http://43.203.232.130:4141/events
    • Content type = application/json
    • secret 은 위에서 설정한 webhook secret
    • SSL verification -> Disable
    • webhook trigger -> let me select individual events
      • Issue comments
      • Pull request reviews
      • Pushes
      • Pull requests

  • START Atlantis
USERNAME="{the username of your GitHub, GitLab or Bitbucket user}"
REPO_ALLOWLIST="$YOUR_GIT_HOST/$YOUR_USERNAME/$YOUR_REPO"
REPO_ALLOWLIST="github.com/3feet-lim/t1014-cicd"
 #
URL="http://$(curl -s ipinfo.io/ip):4141"
USERNAME=3feet-lim
TOKEN='###'
SECRET='###'
REPO_ALLOWLIST="github.com/3feet-lim/t1014-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
State      Recv-Q     Send-Q         Local Address:Port         Peer Address:Port    Process                                       
LISTEN     0          4096                       *:4141                    *:*        users:(("atlantis",pid=2089,fd=7))
...

# 웹 접속 확인
URL="http://$(curl -s ipinfo.io/ip):4141"
echo $URL
http://3.38.213.238:4141
  • http:{Atlantis Server IP}:4141 로 접속하면 서버가 잘 실행됐는지 확인할 수 있다.

server
ss -tnlp 실행 결과

 

예제 작업1 : null 프로바이더

  • local 에서 git 코드 작업
# git clone
git clone https://github.com/3feet-lim/t1014-cicd.git && cd t1014-cicd && tree

# feature branch 생성
git branch test && git checkout test && git branch

# main.tf 파일 작성
echo 'resource "null_resource" "example" {}' > main.tf

# add commit push
git add main.tf && git commit -m "add main.tf" && git push origin test
# 새 탭에서
watch -d tree .atlantis/

file이 생성되었다.
atlantis 페이지에 locks와 jobs 가 생성됨

 

예제 작업 2: aws iam user 생성

  • aws s3 버킷 생성
AWS S3 버킷 생성 : Terraform Backend State 저장용도
#
aws s3 ls

#
aws s3 mb s3://<각자 유일한 S3 버킷명 이름> --region ap-northeast-2
aws s3 mb s3://smlim-t1014 --region ap-northeast-2

#
aws s3 ls
  • local 에서 git 코드 작업 및 push
# feature branch 생성
git branch iam && git checkout iam && git branch

# 디렉터리 생성
mkdir iam && cd iam

# main.tf 파일 작성
vi main.tf
----------
terraform {
  backend "s3" {
    bucket = "<각자 자신의 S3 버킷 이름>"
    key    = "terraform.tfstate"
    region = "ap-northeast-2"
  }
}

resource "aws_iam_user" "myuser" {
  name = "t101user"
}
----------
terraform {
  backend "s3" {
    bucket = "smlim-t1014"
    key    = "terraform.tfstate"
    region = "ap-northeast-2"
  }
}

resource "aws_iam_user" "myuser" {
  name = "t101user"
}
----------

# add commit push
git add main.tf && git commit -m "add main.tf" && git push origin iam
  • Github(Create a pull request) -> Atlantis 확인
    • Compare & pull request 클릭
    • Create pull request : title ( create iam user )
    • Plan 자동 수행 확인 → 하단 plan Details 클릭 확인
  • 서버 모니터링
watch -d tree .atlantis/

.atlantis/
.........
└── repos
    └── 3feet-lim
        └── t1014-cicd
            └── 3
                └── default
                    ├── README.md
                    ├── default.tfplan
                    ├── iam
                    │   ├── default.tfplan
                    │   └── main.tf
                    ├── main.tf
                    └── variable.tf

# Github Repo 코드를 가져 온 것을 확인
cat .atlantis/repos/$USERNAME/t101-cicd/2/default/iam/main.tf

 

  • aws s3 버킷 확인
aws s3 ls s3://$BUCKET

 

  • add comment
atlantis plan -d iam

# 아래 명령???
atlantis destroy -d iam

#
atlantis apply -d iam

atlantis 에는 destroy 명령어가 존재하지 않는다.
plan 명령어 status 가 lock 상태이다.
atantis apply -d iam 실행이 잘 된 것을 확인

  • aws s3 버킷 확인

tfstate 파일 생성 된 것을 확인

  • (Github에서) Merge pull request → Confirm merge

repo 에 3 디렉토리 삭제
locked 상태였던 목록 모두 풀림

  • Local git
#
git checkout main
git pull
cd ..
tree

tree 결과

 

작업3: 작업 2에서 생성한 리소스 삭제

  • Local 에서 git 코드 작업
# feature branch 생성
git branch deleteiam && git checkout deleteiam && git branch

# 디렉터리 생성
mkdir deleteiam && cd deleteiam

# main.tf 파일 작성
vi main.tf

----------
terraform {
  backend "s3" {
    bucket = "smlim-t1014"
    key    = "terraform.tfstate"
    region = "ap-northeast-2"
  }
}
----------

# add commit push
git add main.tf && git commit -m "add main.tf" && git push origin deleteiam
  • Github(Create a pull request) → Atlantis 확인
  • Compare & pull request 클릭
  • Create pull request : title ( delete iam user )
  • Plan 자동 수행 확인 → 하단 plan Details 클릭 확인
    • 서버 모니터링
watch -d tree .atlantis/

# Github Repo 코드를 가져 온 것을 확인
cat .atlantis/repos/$USERNAME/t101-cicd/4/default/deleteiam/main.tf
  • add comment 
atlantis apply -d deleteiam

aws iam user list 확인 -> t101user 삭제된 것 확인

  • aws s3 확인
aws s3 ls s3://smlim-t1014
  • Merge pull request → Confirm merge

웹 확인

  • Local git

 

 

실습 자원 삭제

  • CMD 작업
aws cloudformation delete-stack --stack-name t101
aws s3 rm s3://smlim-t1014 --recursive
aws s3 rb s3://smlim-t1014
  • github repository 삭제
  • github token 삭제
  • 로컬 GitHub 코드 삭제