Programming/IaC

[IaC] Terraform Syntax-AWS

Hayley Shim 2023. 10. 28. 17:45

안녕하세요. CloudNet@ Terraform Study를 진행하며 해당 내용을 이해하고 공유하기 위해 작성한 글입니다. 도서 ‘Terraform: Up & Running(By Yevgeniy Brikman)’ 의 내용 및 스터디 시간 동안 언급된 주요 내용 위주로 간단히 정리했습니다.

사전환경

  1. AWS IAM User 생성
  2. AWS CLI 설치 및 IAM User 자격 증명 설정

3. AWS default VPC 준비 : 참고 링크

  • AWS는 Region별로 여러 VPC를 생성할 수 있습니다.

AWS 기본 VPC 예

# default VPC 삭제 시, 아래 명령어로 생성 가능
$ aws ec2 create-default-vpc# default VPC 확인
$ aws ec2 describe-vpcs --filter 'Name=isDefault,Values=true'# jq로 default VPC ID 확인(*jq : 참고 링크)
$ aws ec2 describe-vpcs --filter 'Name=isDefault,Values=true' | jq '.Vpcs[0].VpcId'# VPC 확인 
export AWS_PAGER="" 
aws ec2 describe-vpcs | jq 
aws ec2 describe-vpcs --output yaml

4. 테라폼 설치

  • 설치 링크 : 개인 OS 환경에 맞게 설치해줍니다.
# 자동 완성
$ terraform -install-autocomplete
$ cat ~/.zshrc
autoload -U +X bashcompinit && bashcompinit
complete -o nospace -C /opt/homebrew/bin/terraform terraform

단일 서버 배포

 
  • aws 를 공급자로 사용하여 ap-northeast-1 리전에 인프라를 배포한다는 것을 의미
 
  • provider : aws와 같은 공급자 이름
  • type : instance와 같이 해당 공급자에서 생성할 리소스 유형
  • name : 테라폼에서 이 리소스를 참조하기 위해 사용할 수 있는 my_instance와 같은 식별자
  • CONFIG : 특정 리소스에 대한 하나 이상의 인수(argument)로 구성

aws AMI id 찾기(참고 링크)

$ aws ec2 describe-images --owners self amazon#ubuntu(ap-northeast-1)
ami-0ca3e2b4a8398fb39
 
 

EC2 인스턴스 배포 시 사용하는 aws_instace 리소스

aws_instance 리소스 배포 시 필수 인수(argument)

  • ami : EC2 인스턴스를 생성하는 아마존 머신 이미지
  • instance_type : 실행할 EC 인스턴스의 유형
# 코드 스캔, 공급자 확인, 필요한 코드를 다운로드(.terraform)
$ terraform init# 실제 변경 전 테라폼이 수행할 작업 확인(유닉스, 리눅스, 깃 등의 diff 명령 결과값과 유사, +항목:추가, - 항목:삭제, ~항목:수정)
$ terraform plan# 실제 인스턴스 생성
$ terraform apply# terraform resource 삭제
$ terraform destroy

버전 관리

  • 테라폼 코드가 동작하면 버전 관리 도구에 저장하는 것을 권장
  • 다른 팀 구성원과 코드 공유 가능 및 모든 인프라의 변경 내용을 추적하거나 커밋 로그 사용하여 디버깅 가능
$ git init
$ git add main.tf
$ git commit -m "Initial commit"

단일 웹 서버 배포

  • http 요청에 응답할 수 있는 단일 웹서버를 배포합니다.
  • 아래 bash script에서 index.html 파일에 ‘Hello, T101 Study” 텍스트를 저장 후 busybox 도구로 8080 포트에서 웹 서버를 실행하여 해당 파일을 제공합니다.
  • nohub & 로 래핑하여 bash script가 종료되도 웹 서버가 백그라운드에서 영구적으로 실행됩니다.
 
  • region에 따른 aws AMI ID 값 : 참고
  • 웹 서버를 구동하기 전, 기본적으로 AWS EC2 인스턴스는 in/outbound 트래픽을 허용하지 않아 EC2 인스턴스가 8080 포트에서 트래픽을 수신하도록 하려면 보안 그룹을 생성해줍니다.
 
Error: with the retirement of EC2-Classic no new Security Groups can be created without referencing a VPC

관련 이슈 :
AWS provider 4.29.0 has breaking changes / backward incompatibilities! https://github.com/hashicorp/terraform-provider-aws/issues/26666

아래와 같이 vpc resource 정보를 추가해줍니다.

resource "aws_default_vpc" "default" {
  tags = {
    Name = "Default VPC"
  }
}

resource "aws_security_group" "aws_sg" {
  name        = "AWS Security Group Demo"
  description = "AWS Security Group Demo Description"
  vpc_id      = aws_default_vpc.default.id
}

웹서버 접속 확인

# [터미널3] 변수 지정 
$ PIP=<각자 자신의 EC2 IP> 
$ PIP=XX.XXX.XX.XXX 
$ while true; do curl --connect-timeout 1  http://$PIP:8080/ ; echo "------------------------------"; date; sleep 1; done

변수 지정

  • 웹 서버의 포트 넘버를 입력 받아서 처리해봅시다
 

plan 방안(-var 옵션)

terraform plan -var "server_port=8080"

입력 변수 값 사용하려면, 변수 참조(variable reference)라는 새로운 유형의 표현식을 사용할 수 있습니다.

var.<VARIABLE_NAME>
 
“${…}”
 

출력 변수

 
$ terraform output
public_ip = "13.231.145.133"$ terraform output public_ip
"13.231.145.133"

추가 질문 및 주의사항

Q)user_data_replace_on_change 값을 false 로 두었을 때 무슨일이 일어나는지

Q) aws cli profile이 여러개일 때 terraform 설정 : 링크

!!!) state 파일은 local보다 S3 같은 오브젝트 스토리지에 오브젝트들에 대해서 버저닝 기능을 활성화하여 관리 : 링크

!!!) s3/dynamodb에서 state 파일 관리 주의

$ terraform state list

ASG

-추후 업데이트 예정

로드밸런서 배포

-추후 업데이트 예정

 

 

blog migration project

written in 2022.10.16

https://medium.com/techblog-hayleyshim/iac-terraform-syntax-20b2b4f1cf1

'Programming > IaC' 카테고리의 다른 글

[IaC] Terraform state -상태파일격리  (0) 2023.10.28
[IaC] Terraform state -상태파일공유  (0) 2023.10.28
[IaC] GKE configuration  (0) 2023.10.28
[IaC] Terraform Syntax-GCP  (0) 2023.10.28
Terraform  (0) 2023.10.28