Variables 활용하기

Chori·2024년 12월 24일
0
post-thumbnail

처음 시작하는 Infrastructure as Code: AWS & 테라폼을 수강하며 정리한 내용입니다.


  • Terraform에서 변수를 선언하여 사용할 수 있음
  • 변수의 정의(선언)은 .tf 파일 어디에서나 가능하지만 주로 variables.tf 파일을 만들어서 사용

변수 정의

  • variables.tf 파일에 변수 정의
  • 변수를 선언할 때는 variable 뒤에 변수명을 입력하고 타입 지정
  • 기본값을 주입할 때는 default로 쓸 수도 있고 terraform.tfvars 파일을 만들어서 변수 = 값 형태로 쓸 수 있음
variable "image_id" {
  type = string
}

variable "availability_zone_names" {
  type = list(string)
  default = ["us-west-1a"]
}

variable "ami_id_maps" {
  type = map
  default = {}
}
  • terraform.tfvars 파일은 다음과 같이 작성
image_id = "ami-064c81ce3a290fde1"
availablility_zone_names = ["us-west-1a", "us-west-1b", "us-west-1c"]
ami_id_maps = {
  ap-northeast-2 = {
    amazon_linux2 = "ami-010bf43fe22f847ed"
    ubuntu_18_04 = "ami-061b0ee20654981ab"
  }

  us-east-1 = {
    amazon_linux2 = "ami-0d29b48622869dfd9"
    ubuntu_18_04 = "ami-0d324124b7b7eec66"
  }
}
  • 기본값을 주입하는 또 다른 방법으로는 module block을 사용하거나 사용자가 키보드로 입력하는 것이 있음

output 사용하기

  • 변수를 아직 사용하지 않았을 때 변수가 어떻게 들어갔는지 확인하고 싶다면 output을 사용하는 방법이 있음
  • output은 remote state로 사용하기도 하지만 변수의 값을 볼 때도 사용할 수 있음
  • output.tf 파일을 아래처럼 작성
output "image_id" {
  value = var.image_id
}

output "availability_zone_names" {
  value = var.availability_zone_names
}

output "ami_id_maps" {
  value = var.ami_id_maps
}
  • terraform apply 명령을 실행하면 output은 state 파일에 변수를 저장
  • 그러면 변수의 값이 화면에 출력됨

  • 리스트 변수에서 특정 인덱스에 해당하는 값을 가져올 수도 있음
  • output.tf 파일에 아래 내용을 추가
output "first_availability_zone_name" {
  value = var.availability_zone_names[0]
}
  • 그리고 terraform apply 명령을 실행하면 availability_zone_names 리스트에서 첫 번째 인덱스의 값도 출력됨


실습

  • IAM 예제에 변수 적용하기

provider.tf

  • 수정 전
provider "aws" {
  region = "ap-northeast-2"
}
  • 수정 후
provider "aws" {
  region = var.aws_region
}
  • variables.tf 파일은 다음과 같이 작성
variable "aws_region" {
  description = "region for aws."
}
  • 위와 같이 작성하면 terraform planterraform apply를 했을 때 변수의 값을 사용자가 키보드로 입력해야 함

  • terraform.tfvars로 기본값을 주입하려면 아래와 같이 파일을 생성
aws_region = "ap-northeast-2"

devops_group.tf

  • 수정 전
resource "aws_iam_group" "devops_group" {
  name = "devops"
}

resource "aws_iam_group_membership" "devops" {
  name = aws_iam_group.devops_group.name

  users = [
    aws_iam_user.gildong_hong.name
  ]

  group = aws_iam_group.devops_group.name
}
  • 수정 후
resource "aws_iam_group" "devops_group" {
  name = "devops"
}

resource "aws_iam_group_membership" "devops" {
  name = aws_iam_group.devops_group.name

  users = var.iam_user_list

  group = aws_iam_group.devops_group.name
}
  • variables.tf 파일에 아래의 변수 추가, 타입은 리스트로 지정
variable "iam_user_list" {
  type = list(string)
}
  • terraform.tfvars 파일에서 기본값 지정
iam_user_list = ["gildong.hong"]

새로운 사용자 추가하기

  • user_gildong_hong.tf 파일 복제
cp user_gildong_hong.tf user_chori_hi.tf
  • vim에서 아래 명령어를 입력하여 사용자 이름을 찾아서 바꾸기
:s%/gildong_hong/chori_hi/g
:s%/gildong.hong/chori.hi/g
  • 그리고 복제된 파일에서 리소스의 이름을 변경하면 아래처럼 작성됨
resource "aws_iam_user" "chori_hi" {
  name = "chori.hi"
}

resource "aws_iam_user_policy" "art_devops_black_for_chori" {
  name = "super-admin"
  user = aws_iam_user.chori_hi.name

  policy = <<EOF
  {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "*"
        ],
        "Resource": [
          "*"
        ]
      }
    ]
  }
  EOF
}
  • 그룹에 새로운 사용자를 등록하기 위해 variables.tf 파일에도 사용자 추가
iam_user_list = ["gildong.hong", "chori.hi"]
  • terraform planterraform apply 명령어 실행
  • AWS 콘솔에서 추가된 사용자 확인

profile
전부인 것처럼, 전부가 아닌 것처럼

0개의 댓글