다음과 같이 다양한 workspace들이 있는데, workspace1은 workspace2를 참조해야 하는 상황이 생길 수도 있습니다. w2의 어트리뷰트를 활용하여 w1을 만들어야 하는 상황인것이죠. 이러한 니즈를 해결하기 위해 등장한 것이 remote_state입니다.
이는 워크스페이스가 state 관리의 단위라고 했습니다. 그리고 각 workspace는 상태파일을 가지고 관리합니다. 즉 remote_state 다른 워크스페이스의 상태파일을 참조하겠다는 말입니다. remote_state는 backend를 가지고 있어야 합니다. 그래서 각 remote_backend마다 코드가 조금씩 달라집니다.
https://www.terraform.io/language/settings/backends/local
Backend Type: local | Terraform by HashiCorp
Terraform can store the state remotely, making it easier to version and work with in a team.
www.terraform.io
여기에서 각각의 backend별로 terraform_remote_state를 어떻게 활용할 수 있는지 나옵니다.
이제 이 terraform_remote_state를 어떻게 활용할 수 있는지 실습해보겠습니다.
여기서 우리는 network -> ec2-instance이 flow로 만들겁니다. 당연히 VPC가 있어야, 그 위에 ec2인스턴스를 올릴 수 있기 때문입니다. 이 두개 모두 이전에 사용했던 코드를 사용하겠습니다.
/network/main.tf
provider "aws" {
region = "ap-northeast-2"
}
variable "vpc_name" {
description = "생성되는 VPC의 이름"
type = string
default = "default"
}
locals {
common_tags = {
Project = "Network"
Owner = "posquit0"
}
}
output "vpc_name" {
value = module.vpc.name
}
output "vpc_id" {
value = module.vpc.id
}
output "vpc_cidr" {
description = "생성된 VPC의 CIDR 영역"
value = module.vpc.cidr_block
}
output "subnet_groups" {
value = {
public = module.subnet_group__public
private = module.subnet_group__private
}
}
module "vpc" {
source = "tedilabs/network/aws//modules/vpc"
version = "0.24.0"
name = var.vpc_name
cidr_block = "10.0.0.0/16"
internet_gateway_enabled = true
dns_hostnames_enabled = true
dns_support_enabled = true
tags = local.common_tags
}
module "subnet_group__public" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
map_public_ip_on_launch = true
subnets = {
"${module.vpc.name}-public-001/az1" = {
cidr_block = "10.0.0.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-public-002/az2" = {
cidr_block = "10.0.1.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = local.common_tags
}
module "subnet_group__private" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
map_public_ip_on_launch = false
subnets = {
"${module.vpc.name}-private-001/az1" = {
cidr_block = "10.0.10.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-private-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = local.common_tags
}
module "route_table__public" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
subnets = module.subnet_group__public.ids
ipv4_routes = [
{
cidr_block = "0.0.0.0/0"
gateway_id = module.vpc.internet_gateway_id
},
]
tags = local.common_tags
}
module "route_table__private" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
subnets = module.subnet_group__private.ids
ipv4_routes = []
tags = local.common_tags
}
늘 그랬듯이, vpc, subnet_groups, route_table, internet_gateway를 만들어 주었습니다.
/ec2-instance/main.tf
provider "aws" {
region = "ap-northeast-2"
}
data "terraform_remote_state" "network" {
backend = "local"
config = {
path = "${path.module}/../network/terraform.tfstate"
}
}
locals {
vpc_name = data.terraform_remote_state.network.outputs.vpc_name
subnet_groups = data.terraform_remote_state.network.outputs.subnet_groups
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_instance" "ubuntu" {
ami = data.aws_ami.ubuntu.image_id
instance_type = "t2.micro"
subnet_id = local.subnet_groups["public"].ids[0]
tags = {
Name = "${local.vpc_name}-ubuntu"
}
}
여기서 remote_state를 local로 해서 작성한 network의 속성들을 참조하고 있습니다. vpc_name, subnet_groups의 이름을 data.terraform_remote_state.network.output.~~으로 참조하고 있습니다. 그래서 위에 network에서 output으로 적절히 vpc_name, subnet_groups을 적어 주었던 것입니다. 그래서 local.subnet_groups["public"].ids[0]즉 첫번째 퍼블릭 서브넷 위에 ec2-instance를 올린것을 보실 수 있습니다.
일단 VPC를 default라는 이름으로 만들었습니다.
바로 ec2-instance를 apply했습니다. 이전에 network의 속성이 잘 참조됩니다. default-ubuntu라고 잘 나옵니다.
다음과 같이 VPC와 public-subnet-001/az1에 잘 등록된 것을 보실 수 있습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - (패커를 이용한 머신 이미지 관리) - 기초 && 빌더 (0) | 2022.08.02 |
---|---|
[ DevOps ] - (패커를 이용한 머신 이미지 관리) - 패커 소개 (0) | 2022.08.02 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 모듈 작성 (0) | 2022.08.02 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 워크스페이스 관리 (0) | 2022.08.01 |
[ DevOps ] - (테라폼을 이용한 인프라 관리) 테라폼 리소스 강제 교체하기 (taint & untaint) (0) | 2022.08.01 |