본문 바로가기

study/T101 4기

T101 4기 5주차 두번째

Atlantis

Terraform Pull Request Automation - Running Terraform Workflows with Ease - Link Github Blog

 

Welcome to Our Blog | Atlantis

 

www.runatlantis.io

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

 

 

 

 

 

실습 따라하기

 

AWS EC2 생성 : atlantis 서버 역할

# CloudFormation yaml 파일 다운로드


# CloudFormation 스택 배포
MYKEYNAME=<각자 자신의 AWS EC2 서울 리전 Keypair 이름>
MYKEYNAME=kp-gasida
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]: 

#
terraform version

#
git version

#
ls -l
./atlantis version

 

 

 

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

 

Atlantis needs to be accessible somewhere that github.com/gitlab.com/bitbucket.org or your GitHub/GitLab Enterprise installation can reach.

One way to accomplish this is with ngrok, a tool that forwards your local port to a random public hostname.

# URL 변수 지정
URL="http://$(curl -s ipinfo.io/ip):4141"
echo $URL
집에서 자신의 PC에 Atlantis 설치 후 사용 시에는, (iptime) 공유기에 tcp 4141 포트 포워딩 설정

 

 

Git Repo (Private) 생성

 

Git Token 생성 - Docs

 

Github → Settings → Developer settings ⇒ Personal access tokens : Tokens (classic) ← Repo 제한 가능 Fine-grained tokens 사용 권장

 

Create an access token for Atlantis

We recommend using a dedicated CI user or creating a new user named @atlantis that performs all API actions, however for testing, you can use your own user.

Here we'll create the access token that Atlantis uses to comment on the pull request and set commit statuses.

GitHub or GitHub Enterprise Access Token

  • Create a Personal Access Token
  • create a token with repo scope
  • set the token as an environment variable
TOKEN="{YOUR_TOKEN}"

 

 

 

Create a webhook secret so Atlantis can validate webhooks - See Creating a Webhook Secret

 

Webhook Secrets | Atlantis

 

www.runatlantis.io

 

Create a Webhook Secret

# Create a random string of any length (you can use random.org) and set an environment variable:
SECRET="{YOUR_RANDOM_STRING}"

 

 

Add Webhook

Take the URL that ngrok output and create a webhook in your GitHub, GitLab or Bitbucket repo:

GitHub or GitHub Enterprise Webhook

 

 

 

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/gasida/t101-cicd"
# ex. REPO_ALLOWLIST="github.com/runatlantis/atlantis"
# If you're using Bitbucket Server, $YOUR_GIT_HOST will be the domain name of your
# server without scheme or port and $YOUR_USERNAME will be the name of the **project** the repo
# is under, **not the key** of the project.

 

Now you can start Atlantis. The exact command differs depending on your Git host:

#
URL="http://$(curl -s ipinfo.io/ip):4141"
USERNAME=gasida
TOKEN='###'
SECRET='###'
REPO_ALLOWLIST="github.com/gasida/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
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

 

 

 

 

 

작업1: null 프로바이더

 

Local 에서 Git 코드 작업

# git clone
git clone https://github.com/gasida/t101-cicd && cd t101-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

 

Github(Create a pull request) → Atlantis 확인

[신규 터미널] 서버 모니터링

watch -d tree .atlantis/

 

Compare & pull request 클릭

 

아래와 같이 실행된다

 

 

Plan 자동 수행 확인 → 하단 plan Details 클릭 확인

 

 

Add a comment

#
atlantis help

# 그냥 해보자 ㅎㅎ 
cat /etc/passwd

 

 

Add a comment ⇒ apply 결과 화면 확인

# 뻘짓 해보자
atlantis apply -d . && cat /etc/passwd

# 
atlantis plan -d .
atlantis apply -d .

 

 

Merge pull request → Confirm merge

 

 

Local Git

#
git checkout main
ls
git pull
ls
cat main.tf

 

 

작업2

: aws iam user 생성

 

AWS S3 버킷 생성 : Terraform Backend State 저장용도

#
aws s3 ls

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

#
aws s3 ls

 

Local 에서 Git 코드 작업

# 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 = "gasida-t101"
    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

 

 

 

Add a comment ⇒ apply 결과 화면 확인

# 
atlantis plan -d iam

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

#
atlantis apply -d iam

 

확인

 

 

 

 

작업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 = "<각자 자신의 S3 버킷 이름>"
    key    = "terraform.tfstate"
    region = "ap-northeast-2"
  }
}
----------
terraform {
  backend "s3" {
    bucket = "gasida-t101"
    key    = "terraform.tfstate"
    region = "ap-northeast-2"
  }
}
----------

# add commit push
git add main.tf && git commit -m "add main.tf" && git push origin deleteiam

 

 

 

Add a comment ⇒ apply 결과 화면 확인

atlantis apply -d deleteiam

 

 

Merge pull request → Confirm merge

# repos 에 디렉터리 삭제
watch -d tree .atlantis/

 

 

Local Git

#
git checkout main && git pull && cd .. && tree

'study > T101 4기' 카테고리의 다른 글

T101 4기 7주차 두번째  (0) 2024.07.27
T101 4기 7주차 첫번째  (0) 2024.07.21
T101 4기 5주차 첫번째  (0) 2024.07.07
T101 4기 4주차 두번째  (0) 2024.07.06
T101 4기 4주차 첫번째  (0) 2024.06.30