πŸ“‚ IaC/Terraform

TF 101 Study 3μ£Όμ°¨ 정리 - 쑰건식, ν•¨μˆ˜, ν”„λ‘œλΉ„μ €λ„ˆ, ν™˜κ²½ λ³€μˆ˜, ν”„λ‘œλ°”μ΄λ”

dhyuck 2023. 7. 22. 02:58
λ°˜μ‘ν˜•
  • CloudNeta의 κ°€μ‹œλ‹€λ‹˜μ΄ μ§„ν–‰ν•˜μ‹œλŠ” Terraform 101 Study에 μ°Έκ°€ν•˜λ©° μž‘μ„±ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.
  • μŠ€ν„°λ”” ꡐ재 β†’ ν…ŒλΌνΌμœΌλ‘œ μ‹œμž‘ν•˜λŠ” IaC

CH3. κΈ°λ³Έ μ‚¬μš©λ²• - 3


3-10. 쑰건식


3-11. ν•¨μˆ˜


3-12. ν”„λ‘œλΉ„μ €λ„ˆ


  • ν”„λ‘œλΉ„μ €λ„ˆ β†’ ν”„λ‘œλ°”μ΄λ”λ‘œ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” μ»€λ§¨λ“œμ™€ 파일 볡사 같은 역할을 μˆ˜ν–‰
  • ν”„λ‘œλΉ„μ €λ„ˆλ‘œ μ‹€ν–‰λœ κ²°κ³ΌλŠ” ν…ŒλΌνΌμ˜ μƒνƒœ 파일과 λ™κΈ°ν™”λ˜μ§€ μ•ŠμœΌλ―€λ‘œ ν”„λ‘œλΉ„μ €λ‹μ— λŒ€ν•œ κ²°κ³Όκ°€ 항상 κ°™λ‹€κ³  보μž₯ν•  수 μ—†λ‹€.
    β†’ λ”°λΌμ„œ ν”„λ‘œλΉ„μ €λ„ˆ μ‚¬μš©μ„ μ΅œμ†Œν™”ν•˜λŠ” 것이 μ’‹λ‹€.

ν”„λ‘œλΉ„μ €λ„ˆ μ‚¬μš© 방법

  • ν”„λ‘œλΉ„μ €λ„ˆμ˜ 경우 λ¦¬μ†ŒμŠ€ ν”„λ‘œλΉ„μ €λ‹ 이후 λ™μž‘ν•˜λ„λ‘ ꡬ성할 수 μžˆλ‹€.
  • ν”„λ‘œλΉ„μ €λ„ˆλŠ” μ„ μ–Έλœ λ¦¬μ†ŒμŠ€ λΈ”λ‘μ˜ μž‘μ—…μ΄ μ’…λ£Œλ˜κ³  λ‚˜μ„œ μ§€μ •ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.
  • λ‹€μˆ˜μ˜ ν”„λ‘œλΉ„μ €λ„ˆλ₯Ό 반볡적으둜 선언도 κ°€λŠ₯ν•˜λ©° 이런 경우 μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬λœλ‹€.
  • ν”„λ‘œλΉ„μ €λ„ˆλŠ” selfλ₯Ό 톡해 ν”„λ‘œλΉ„μ €λ‹ λ¦¬μ†ŒμŠ€λ₯Ό ν•΄λ‹Ή 속성을 μ°Έμ‘°ν•  수 μžˆλ‹€.

local-exec ν”„λ‘œλΉ„μ €λ„ˆ

  • local-exec β†’ ν…ŒλΌνΌμ΄ μ‹€ν–‰λ˜λŠ” ν™˜κ²½μ—μ„œ μˆ˜ν–‰ν•  μ»€λ§¨λ“œλ₯Ό μ •μ˜

resource "local_file" "provisioner_test" {
  content  = "for provisioner test"
  filename = "provisioner_test.txt"

  # local-exec ν”„λ‘œλΉ„μ €λ„ˆ -> ν…ŒλΌνΌμ΄ μ‹€ν–‰λ˜λŠ” ν™˜κ²½μ—μ„œ μˆ˜ν–‰
  provisioner "local-exec" {
    command = "echo The content is ${self.content}"
  }
}

# μ‹€ν–‰ κ²°κ³Ό
# 1. terraform apply λ‹¨κ³„μ—μ„œ 둜컬 머신에 "echo The content is ${self.content}" λΌλŠ” μ»€λ§¨λ“œκ°€ μ „λ‹¬λœλ‹€.
# 2. provisioner_test.txtλΌλŠ” 파일이 ν”„λ‘œλΉ„μ €λ‹ λœλ‹€.

원격지 μ—°κ²°

  • file ν”„λ‘œλΉ„μ €λ„ˆμ™€ remote-exec ν”„λ‘œλΉ„μ €λ„ˆλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 원격지에 μ—°κ²°ν•  SSH, WinRM μ—°κ²° μ •μ˜κ°€ ν•„μš”

file ν”„λ‘œλΉ„μ €λ„ˆ

  • file β†’ ν…ŒλΌνΌμ„ μ‹€ν–‰ν•˜λŠ” μ‹œμŠ€ν…œμ—μ„œ μ—°κ²° λŒ€μƒμœΌλ‘œ 파일 λ˜λŠ” 디렉터리λ₯Ό λ³΅μ‚¬ν•˜λŠ”λ° μ‚¬μš©
  • λ‘œμ»¬μ—μ„œ ν…ŒλΌνΌμ„ μ‹€ν–‰ν•˜μ—¬ EC2 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , 원격지 연결을 톡해 둜컬의 νŒŒμΌμ„ EC2둜 μ—…λ‘œλ“œν•˜λŠ” κ²½μš°μ— μ‚¬μš©

remote-exec ν”„λ‘œλΉ„μ €λ„ˆ

  • remote-exec β†’ 원격지 ν™˜κ²½μ—μ„œ μ‹€ν–‰ν•  μ»€λ§¨λ“œμ™€ 슀크립트λ₯Ό μ •μ˜
  • EC2 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  VMμ—μ„œ μ‹€ν–‰ν•  λͺ…λ Ή 등을 μ •μ˜
resource "aws_instance" "file_ec2" {
  ami           = "ami-0c9c942bd7bf113a2"
  instance_type = "t3.micro"

  # 원격지 μ—°κ²°
  # 1.2.3.4의 IPλ₯Ό κ°€μ§€λŠ” EC2 μΈμŠ€ν„΄μŠ€μ— ssh둜 μ—°κ²°
  connection {
    type     = "ssh"
    user     = "root"
    password = "Password"
    host     = "1.2.3.4"
  }

  # file ν”„λ‘œλΉ„μ €λ„ˆ
  # ν…ŒλΌνΌ μ‹€ν–‰ ν™˜κ²½μ— μžˆλŠ” 'install_script.sh'λ₯Ό EC2 μΈμŠ€ν„΄μŠ€μ— μ—…λ‘œλ“œ
  provisioner "file" {
    source      = "install_script.sh"
    destination = "/etc/install_script.sh"
  }

  # remote-exec ν”„λ‘œλΉ„μ €λ„ˆ
  # EC2μ—μ„œ inline에 μžˆλŠ” μ»€λ§¨λ“œλ₯Ό μˆ˜ν–‰ν•˜λ„λ‘ μ§€μ‹œ
  provisioner "remote-exec" {
    inline = [
      "chmod +x /ect/install_script.sh",
      "/bin/bash /etc/install_script.sh"
    ]
  }
}

3-13. null_resources와 terraform_data


  • ν…ŒλΌνΌ 1.4 버전이 릴리슀 λ˜λ©΄μ„œ κΈ°μ‘΄ null_resource λ¦¬μ†ŒμŠ€λ₯Ό λŒ€μ²΄ν•˜λŠ” terraform_data λ¦¬μ†ŒμŠ€κ°€ μΆ”κ°€

null_resource

  • 아무 μž‘μ—…λ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” λ¦¬μ†ŒμŠ€λ₯Ό κ΅¬ν˜„
  • μ‚¬μš©μžκ°€ μ˜λ„μ μœΌλ‘œ ν”„λ‘œλΉ„μ €λ‹ν•˜λŠ” λ™μž‘μ„ μ‘°μœ¨ν•΄μ•Ό ν•˜λŠ” μƒν™©μ—μ„œ
    β†’ ν”„λ‘œλ°”μ΄λ”κ°€ μ œκ³΅ν•˜λŠ” λ¦¬μ†ŒμŠ€ 수λͺ…μ£ΌκΈ° κ΄€λ¦¬λ‘œλ§Œμ€ ν•΄κ²°ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έ

terraform_data

  • κΈ°μ‘΄ null_resource의 κΈ°λŠ₯적인 μš”μ†Œλ₯Ό λŒ€μ²΄ν•˜κΈ° μœ„ν•΄ μΆ”κ°€ β†’ null_resourceλŠ” λ³„λ„μ˜ ν”„λ‘œλ°”μ΄λ”κ΅¬μ„±μ΄ ν•„μš”
  • terraform_data와 null_resource의 μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€λŠ” κ°™λ‹€.
  • κ°•μ œ μž¬μ‹€ν–‰ β†’ triggers_replace
  • μƒνƒœ μ €μž₯ β†’ input 인수
  • input에 μ €μž₯된 값을 좜λ ₯ β†’ output 속성

3-14. moved 블둝


  • ν…ŒλΌνΌ State에 κΈ°λ‘λ˜λŠ” λ¦¬μ†ŒμŠ€ 이름이 λ³€κ²½λ˜λ©΄ κΈ°μ‘΄ λ¦¬μ†ŒμŠ€λŠ” μ‚­μ œλ˜κ³  μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€κ°€ μƒμ„±λœλ‹€.

    β†’ λ¦¬μ†ŒμŠ€ 이름은 λ³€κ²½λ˜μ§€λ§Œ ν…ŒλΌνΌμœΌλ‘œ ν”„λ‘œλΉ„μ €λ‹ν•œ ν™˜κ²½μ„ κ·ΈλŒ€λ‘œ μœ μ§€ν•˜κ³ μž ν•˜λŠ” 경우 movedλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

  • ν…ŒλΌνΌ 1.1 버전뢀터 movedλ₯Ό μ‚¬μš©ν•  수 있으며, μ΄μ „μ—λŠ” terraform state mv λͺ…λ ΉμœΌλ‘œ Stateλ₯Ό μ‘°μž‘ν•΄μ•Όν•˜λŠ” 뢀담이 μžˆμ—ˆλ‹€.

  • AλΌλŠ” λ¦¬μ†ŒμŠ€μ˜ 이름을 B둜 λ³€κ²½ν•˜κ³ μž ν•˜λŠ” 경우 moved 블둝을 μž‘μ„±ν•˜κ³  apply ν•˜κ³  moved 블둝을 μ‚­μ œν•˜λ©΄ λœλ‹€.

# AλΌλŠ” μ΄λ¦„μ˜ local_file λ¦¬μ†ŒμŠ€λ₯Ό BλΌλŠ” μ΄λ¦„μœΌλ‘œ λ³€κ²½
moved {
  from = local_file.A
  to   = local_file.B
}

3-15. CLIλ₯Ό μœ„ν•œ μ‹œμŠ€ν…œ ν™˜κ²½ λ³€μˆ˜


  • ν…ŒλΌνΌμ€ ν™˜κ²½ λ³€μˆ˜λ₯Ό 톡해 μ‹€ν–‰ 방식과 좜λ ₯ λ‚΄μš©μ— λŒ€ν•œ μ˜΅μ…˜μ„ 쑰절`ν•  수 μžˆλ‹€.
  • μ‹œμŠ€ν…œ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜λ©΄, 영ꡬ적으둜 둜컬 ν™˜κ²½μ— μ μš©λ˜λŠ” μ˜΅μ…˜μ΄λ‚˜ 별도 μ„œλ²„ ν™˜κ²½μ—μ„œ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μ˜΅μ…˜μ„ λΆ€μ—¬ν•  수 μžˆλ‹€.
    β†’ 이λ₯Ό 톡해 둜컬 μž‘μ—… ν™˜κ²½κ³Ό λ‹€λ₯Έ

TF_LOG

  • stderr 둜그 레벨 μ •μ˜ β†’ trace, debug, info, warn, error, off
  • TF_LOG : λ‘œκΉ… 레벨 μ§€μ •
  • TF_LOG_PATH : 둜그 파일 μœ„μΉ˜ μ§€μ •
  • TF_LOG_CORE : ν…ŒλΌνΌ μ½”μ–΄μ˜ λ‘œκΉ… 레벨 μ§€μ •
  • TF_LOG_PROVIDER : ν”„λ‘œλ°”μ΄λ”μ˜ λ‘œκΉ… 레벨 μ§€μ •

TF_INPUT

  • TF_INPUT으둜 0 λ˜λŠ” falseλ₯Ό μ„€μ •ν•˜λŠ” 경우 β†’ μž…λ ₯λ°›λŠ” λ™μž‘μ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠμŒ

TF_VAR_name

  • default둜 μ„ μ–Έλœ λ³€μˆ˜λ₯Ό λŒ€μ²΄ν•˜λŠ” ν™˜κ²½ λ³€μˆ˜

TF_CLI_ARGS / TF_CLI_ARGS_subcommand

  • ν…ŒλΌνΌ μ‹€ν–‰ μ‹œ μΆ”κ°€ν•  인수λ₯Ό μ •μ˜

TF_DATA_DIR

  • μž‘μ—… 디렉터리별 데이터(state μ €μž₯ λ°±μ—”λ“œ, λͺ¨λ“ˆ, μ•„ν‹°νŒ©νŠΈ λ“±)λ₯Ό λ³΄κ΄€ν•˜λŠ” μœ„μΉ˜λ₯Ό μ§€μ •
    β†’ init 이후에 TF_DATA_DIR 경둜λ₯Ό μž¬μ§€μ •ν•˜λŠ” 경우 ν”ŒλŸ¬κ·ΈμΈ μ„€μΉ˜κ°€ ν•„μš”ν•˜λ‹€λŠ” λ©”μ„Έμ§€κ°€ 좜λ ₯

CH4. ν”„λ‘œλ°”μ΄λ”


  • ν…ŒλΌνΌμ€ μ½”λ“œλ‘œ κ΄€λ¦¬ν•˜κ³ μž ν•˜λŠ” λŒ€μƒμ„ 호좜 ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ‹€ν–‰
  • κ΄€λ¦¬ν•˜κ³ μž ν•˜λŠ” λŒ€μƒλ“€μ˜ ν˜ΈμΆœν•˜λŠ” 방식은 λͺ¨λ‘ λ‹€λ₯΄μ§€λ§Œ μΌκ΄€λ˜κ²Œ 호좜 ν•  수 μžˆλŠ” 이유 β†’ ν”„λ‘œλ°”μ΄λ”
  • ν”„λ‘œλ°”μ΄λ”λŠ” ν…ŒλΌνΌμ΄ κ΄€λ¦¬ν•˜λŠ” λ¦¬μ†ŒμŠ€ μœ ν˜•κ³Ό 데이터 μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ μ—°κ²°
  • ν…ŒλΌνΌμ€ ν”„λ‘œλ°”μ΄λ” μ—†μ΄λŠ” μ–΄λ–€ μ’…λ₯˜μ˜ 인프라와 μ„œλΉ„μŠ€λ„ 관리할 수 μ—†λ‹€

4-1. ν”„λ‘œλ°”μ΄λ” ꡬ성


  • ν”„λ‘œλ°”μ΄λ”μ—λŠ” Tierκ°€ 쑴재
    β†’ Official (hashicorpκ°€ 관리) / Partner (νŒŒνŠΈλ„ˆκ°€ 관리) / Community (개인) / Archived (κ΄€λ¦¬λ˜μ§€ μ•ŠμŒ)

단일 ν”„λ‘œλ°”μ΄λ”μ˜ 닀쀑 μ •μ˜

  • 단일 ν”„λ‘œλ°”μ΄λ”λ₯Ό 닀쀑 μ •μ˜ν•˜κ³ μž ν•˜λŠ” 경우 β†’ ν”„λ‘œλ°”μ΄λ”μ— aliasλ₯Ό μ„ μ–Έ`
provider "aws" {
  region = "us-west-1"
}

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

resource "aws_instance" "app_server" {
  provider      = aws.seoul
  ami           = "ami-0c9c942bd7bf113a2"
  instance_type = "t3.micro"
}

ν”„λ‘œλ°”μ΄λ” μ„€μΉ˜ 및 μš”κ΅¬μ‚¬ν•­ μ •μ˜

  • terraform init λͺ…령을 톡해 μ •μ˜λœ ν”„λ‘œλ°”μ΄λ”λ₯Ό μ„€μΉ˜ν•˜κ²Œ λœλ‹€.
  • μ½”λ“œλ‘œ μž‘μ„±ν•œ 인프라λ₯Ό 항상 λ™μΌν•œ ν”„λ‘œλ°”μ΄λ”λ‘œ λ°°ν¬ν•˜λŠ” 방법
    β†’ terraform λΈ”λŸ­μ— ν”„λ‘œλ°”μ΄λ” 버전을 λͺ…μ‹œ
    β†’ .terraform.lock.hcl을 μ½”λ“œμ™€ ν•¨κ»˜ 곡유
  • terraform λΈ”λŸ­μ˜ required_providers λΈ”λŸ­μ— μ—¬λŸ¬ 개의 ν”„λ‘œλ°”μ΄λ”λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
  • required_providers λΈ”λŸ­μ˜ sourceμ—λŠ” ν”„λ‘œλ°”μ΄λ” λ‹€μš΄λ‘œλ“œ 경둜λ₯Ό μ§€μ •ν•˜κ³ , versionμ—λŠ” 버전 μ œμ•½μ„ λͺ…μ‹œν•œλ‹€.

4-2. ν”„λ‘œλ°”μ΄λ” μ—μ½”μ‹œμŠ€ν…œ


  • μ—μ½”μ‹œμŠ€ν…œμ„ μœ„ν•œ ν…ŒλΌνΌ 톡합 β†’ μ›Œν¬ν”Œλ‘œ νŒŒνŠΈλ„ˆμ™€ 인프라 νŒŒνŠΈλ„ˆ
  • μ›Œν¬ν”Œλ‘œ νŒŒνŠΈλ„ˆ β†’ ν…ŒλΌνΌ μ‹€ν–‰κ³Ό μ—°κ³„ν•˜μ—¬ λ™μž‘ν•˜λŠ” κΈ°λŠ₯을 제곡
  • 인프라 νŒŒνŠΈλ„ˆ β†’ μ‚¬μš©μžκ°€ λŒ€μƒ ν”Œλž«νΌμ˜ API둜 λ¦¬μ†ŒμŠ€ 관리

4-3. ν”„λ‘œλ°”μ΄λ” κ²½ν—˜ν•΄λ³΄κΈ°


AWS

  • νšŒμ› κ°€μž… β†’ IAM μ½˜μ†” β†’ μ•‘μ„ΈμŠ€ ν‚€ λ°œκΈ‰ β†’ ν…ŒλΌνΌ μ½”λ“œ μž‘μ„±

Azure

  • UI(μ½˜μ†”)둜 ID와 μ‹œν¬λ¦Ώ μ·¨λ“ν•˜λŠ” 방법
  • νšŒμ› κ°€μž… β†’ Azure Active Directory β†’ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 등둝 β†’ client_id와 tenant_id 확인
    β†’ ν΄λΌμ΄μ–ΈνŠΈ μ•”ν˜Έ μ„€μ • β†’ client_secret 확인 β†’ subscription_id 확인 β†’ μ•‘μ„ΈμŠ€ μ œμ–΄(IAM)μ—μ„œ μ—­ν•  ν• λ‹Ή β†’ ꡬ성원을 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 등둝
    β†’ ν…ŒλΌνΌ μ½”λ“œ μž‘μ„±

GCP

  • UI(μ½˜μ†”)둜 ID와 μ‹œν¬λ¦Ώ μ·¨λ“ν•˜λŠ” 방법
  • νšŒμ›κ°€μž… β†’ IAM 및 κ΄€λ¦¬μžμ—μ„œ ν”„λ‘œμ νŠΈ 선택 λ˜λŠ” 생성 β†’ JSON μœ ν˜•μ˜ ν‚€λ₯Ό λ‹€μš΄λ‘œλ“œ β†’ ν…ŒλΌνΌ μ½”λ“œ μž‘μ„±

Alibaba Cloud

  • UI(μ½˜μ†”)둜 ID와 μ‹œν¬λ¦Ώ μ·¨λ“ν•˜λŠ” 방법
  • νšŒμ›κ°€μž… β†’ RAM(Resource Access Management)μ—μ„œ μ„œλΈŒ User 생성 β†’ μ„œλΈŒ User에 λ¦¬μ†ŒμŠ€ κ΄€λ ¨ κΆŒν•œ λΆ€μ—¬
    β†’ RAMμ—μ„œ AccessKey ID와 AccessKey Secret 확인 β†’ ν…ŒλΌνΌ μ½”λ“œ μž‘μ„±
λ°˜μ‘ν˜•