ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Terraform Study 3주차
    Terraform 2023. 7. 22. 23:33

    도전과제 1+2 조건문을 활용하여 (각자 편리한) AWS 리소스를 배포하는 코드를 작성해보자!, 내장 함수을 활용하여 (각자 편리한) 리소스를 배포하는 코드를 작성해보자!

    resource "aws_route_table" "rt_private_web" {
      count  = var.one_nat_gateway_per_az ? length(var.subnets_private_web) : 1
      vpc_id = aws_vpc.vpc.id
    
      tags = merge({
        Name = format(
          "%srt-%s-%s-%s",
          var.company,
          var.one_nat_gateway_per_az ? var.subnets_private_web[count.index].name : "web",
          var.env,
          var.team
        )
      }, var.tags)
    }
    
    resource "aws_route_table" "rt_private_tgw" {
      count  = var.one_nat_gateway_per_az ? length(var.subnets_private_engine) : 1
      vpc_id = aws_vpc.vpc.id
    
      tags = merge({
        Name = format(
          "%srt-%s-%s-%s",
          var.company,
          var.one_nat_gateway_per_az ? var.subnets_private_engine[count.index].name : "tgw",
          var.env,
          var.team
        )
      }, var.tags)
    }

    코드리뷰
    라우팅테이블 생성시 nat의 수 및 위치에 따라 테이블을 분리해야 하는 경우가 있다. 분리를 위해 nat를 생성하는지, 생성 한다면 nat를 각az마다 생성할지 변수로 설정하고 이에따라 구성을 달리하기 위해 count에 조건문을 사용했으며 이름 태그의 경우 일정한 규칙이 적용되기 때문에 내장 함수인 merge를 사용해 tags를 구성

    도전과제 3+4 AWS EC2 배포 시 remote-exec/file 프로비저너 혹은 terraform-provider-ansible를 활용하는 코드를 작성해보자!

    프로비저너

    일반적으로 Terraform은 리소스를 생성하는데 사용하며 이미 생성한 리소스의 내부 설정(python설치 등)의 작업을 위해선 jenkins등의 다른 tool을 사용해야 했다. 이러한 작업을 위해 Terraform으로 리소스를 생성하거나 제거할 때 로컬이나 원격에서 스크립트를 실행할 수 있는 기능으로 기본적으로 provisioner는 생성할 때만 실행되고 그 뒤에 업데이트되거나 하진 않는다. 그래서 provisioner가 실패하면 리소스가 잘못되었다고 판단하고 다음 terraform apply 할 때 제거하거나 다시 생성한다. provisioner에서 when = "destroy"를 지정하면 해당 프로비저너는 리소스를 제거하기 전에 실행되고 프로비저너가 실패한다면 다음 terraform apply 할 때 다시 실행하게 된다. 문서에 따르면 이 때문에 제거 프로비저너는 여러 번 실행해도 괜찮도록 작성해야 한다고 한다.

    Terraform_data

    Terraform 1.4에서 null_resource를 대체하기 위해 나온 리소스로 null_resource는 null provider을 설정해야 하지만 terraform_data는 별도의 공급자를 설정할 필요 없이 기존 null_resource의 모든 기능을 지원한다.

    provider "aws" {
      region = "ap-northeast-2"
    }
    
    data "aws_instance" "ec2" {
      filter {
        name   = "tag:Name"
        values = ["acone_k8s"]
      }
    }
    
    locals {
      mount_point = data.aws_instance.ec2.root_block_device.*.device_name
    }
    
    resource "terraform_data" "expand_disk" {
      provisioner "remote-exec" {
        inline = [
          "sudo lsblk",
          "sudo growpart ${local.mount_point.0} 1",
          "sudo xfs_growfs -d /"
        ]
    
        connection {
          type        = "ssh"
          user        = "ec2-user"
          private_key = file("<key file path>")
          host        = data.aws_instance.ec2.public_ip
        }
      }
    }

    코드리뷰
    기존에 사용중인 ec2의 ebs볼륨 확장시 자동으로 확장되는게 아니라 ec2내부에서 별도의 명령어를 통해 확장시켜야 한다. 이를 위해 리소스 자체적으로 별도의 작업을 수행하지 않는 terraform_data블록을 사용했으며 provisioner "remote-exec"를 사용해 ec2내부에서 볼륨을 수정하는 명령을 실행했다.

    도전과제 6 AWS의 S3 버킷을 2개의 리전에서 동작하는 테라폼 코드를 작성해보세요!

    provider "aws" {
      region = "ap-northeast-2"
    
      alias = "korea"
    }
    
    provider "aws" {
      region = "ap-northeast-1"
    
      alias = "japan"
    }
    
    
    resource "aws_s3_bucket" "kor_s3" {
      provider = aws.korea
    
      bucket = "terraform-kor-region-bucket"
    }
    
    resource "aws_s3_bucket" "jp_s3" {
      provider = aws.japan
    
      bucket = "terraform-jp-region-bucket"
    }

    'Terraform' 카테고리의 다른 글

    Terraform Cloud 활용하기 #2  (0) 2023.08.20
    Terraform Cloud 활용하기  (0) 2023.08.12
    Terraform Study 4주차  (0) 2023.07.29
    Terraform Study 2주차 도전 과제  (0) 2023.07.15
Designed by Tistory.