본문 바로가기
Terraform

Terraform on AWS 3. Terraform Command 기본 사항, 언어 문법

by Hyeon Cloud 2023. 12. 4.

Terraform Command 기본 사항

Terraform-on-AWS/02-Basic-Terraform/02-02-terraform-command at main · Arc1el/Terraform-on-AWS


Step-01: 소개

  • 기본적인 Terraform Command 이해하기
    • terraform init
    • terraform validate
    • terraform plan
    • terraform apply
    • terraform destroy

Step-02: EC2 Instance와 VPC 생성을 위한 테라폼 코드

  • 전제조건
    • 사용된 AMI이미지에 대해 존재하지 않을경우 업데이트된 이미지를 사용
    • AWS Credentials가 설정되어있음
  • Code
# Terraform Settings Block
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      #version = "~> 3.21" # Optional but recommended in production
    }
  }
}

# Provider Block
provider "aws" {
  profile = "default" # AWS Credentials Profile configured on your local desktop terminal  $HOME/.aws/credentials
  region  = "ap-northeast-2"
}

resource "aws_vpc" "default" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "myVPC"
    "hmkim" = "terraform-vpc"
  }
}

resource "aws_subnet" "example" {
  vpc_id            = aws_vpc.default.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "ap-northeast-2a"

  tags = {
    "hmkim" = "terraform-subnet"
  }
}

# Resource Block
resource "aws_instance" "terraformDemo" {
  ami           = "ami-09cd5dd529c3c1f40" # Amazon Linux in us-east-1, update as per your region
  instance_type = "t3.micro"
  subnet_id     = aws_subnet.example.id

  tags = {
    "hmkim" = "terraform-instance"
  }
}
  • terraform 블록: 이 블록은 테라폼 설정을 지정합니다. 여기에서는 테라폼에서 AWS 공급자를 사용하도록 요구하며, 특정 버전이 아닌 최신 버전을 사용합니다.
  • provider 블록: 이 블록은 Terraform에게 AWS 자원을 생성할 때 사용할 AWS 공급자를 지정합니다. 이 구성에서는 기본 프로필을 사용하며, 리전은 ap-northeast-2로 설정됩니다.
  • resource "aws_vpc" "default" 블록: 이 블록은 AWS VPC를 생성합니다. VPC의 CIDR 블록은 10.0.0.0/16이며, VPC에 대한 태그를 지정합니다.
  • resource "aws_subnet" "example" 블록: 이 블록은 AWS 서브넷을 생성합니다. 이 서브넷은 aws_vpc.default에서 생성한 VPC에 속하며, CIDR 블록은 10.0.1.0/24입니다. 이 서브넷은 ap-northeast-2a 가용 영역에 있습니다.
  • resource "aws_instance" "terraformDemo" 블록: 이 블록은 EC2 인스턴스를 생성합니다. 이 인스턴스는 ami-09cd5dd529c3c1f40 Amazon Linux AMI를 사용하며, 인스턴스 유형은 t3.micro입니다. 이 인스턴스는 aws_subnet.example에서 생성한 서브넷에 속합니다. 마지막으로, 이 인스턴스에 대한 태그를 지정합니다.

Step-03: Terraform Core Commands

  • 테라폼을 실행해봅니다
  • Code
# Initialize Terraform
terraform init

# Terraform Validate
terraform validate

# Terraform Plan to Verify what it is going to create / update / destroy
terraform plan

# Terraform Apply to Create EC2 Instance
terraform apply

Step-04: Verify the EC2 Instance in AWS Management Console

  • AWS 콘솔 → EC2 → 인스턴스 생성 확인

  • AWS 콘솔 → VPC → VPC 생성 확인

Step-05: Destroy Infrastructure

  • Destroy를 사용하여 생성된 인프라를 삭제합니다
# Destroy EC2 Instance
terraform destroy

# Delete Terraform files 
rm -rf .terraform*
rm -rf terraform.tfstate*

Terraform 언어 문법

Terraform-on-AWS/02-Basic-Terraform/02-03-terraform-syntax at main · Arc1el/Terraform-on-AWS


Step-01: 소개

  • 기본적인 Terraform의 신택스에 대해서 이해합니다
    • Blocks
    • Arguments, Attributes & Meta-Arguments
    • Identifiers
    • Comments

Step-02: Terraform 설정 언어 문법

# 템플릿
# 블록바디 시작
<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>"   {
  # 아규먼트
  <IDENTIFIER> = <EXPRESSION>
}

# AWS 예시
# 블록 시작
resource "aws_instance" "ec2demo" {
	# 아규먼트
  ami           = "ami-04d29b6f966df1537"
	# Variable Value 표현식을 가진 아규먼트
	# Variable Value는 variables.tf 파일에서 대체되어짐
  instance_type = var.instance_type
}
# 블록 끝

Step-03: Arguments, Attributes, Meta-Arguments 이해

Step-04: Terraform Top-Level Blocks 이해

Terraform에서는 다양한 Top-Level Block이 존재합니다. 이러한 블록들은 Terraform 파일의 최상위 수준에 위치하며, 테라폼 코드를 정의하고 Terraform의 동작을 설정하는 데 사용됩니다.

  • Terraform Settings Block Terraform Settings Block은 테라폼 설정을 정의하는 데 사용됩니다. required_providers를 포함하여 AWS, GCP, Azure, DigitalOcean과 같은 공급자, 백엔드, 버전 제어 등과 같은 전역 Terraform 설정을 정의할 수 있습니다. 이 블록을 사용하여 다양한 옵션을 구성하고 프로젝트의 구성을 최적화할 수 있습니다.
  • Provider Block Provider Block은 특정 공급자(예: AWS, GCP 등)와 연결된 자원을 정의합니다. 이 블록은 공급자와 상호 작용하고 프로젝트의 자원을 생성하고 관리합니다. 이 블록에서는 사용할 공급자를 지정하고 AWS, Azure, GCP와 같은 공급자의 인증 정보(예: API 키, 비밀 키)를 정의할 수 있습니다.
  • Resource Block Resource Block은 인프라의 개별 리소스(예: EC2 인스턴스, VPC, 서브넷 등)를 정의합니다. 이 블록에서는 리소스 유형과 이름, 속성, 태그 등을 지정할 수 있습니다. 이 블록을 사용하여 인프라를 생성, 관리, 수정 및 삭제할 수 있습니다.
  • Input Variables Block Input Variables Block은 템플릿에서 사용할 변수를 정의합니다. 변수는 Terraform 파일에서 사용할 수 있으며 템플릿에서 값을 전달받을 수 있는 방법을 제공합니다. 변수는 템플릿에서 사용할 데이터를 구성하는 데 도움이 되며, 코드 재사용성을 높일 수 있습니다.
  • Output Values Block Output Values Block은 테라폼 실행 후 표시되는 값(예: IP 주소, 리소스 이름 등)을 정의합니다. 이 블록은 리소스의 출력을 정의할 수도 있습니다. 이 블록은 다른 Terraform 모듈에서 출력된 값을 사용하는 데 도움이 됩니다.
  • Local Values Block Local Values Block은 지역 변수를 정의하는 데 사용됩니다. 이 블록에서는 다른 블록에서 사용할 지역 변수를 정의하고 사용할 수 있습니다. 이 블록을 사용하여 다른 블록에서 사용할 값을 계산하고 저장할 수 있습니다.
  • Data Sources Block Data Sources Block은 인프라의 데이터를 정의합니다. 이블록에서는 인프라 상태의 데이터를 검색할 수 있는 방법을 제공합니다. 이 블록은 외부 시스템에서 데이터를 가져오는 데 사용됩니다. 이 블록에서는 외부 데이터 소스의 유형과 위치를 지정할 수 있습니다.
  • Modules Block Modules Block은 Terraform 코드를 모듈화하는 데 사용됩니다. 모듈은 인프라의 동일한 유형의 리소스를 여러 번 생성하는 데 사용됩니다. 이 블록에서는 다른 Terraform 파일에서 모듈로 재사용할 수 있는 리소스와 구성을 정의할 수 있습니다. 모듈화를 사용하면 코드 재사용성을 높이고 유지보수 및 확장성을 개선할 수 있습니다.

블록을 적절하게 사용하여 인프라를 생성, 관리 및 수정할 수 있으며, 코드 재사용성을 높이고 유지보수성을 개선할 수 있습니다.