Terraform에는 명명된 값을 요청하거나 게시하기 위한 몇 가지 종류의 블록이 포함되어 있습니다.
- Input Variables 는 Terraform 모듈의 매개변수 역할을 하므로 사용자는 소스를 편집하지 않고도 동작을 커스터마이징할 수 있습니다.
- Output Values 은 Terraform 모듈의 반환(return) 값과 같습니다.
- Local Values 은 표현식에 간단한 이름을 지정할 수 있는 편리한 기능입니다.
2023.02.07 - [IaC/Terraform] - [Terraform]테라폼 Input Variables 사용법
2023.02.09 - [IaC/Terraform] - [Terraform]테라폼 Local Values 사용법
Output Values doc Link
Output Values
테라폼에서 사용하는 값(value)의 이름을 작성하거나 배포하기 위한 몇가지 블럭이 존재한다.
그중 아래에서 Output Values에 대하여 알아보자.
Output Values은 command line에서 인프라에 대한 정보를 사용할 수 있게 하고, 다른 Terraform 구성이 사용할 수 있도록 정보를 노출할 수 있다.
참고: 출력은 Terraform이 plan을 aply할 때만 렌더링됩니다. 실행 terraform plan하면 출력이 렌더링되지 않습니다.
Declaring an Output Value
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
# Configure the AWS Provider
provider "aws" {
region = "ap-northeast-2"
}
# Input values 작성
variable "ec2_name" {
# 공백으로 두고 apply할때 vpc_name을 입력 받는다.
description = "생성되는 ec2의 이름 설정"
type = string
default = "ec2-name-from-input-variable"
}
# Local values 작성
locals {
common_tags = {
Env = "dev"
Project = "IaC"
}
}
# Out values 작성
output "subnet_id" {
value = aws_instance.jeff_tf_ubuntu.subnet_id
}
output "security_groups" {
value = aws_instance.jeff_tf_ubuntu.security_groups
}
# resource - instanace
resource "aws_instance" "jeff_tf_ubuntu" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
subnet_id = "subnet-004f0791a0c0c4e57" # public-management-1a
security_groups = [ "sg-07a2fa9eb741e42d6" ] # management
tags = merge(
{
Name = var.ec2_name
},
local.common_tags # Local Values를 사용
)
}
# data - aws_ami
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
}
output 섹션에서 특정 리소스의 특정 속성을 참조하려면, 리소스의 타입과 이름을 사용한다.
output "subnet_id" { value = aws_instance.jeff_tf_ubuntu.subnet_id }
output "security_groups" { value = aws_instance.jeff_tf_ubuntu.security_groups }
tf apply
➜ tf apply
Plan: 1 to add, 0 to change, 1 to destroy.
Changes to Outputs:
+ security_groups = [
+ "sg-07a2fa9eb741e42d6",
]
+ subnet_id = "subnet-004f0791a0c0c4e57"
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
module 전체를 output으로 가져오기
# 중략 위 예제 참고
output "jeff_tf_ubuntu" {
value = aws_instance.jeff_tf_ubuntu
}
# resource - instanace
resource "aws_instance" "jeff_tf_ubuntu" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
subnet_id = "subnet-004f0791a0c0c4e57" # public-management-1a
security_groups = [ "sg-07a2fa9eb741e42d6" ] # management
tags = merge(
{
Name = var.ec2_name
},
local.common_tags # Local Values를 사용
)
}
# data - aws_ami
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
}
output 섹션에서 특정 리소스의 전체 속성을 참조하려면, 리소스의 이름을 사용한다.
output "jeff_tf_ubuntu" { value = aws_instance.jeff_tf_ubuntu }
결과
Changes to Outputs:
+ jeff_tf_ubuntu = {
+ ami = "ami-058ee296e933b9e6a"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ capacity_reservation_specification = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_options = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ credit_specification = []
+ disable_api_stop = (known after apply)
+ disable_api_termination = (known after apply)
Custom Output Value
특정 형식이나 구조로 정보를 추출하거나 표시해야 할 경우 유용하다. (default: map)
예를 들어, 특정 리소스에서 여러 속성을 추출하여 JSON 또는 문자열 형식으로 출력하려는 경우에 커스텀 출력 값을 사용할 수 있다.
output "custom_output" {
value = "생성되는 ec2의 이름: ${var.ec2_name}"
}
tf apply
Changes to Outputs:
+ custom_output = "생성되는 ec2의 이름: ec2-name-from-custom.auto.tfvars"
Optional Arguments Link
output block은 선택적으로 description sensitive depends_on 인수를 포함할 수 있다.
description
description 인수는 출력 값의 설명을 정의합니다. 출력 값을 문서화하는 데 도움이 될 수 있으며, Terraform 코드의 이해를 돕습니다.
output "instance_ip" {
value = aws_instance.my_instance.public_ip
description = "The public IP address of the main instance."
}
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
Outputs:
instance_ip = "3.36.90.136"
sensitive
sensitive 인수는 출력 값에 민감한 정보가 포함되어 있는지 여부를 지정합니다. true로 설정하면, Terraform은 출력에서 이 값을 가리게 됩니다. 이것은 비밀번호, 개인 키 등과 같은 민감한 정보를 다룰 때 유용합니다.
output "db_password" {
value = aws_db_instance.my_db.password
sensitive = true
}
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
Outputs:
ec2_arn = <sensitive>
instance_ip = "43.200.6.219"
위의 예시에서 Terraform은 ec2_arn 값을 명시적으로 출력하지 않습니다.
depends_on
depends_on 인수는 출력 값이 의존하는 리소스나 모듈을 지정합니다. Terraform은 **depends_on**에 지정된 의존성이 완료될 때까지 해당 출력 값을 계산하지 않습니다. 이것은 순서에 민감한 동작을 제어하고자 할 때 유용합니다.
output "ec2_subnet_id" {
value = aws_instance.jeff_tf_ubuntu.subnet_id
depends_on = [ aws_instance.jeff_tf_ubuntu ]
}
resource "aws_vpc" "jeff_tf_vpc" {
cidr_block = "10.2.0.0/16"
tags = {
Name = "jeff_tf_vpc"
}
}
resource "aws_subnet" "jeff_tf_subnet" {
vpc_id = aws_vpc.jeff_tf_vpc.id
cidr_block = "10.2.1.0/24"
availability_zone = "ap-northeast-2a"
map_public_ip_on_launch = true
tags = {
Name = "jeff_tf_subnet"
}
}
# resource - instanace
resource "aws_instance" "jeff_tf_ubuntu" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
subnet_id = aws_subnet.jeff_tf_subnet.id # public-management-1a
security_groups = ["sg-07a2fa9eb741e42d6"] # management
tags = merge(
{
Name = var.ec2_name
},
local.common_tags # Local Values를 사용
)
}
# data - aws_ami
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
}
tf plan
Plan: 3 to add, 0 to change, 1 to destroy.
Changes to Outputs:
~ ec2_arn = (sensitive value)
+ ec2_subnet_id = (known after apply)
~ instance_ip = "43.200.6.219" -> (known after apply)
tf apply
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
Outputs:
ec2_arn = <sensitive>
instance_ip = "43.200.6.219"
위의 예시에서 aws_eip.my_eip의 IP 주소를 출력하기 전에 aws_instance.my_instance가 완료되어야 함을 보여줍니다.
이러한 인수들은 Terraform의 출력 값과 관련된 메타데이터를 제어하며, 코드의 가독성, 보안, 그리고 실행 순서를 개선하는 데 도움이 됩니다.
'IaC > Terraform' 카테고리의 다른 글
[Terraform]조건문(Conditional)을 사용하여 resource 작성하는 방법 (0) | 2023.08.20 |
---|---|
[Terraform]count와 for_each를 사용하여 반복되는 resource 작성하는 방법 (0) | 2023.08.20 |
[Terraform]테라폼 Local Values 사용법 (0) | 2023.02.09 |
[Terraform]테라폼 Input Variables 사용법 (0) | 2023.02.07 |
[Terraform]AWS Provider로 Ubuntu AWS EC2 Instance 만들기 (0) | 2023.02.05 |