본문 바로가기
Terraform/Study

Terraform-101-Study Week4 - [State, 모듈]

by 식사법 2023. 7. 29.

github : https://github.com/chadness12/Terraform-101-Study-Public/tree/main/week4

도전과제

[Challenge1]

  • AWS DynamoDB / S3 를 원격저장소로 사용하기

(1) s3 및 DB 생성

  • AWS S3/DynamoDB 백엔드
resource "aws_s3_bucket" "tfstate"{
 bucket = "leechad-tfstate"
 versioning {
  enabled = true
 }
}

resource "aws_dynamodb_table" "terraform_state_lock" {
 name= "state-lock"
 hash_key = "LockID"
 billing_mode = "PAY_PER_REQUEST"

 attribute{
  name = "LockID"
  type = "S"
 }
}

(2) Terraform Backend설정

terraform {
    backend "s3" {
        bucket = "leechad-tfstate"
        key = "work2/terraform.tfstate"
        region = "ap-northeast-2"
        encrypt = true
        dynamodb_table = "state-lock"
    }
    required_providers {
        aws = {
            source = "hashicorp/aws"
            version = "~> 4.0"
        }
    }
}

provider "aws" {
    region = "ap-northeast-2"
}

(3) Terraform init

(4) s3 확인


[Challenge2]

  • 리소스를 모듈화 해보고 반복 리소스 배포해보기

  • 디렉토리 구조
tree .                         
.
├── leechad_vpc_module
│   ├── variable.tf
│   └── vpc.tf
├── main.tf
└── provider.tf

(1) vpc와 subnet을 생성하는 모듈 - leechad_vpc_moudle

  • vpc.tf
resource "aws_vpc" "vpc" {
  cidr_block = var.vpc_cidr

  tags = {
    Name = var.vpc_name
  }
}

# (a) 변수로 입력한 cidr 입력값에 따라 subnet 개수 가 결정 됩니다 -  최대 4개
resource "aws_subnet" "subnet" {
  vpc_id            = aws_vpc.vpc.id
  count = length(var.cidr_list)
  cidr_block        = var.cidr_list[count.index]
  availability_zone = var.az_list[count.index]
  tags = {
    Name = "Challange2_subnet_${var.az_list[count.index]}"
  }
}

output "vpc_id" {
  value = aws_vpc.vpc.id
}
  • variable.tf
variable "vpc_name" {
  type = string
}

variable "vpc_cidr" {
  type = string
}

variable "cidr_list" {
  type = list(string)
}

variable "az_list" {
  default = ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c", "ap-northeast-2d"]
}

(2) 모듈을 반복 사용해 2개의 vcp 생성

  • main.tf
module "vpc_moudle1" {
  source    = "./leechad_vpc_module"
  vpc_name  = "Challenge2_1_vpc"
  vpc_cidr  = "192.172.0.0/16"
  cidr_list = ["192.172.0.0/24", "192.172.1.0/24"]
}

module "vpc_moudle2" {
  source    = "./leechad_vpc_module"
  vpc_name  = "Challenge2_2_vpc"
  vpc_cidr  = "192.173.0.0/16"
  cidr_list = ["192.173.0.0/24", "192.173.1.0/24"]
}

(3) Console 확인


[Challenge3]

  • 공식 모듈 사용해 보기

(1) Security Group에 대한 모듈 사용

# 개인 모듈
module "vpc_moudle" {
  source    = "./leechad_vpc_module"
  vpc_name  = "Challenge3_vpc"
  vpc_cidr  = "192.172.0.0/16"
  cidr_list = ["192.172.0.0/24", "192.172.1.0/24"]
}

# 공식 모듈 사용
module "vote_service_sg" {

# (a) terraform-aws-modules/security-group/aws 에서 모듈을 가져와서 사용
# 링크 : https://registry.terraform.io/modules/terraform-aws-modules/security-group/aws/latest
  source = "terraform-aws-modules/security-group/aws"

  name        = "Challange3-sg"
  vpc_id      = module.vpc_moudle.vpc_id
  ingress_with_cidr_blocks = [
    {
      from_port   = 22
      to_port     = 22
      protocol    = "tcp"
      cidr_blocks = "0.0.0.0/0"
    }
  ]
}
  • (a) : terraform-aws-modules/security-group/aws 에서 모듈을 가져와서 사용

(2) Console 확인


[Challenge 4]

  • 자신의 깃허브를 모듈 소스로 사용
  • Challenge 2에서 사용한 모듈을 사용
  • 모듈 링크 : leechad_vpc_module

(1) main.tf

module "vpc_moudle" {
  source    = "github.com/chadness12/Terraform-101-Study-Public/leechad_vpc_module"
  vpc_name  = "Challenge4_vpc"
  vpc_cidr  = "192.172.0.0/16"
  cidr_list = ["192.172.0.0/24", "192.172.1.0/24"]
}

(2) Console 확인