이번에도 '가시다' 님이 운영하는 스터디에 참여하게 되었습니다.
그럼 바로 공유 시작하겠습니다.
스터디는 아래의 책 참고하여 진행됩니다.
- lac와 테라폼
테라폼 제공 유형은 3가지로 구분됩니다.
- On-premise : Terraform이라 불리는 형태로, 사용자의 컴퓨팅 환경에 오픈소스 바이너리툴인 테라폼을 통해 사용
- Hosted SaaS : Terraform Cloud로 불리는 SaaS로 제공되는 구성 환경으로 하시코프가 관리하는 서버 환경이 제공
- Private Install : Terraform Enterprise로 불리는 서버 설치형 구성 환경으로, 기업의 사내 정책에 따라 프로비저닝 관리가 외부 네트워크와 격리 - 링크
실행 환경 구성
mac 기준
# tfenv 설치
brew install tfenv
# 설치 가능 버전 리스트 확인
tfenv list-remote
# 테라폼 1.8.5 버전 설치
tfenv install 1.8.5
# 테라폼 1.5.1 버전 사용 설정
tfenv use 1.8.5
# tfenv로 설치한 버전 확인
tfenv list
# 테라폼 버전 정보 확인
terraform version
# 자동완성
terraform -install-autocomplete
## 참고 .zshrc 에 아래 추가됨
cat ~/.zshrc
autoload -U +X bashcompinit && bashcompinit
확인
심화
- aws CLI 설치 및 자격 증명
AWS CLI v2 설치 - 링크 및 IAM User 자격 증명 설정 - 링크 환경변수
# macOS 설치 방법
$ brew install awscli
# Linux 설치 방법
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# aws cli 버전 확인
aws --version
aws-cli/2.7.31 Python/3.10.7 Darwin/21.6.0 source/x86_64 prompt/off
# aws cli 사용 시도
aws s3 ls
---
# aws configure 로 자격증명 설정 : 방안1
aws configure
... >> 입력
aws configure list
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************DYFF shared-credentials-file
secret_key ****************m7Za shared-credentials-file
region ap-northeast-2 config-file ~/.aws/config
# 환경 변수로 자격증명 설정 : 방안2
Linux or macOS
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_DEFAULT_REGION=us-west-2
# 페이저 사용 비활성화
export AWS_PAGER=""
# aws cli 사용 시도
aws s3 ls
확인
실습에 편리한 툴 들 설치 : watch, jq, tree 등
# macOS
brew install tree jq watch
# Linux
sudo apt install -y tree jq
AWS 서울 리전(ap-northeast-2)에 default VPC 존재 확인 : 없을 경우 아래 (옵션) default
aws ec2 describe-vpcs --filter 'Name=isDefault,Values=true' | jq
{
...
aws ec2 describe-vpcs --filter 'Name=isDefault,Values=true' | jq '.Vpcs[0].VpcId'
"vpc-3912a952"
#aws ec2 describe-subnets --filter 'Name=vpc-id,Values=vpc-3912a952' --output table
aws ec2 describe-subnets --filter 'Name=vpc-id,Values=vpc-<자신의VPC ID>' --output table
- default VPC생성
# default VPC를 생성
aws ec2 create-default-vpc
# default Subnet 생성
aws ec2 create-default-subnet --availability-zone ap-northeast-2a
aws ec2 create-default-subnet --availability-zone ap-northeast-2b
aws ec2 create-default-subnet --availability-zone ap-northeast-2c
aws ec2 create-default-subnet --availability-zone ap-northeast-2d
생성
EC2 1대 배포해보기
- Amazon Linux 2 최신 ami id 찾기 : ami-XYZ → 자주 업데이트가 됨
#aws ec2 describe-images --owners self amazon
aws ec2 describe-images --owners self amazon --query 'Images[*].[ImageId]' --output text
aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available"
aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available" --query 'Images|sort_by(@, &CreationDate)[-1].[ImageId, Name]' --output text
ami-0d1530d2e1de1db7c amzn2-ami-hvm-2.0.20240529.0-x86_64-gp2
aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available" --query 'Images|sort_by(@, &CreationDate)[-1].[ImageId]' --output text
ami-0d1530d2e1de1db7c
AL2ID=`aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available" --query 'Images|sort_by(@, &CreationDate)[-1].[ImageId]' --output text`
echo $AL2ID
# ssm
aws ssm get-parameters-by-path --path /aws/service/ami-amazon-linux-latest
aws ssm get-parameters-by-path --path /aws/service/ami-amazon-linux-latest --query 'Parameters[*].[Value, Name]' --output text
- EC2 생성 모니터링
# [터미널1] EC2 생성 모니터링
export AWS_PAGER=""
while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text ; echo "------------------------------" ; sleep 1; done
EC2 배포 실행: HCL Hashicorp Configuration Language 코드 파일 생성
- 코드 파일 작성
- provider : Terraform으로 정의할 Infrastructure Provider를 의미 - Docs
- resource : 실제로 생성할 인프라 자원을 의미
resource “<PROVIDER>_<TYPE>” “<NAME>” {
[CONFIG ...]
}
- PROVIDER : ‘aws’ 같은 공급자의 이름
- TYPE : ‘security_group’ 같은 리소스의 유형
- NAME : 리소스의 이름
- CONFIG : 한개 이상 arguments
배포 실행 : 터미널2에서 실행
# 초기화
terraform init
ls -al
tree .terraform
# plan 확인
terraform plan
# apply 실행
terraform apply
Enter a value: yes 입력
# ec2 생성 확인 : aws 웹 관리 콘솔에서도 확인 - 서울 리전 선택
export AWS_PAGER=""
aws ec2 describe-instances --output table
생성 확인
EC2 코드 파일 수정 : VSCODE 파일 편집에서 직접 수정해도 됨.
cat <<EOT > main.tf
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "$AL2ID"
instance_type = "t2.micro"
tags = {
Name = "t101-study"
}
}
EOT
변경 확인
EC2 삭제
# 리소스 삭제
terraform destroy
Enter a value: yes 입력
혹은
terraform destroy -auto-approve
- 기본 사용법
실습 디렉터리 생성 → VS Code에서 폴더 열기 ⇒ VS Code에서 터미널 열기
# 실습 디렉터리 생성 후 이동 : workspaces 혹은 각자 편한 이름으로 생성
mkdir workspaces
cd workspaces
# 테라폼 실행
terraform
Usage: terraform [-version] [-help] <command> [args]
...
- -upgrade : 0.14 버전 이후부터 프로바이더 종속성을 고정시키는 .terraform.lock.hcl이 추가됨. 작업자가 의도적으로 버전을 변경하거나 코드에 명시한 다른 버전으로 변경하려면 terraform init -upgrade 를 수행.
validate 테라폼 구성 파일 유효성 확인
- 디렉터리에 있는 테라폼 구성 파일의 유효성을 확인. API작업은 발생하지 않고, 코드적인 유효성만 검토함.
- API 작업이 발생하는 테라폼 Plan 동작과 달리 작성된 구성의 문법, 종속성, 속성 이름이나 연결된 값의 정확성 확인을 수행함.
- main.tf 코드 파일 내용 수정 : # 추가
resource "local_file" "abc" {
content = "abc!"
#filename = "${path.module}/abc.txt"
}
확인
-no-color : 대부분의 명령과 함께 사용 가능, 로컬이 아닌 외부 실행 환경(젠킨스, Terraform Cloud, Github Action 등)을 사용하는 경우, 색상 표기 문자 ←[0m←[1m 가 표기 될 수 있다. 이 경우 -no-color 옵션으로 색상 표기 문자 없이 출력함.
다음 과정을 위해 다시 주석을 제거하고 저장
resource "local_file" "abc" {
content = "abc!"
filename = "${path.module}/abc.txt"
}
-json : 서브 커맨드 옵션 중 실행 결과를 JSON 형식으로 출력
#
terraform validate -json
terraform validate -json | jq
# 결과 쿼리 예시
terraform validate -json | jq -r .valid
plan 계획 & apply 실행
- terraform plan 명령은 테라폼으로 적용할 인프라의 변경 사항에 관한 실행 계획을 생성하는 동작. 또한 출력되는 결과를 확인하여 어떤 변경이 적용될지 사용자가 미리 검토하고 이해하는데 도움을 줌.
- 변경 사항을 실제로 적용하지는 않으므로, 적용 전에 예상한 구성이 맞는지 검토
- terraform apply 는 plan 계획을 기반으로 작업을 실행.
# plan 실행 : 구성 내용을 바탕으로 어떤 리소스가 생성되는지 상세 내역 출력, 기본값 자동 입력 적용
terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# local_file.abc will be created
+ resource "local_file" "abc" {
+ content = "abc!"
+ content_base64sha256 = (known after apply)
+ content_base64sha512 = (known after apply)
+ content_md5 = (known after apply)
+ content_sha1 = (known after apply)
+ content_sha256 = (known after apply)
+ content_sha512 = (known after apply)
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./abc.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy. # 하나의 리소스가 추가되고, 변경되거나 삭제되는 것은 없을 예정
- apply
# apply 실행 : no 입력
terraform apply
...
Enter a value: no
...
# plan 결과를 지정된 파일(바이너리 형태) 이름으로 생성
terraform plan -out=tfplan
cat tfplan
file tfplan
# apply 실행 : 실행계획이 있으므로 즉시 적용됨
terraform apply tfplan
ls -al abc.txt
# apply 실행 : 어떻게 되나요?
# 테라폼은 선언적 구성 관리를 제공하는 언어로 멱등성 idempotence을 갖고, 상태를 관리하기 때문에 동일한 구성에 대해서는 다시 실행하거나 변경하는 작업을 수행하지 않음
terraform apply
...
terraform state list
확인
- 코드 파일 수정
resource "local_file" "abc" {
content = "abc!"
filename = "${path.module}/abc.txt"
}
resource "local_file" "dev" {
content = "def!"
filename = "${path.module}/def.txt"
}
확인
다시 추가 코드 내용을 삭제
resource "local_file" "abc" {
content = "abc!"
filename = "${path.module}/abc.txt"
}
- -replace : 프로비저닝이 완료 후 사용자에 필요에 의해 특정 리소스를 삭제 후 다시 생성. plan, apply 모두 적용 가능
# 현재 배포된 리소스 확인
terraform state list
local_file.abc
# 다시 생성 : 파일 생성 시간 확인
ls -l abc.txt
terraform apply -replace=local_file.abc -auto-approve
ls -l abc.txt
terraform apply -replace=local_file.abc -auto-approve
ls -l abc.txt
- destroy 제거 & fmt
테라폼 구성에서 관리하는 모든 개체를 제거하는 명령어 ← 일부 리소스만 제거하려면 어떻게 해야 될 까요?
#
terraform destroy
...
Enter a value: yes
...
# 확인
terraform state list
ls *.txt
- fmt : format 또는 reformat 줄임 표시로 terraform tmt 명령어로 수행, 테라폼 구성 파일을 표준 형식과 표준 스타일로 적용. 코드 가독성 높임
# 적용 후 코드 파일 내용 확인
terraform fmt
'study > T101 4기' 카테고리의 다른 글
T101 4기 3주차 첫번째 (0) | 2024.06.29 |
---|---|
T101 4기 2주차 두번째 (0) | 2024.06.22 |
T101 4기 2주차 첫번째 (0) | 2024.06.22 |
T101 4기 1주차 세번째 (0) | 2024.06.15 |
T101 4기 1주차 두번째 (0) | 2024.06.15 |