local State는 우리가 이전에 사용했던 terraform.tfstate라는 파일을 활용하는 것입니다. 이 반면에 remote state는 상태를 원격 저장소에 저장하는 경우를 말합니다. 그리고 이를 저장해 주기 위한 것이 Terraform Backend(State Storage)라고 합니다. 이 종류에는 Local, Remote, AWS S3 Backend등이 있습니다.
여기서는 간단히 S3, Remote Backend(Terraform Cloud)를 알아보겠습니다. 그리고 리모트 백엔드를 고를 떄 고려를 해야할 것이 Locking입니다. Locking은 Terraform상태 파일을 원격에 놓았을 때 여러 작업자들 사이에서 작업이 일어날 떄 발생하는 문제를 말합니다.
S1 -> S2 -> S3라는 상태 flow가 있다고 해 봅시다. 근데 U1이 S3'1를 만들고, U2가 S3'2를 만드는 것을 동시에 apply한다고 했을 떄, 충돌이 발생합니다. 이러한 충돌을 방지하기 위해서 한명에게 실행권한을 주고 락을 거는 기능인 Locking을 제공합니다.
기본적으로 S3은 DynamoDB가 있을때만 Locking기능을 제공합니다.
실습
/main.tf
# terraform {
# backend "s3" {
# bucket = "hyunseo-devops-terraform"
# key = "s3-backend/terraform.tfstate"
# region = "ap-northeast-2"
# }
# }
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "knu"
workspaces {
name = "tf-cloud-backend"
}
}
}
provider "aws" {
region = "ap-northeast-2"
}
/**
* Groups
*/
resource "aws_iam_group" "developer" {
name = "developer"
}
resource "aws_iam_group" "employee" {
name = "employee"
}
output "groups" {
value = [
aws_iam_group.developer,
aws_iam_group.employee,
]
}
/**
* Users
*/
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.developer.name, aws_iam_group.employee.name] : [aws_iam_group.employee.name]
}
locals {
developers = [
for user in var.users :
user
if user.is_developer
]
}
resource "aws_iam_user_policy_attachment" "developer" {
for_each = {
for user in local.developers :
user.name => user
}
user = each.key
policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"
# 의존성을 계산 -> aws_iam_user.this 다음에 실행되어야 함.
depends_on = [
aws_iam_user.this
]
}
output "developers" {
value = local.developers
}
output "high_level_users" {
value = [
for user in var.users :
user
if user.level > 5
]
}
이전에 for문 예제에서 사용했던 코드를 활용했습니다. 그리고 맨 위에 terraform 블럭을 작성하고 s3, remote backend를 설정하는 코드를 간단히 작성해 주었습니다. 그리고 각각을 주석을 풀고 실행하면 아래와 같이 상태가 관리됩니다.
다음 시간에 더 깊게 알아보도록 하겠습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 리소스 강제 교체하기 (taint & untaint) (0) | 2022.08.01 |
---|---|
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 상태 관리 (0) | 2022.08.01 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL 반복문 (For) (0) | 2022.07.21 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL 조건문 (Conditional) (0) | 2022.07.21 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL count와 for_each (0) | 2022.07.21 |