저번 강의에 이어서 Terraform의 상태와 관련된 명령어들을 간단히 알아보도록 하겠습니다.
$ terraform state list
지금 terraform work-space가 관리중인 리소스 목록을 확인할 수 있습니다.
$ terraform state show aws_iam_group.developer
그리고 show를 통해서 해당 리소스를 코드의 형태로 확인할 수도 있습니다.
그 다음에는 mv명령어를 알아보기 위해, 테라폼 코드를 리팩토링하는 과정을 거쳐보도록 하겠습니다.
/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"
# }
# refactoring -- version
resource "aws_iam_group" "this" {
for_each = toset(["developer", "employee"])
name = each.key
}
# output "groups" {
# value = [
# aws_iam_group.developer,
# aws_iam_group.employee,
# ]
# }
output "groups" {
value = aws_iam_group.this
}
/**
* 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.this["developer"].name, aws_iam_group.this["employee"].name] : [aws_iam_group.this["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
]
}
다음과 같이 짜게되면
기존의 aws_iam_group.developer -> aws_iam_group.this["developer"]로 변하게 됩니다. employee도 마찬가지고요. 이와같이 각 리소스에는 변화가 없는데, 상태를 삭제하고 다시 생성하는 것은 현업에서 매우 큰 장애를 일으킬 수도 있습니다.
$ terraform state mv 'aws_iam_group.developer' 'aws_iam_group.this["developer"]'
$ terraform state mv 'aws_iam_group.employee' 'aws_iam_group.this["employee"]'
그리고 다시 apply를 하게되면
output결과만 조금 달라지는 것을 보실 수 있고 아무것도 변경되지 않는 것을 보실 수 있습니다.
그 다음은 rm명령어 입니다. 테라폼으로 더 이상 관리하지 않는 경우 사용합니다. 만약 권한관리를 Terraform을 사용하는데, 더 좋은 Super_acl이라는게 만들어 졌습니다. 그래서 Terraform에서 작성한 권한관리 코드를 제거하고, migrate하기 위해 사용됩니다.
그래서 위 코드에서 developer에게 권한을 설정하는 부분을 지우고 apply를 하면, 또 권한을 삭제할겁니다. 하지만 이렇게 하게 되면 실무에서는 장애가 발생할 수 있습니다. 그래서 terraform state list를 통해서 권한 관리와 관련된 리소스를 파악하고, terraform rm으로 이를 삭제해주면 됩니다.
다시 apply를 하면 변경사항은 없는 것을 보실 수 있습니다.
하지만 얘들에대한 실제 권한은 없어지지 않음을 확인할 수 있습니다.
마지막으로 push, pull인데, 이는 git과 매우 유사합니다. work-space의 상태를 추가하고, local에 remote work-space의 상태를 받아오는 것입니다. push는 매우 위험하니까, pull로 remote work-space파일을 받아오는 작업만 간단히 해보겠습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 워크스페이스 관리 (0) | 2022.08.01 |
---|---|
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 리소스 강제 교체하기 (taint & untaint) (0) | 2022.08.01 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 상태 저장소(Backend) (0) | 2022.08.01 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL 반복문 (For) (0) | 2022.07.21 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 HCL 조건문 (Conditional) (0) | 2022.07.21 |