IaC(Infrastructure as Code)

Terraform Cloud

cwchoiit 2024. 3. 10. 15:53
728x90
반응형
SMALL
728x90
SMALL

저번 포스팅에서 잠시 다루어보았던 Terraform Cloud를 좀 더 이해해보는 포스팅이다. 우선 기존에 만들었던 Organizations의 Workspace로 가보자.

 

Workspace > Settings > General에 가보면 다음과 같은 설정 부분이 있다.

 

저번엔 이 부분을 우선 Local로 하고 추후에 더 자세히 알아보기로 했었는데 이 부분에 대해 얘기할 시간이다. 

 

Execution Mode: Local

Terraform 명령 수행을 Local에서 실행하겠다는 의미이다. 즉, 작업자 PC에서 실행하겠다는 의미가 된다.

Terraform Cloud는 State 저장 역할만 수행하게 된다.

 

Execution Mode: Remote

Remote로 설정하게 되면 Terraform Cloud 인프라에 위치한 테라폼 명령어를 실행시키는 Runner를 이용해서 Terraform Code를 수행하게 된다. 즉, 작업자 PC에서는 어떠한 Terraform 관련 코드도 수행되지 않는다.

 

이건 이 테라폼 수행 코드가 작업자 PC에서만 접근 가능한 경우 Terraform Cloud 인프라에 위치한 Runner는 해당 리소스에 접근할 수 없기 때문에 접근 가능하도록 어떤 설정을 해줘야한다. 그렇기 때문에 저번 게시글에선 Remote로 우선은 작업하지 않은것이다.

 

이 Remote로 작업을 수행하게 되면 몇가지 장점들이 있다. 우선 Plan을 수행했을 때 자동으로 Apply를 실행할 것인지에 대한 선택을 할 수 있다.

 

그리고 Terraform Version 또한 지정할 수 있다.

 

그리고 Working Directory도 지정해줘야 한다.

 

그리고 가장 핵심 기능 중 하나인 워크스페이스에서 Variables 관리가 가능해진다.

 

또 하나 좋은 기능인 Run triggers 라는 기능이 있다. 이는 Organizations > Workspace 내부에서 확인할 수 있는데 다음 화면을 확인하자.

 

이 Run triggers는 어떤 것이냐면 A, B, C, D 라는 Workspace가 있을 때 B라는 워크스페이스는 A, D에 의존하고 있다고 가정해보자. 그럼 A 또는 D가 Apply가 일어나면 B도 자동으로 Apply를 해주는 기능이 Run triggers이다.

 

그럼 한번 Remote Execution Mode로 작업을 해보자.

 

Environment Variables 추가

우선, Provider가 AWS Provider이기 때문에 AWS CLI에 IAM User Credential을 추가한 것 처럼 이 Terraform Cloud한테도 Credential을 알려줘야한다. 그 방법은 위에서 보여준 Variables 화면에서 추가할 수 있다. 

 

위 사진처럼 Environment variable로 AWS Credential을 Sensitive로 추가해주자.

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

 

그리고 내가 이 Terraform Cloud를 사용해서 관리했던 테라폼 main.tf, terraform.tfvars 파일은 다음과 같다.

main.tf

terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "cwchoiit-terraform"

    workspaces {
      name = "cwchoiit-terraform-cloud-backend"
    }
  }
}

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

resource "aws_iam_group" "this" {
    for_each = toset(["developer", "employee"])

    name = each.key
  
}

output "groups" {
  value = aws_iam_group.this
}

variable "users" {
    type = list(any)
}

resource "aws_iam_user" "this" {
  for_each = {
    for user in var.users : user.name => user
  }

  name = each.key

  tags = {
    level = each.value.level
    role = each.value.role
  }
}

resource "aws_iam_user_group_membership" "this" {
  for_each = {
    for user in var.users : user.name => user
  }

  user = each.key

  groups = each.value.is_developer ? [
    aws_iam_group.this["developer"].name, aws_iam_group.this["employee"].name
    ] : [
        aws_iam_group.this["employee"].name
    ]

  depends_on = [ aws_iam_user.this ] # 이 리소스가 생성되어야만 가능하게 설정
}

locals {
  developers = [
    for user in var.users : user if user.is_developer
  ]
}

output "developers" {
  value = local.developers
}

output "high_level_users" {
  value = [
    for user in var.users : user if user.level > 5
  ]
}

 

terraform.tfvars

users = [
 {
    name = "john"
    level = 7
    role = "재무"
    is_developer = false
 },
 {
    name = "alice"
    level = 1
    role = "인턴 개발자"
    is_developer = true
 },
 {
    name = "tony"
    level = 4
    role = "데브옵스"
    is_developer = true
 },
 {
    name = "cindy"
    level = 9
    role = "경영"
    is_developer = false
 },
 {
    name = "hoon"
    level = 3
    role = "마케팅"
    is_developer = false
 }   
]

 

여기서 terraform.tfvars 파일에 있는 이 Terraform Variable 역시 Cloud에 추가해줘야 한다.

 

 

이제 모든 준비는 끝났고 위에서 말한 Working Directory 경로만 지정해주면 된다. 나의 경우 디렉토리 구조가 다음과 같이 되어있다.

 

그래서 Working Directory는 Remote Backend를 사용하는 loop로 지정하면 된다.

 

 

이제 Apply를 한번 해보자. 하기 전에 terraform login 명령어를 통해서 로그인을 먼저 해주자. 토큰은 로그인을 한번이라도 했다면 이 경로에 저장되어 있다.

~/.terraform.d/credentials.tfrc.json

 

실행이 되면 다음과 비슷한 모습으로 보여질 것이다. 그래서 우선 Plan 부분이 보여지고 마지막에 'yes' 입력하는 프롬프트에서 멈춘다.

 

'yes'를 입력하고 리소스를 적용하면 다음과 같다. Outputs이 쭉 나오고 AWS Console에서 리소스를 확인할 수 있다.

 

결과:

 

Terraform Cloud에서도 확인해보자. 리소스가 잘 반영되어있다.

728x90
반응형
LIST

'IaC(Infrastructure as Code)' 카테고리의 다른 글

terraform_remote_state  (0) 2024.03.10
Terraform 나만의 Module 만들어보기  (0) 2024.03.10
Terraform Workspace  (0) 2024.03.08
Terraform Commands (taint / untaint)  (0) 2024.03.08
Terraform State  (0) 2024.03.07