Terraform Output 이란?
# Terraform Output
- Terraform Output이란?
자바에서 java system.out.println 를 활용하여 리소스값을 화면에 출력하여 확인하는것처럼 테라폼에서도 리소스 값을 화면에 출력하여 확인하는 방법이 있다.
- 테라폼에서의 변수는 입력변수와 출력변수로 나눌수 있는데 입력변수는 variable.tf에 정의하고 출력변수는 output.tf에 정의한다.
- 리소스를 정의하고 콘솔 창에서 확인하는 방법으로 주로 output을 활용한다. 내가 정의한 리소스 의 실제 값이 어떤값을 부여 받았는지 확인하는 방법이 될 것이고, 두번째는 output을 활용하지 않으면 설정한 리소스 값을 모두 콘솔에서 직접 확인해 봐야한다는 불편함이 존재한다.
추가로 output은 테라폼 모듈이 실행되고 나서 출력/저장하고 싶은 값을 명시하는 역할도 한다.
이 값들을 가지고 실제 애플리케이션의 설정 파일(yaml 등)에 넣거나, Jenkins Job 변수로 넣어서 애플리케이션을 돌릴 수 있을 것이다. 해당 값들을 AWS 콘솔에 들어가서 복사를 하지 않아도 되서 편한거 같다.
그렇다면 저장은 어디에 할까?
terraform apply를 하고 나면 해당 코드의 적용 결과가 .tfstate 파일에 저장되는데, 여기에 output도 함께 저장된다.
이 state 파일은 여러 사람이 수정하는 것을 막기 위해서 AWS S3같은 원격 저장소에 저장해 두고 사용 시 Lock을 걸어버리기도 하는데, 이를 remote state라고 한다.
다른 모듈의 remote state가 이미 원격 저장소에 저장된 경우 그 모듈의 output 값을 끌어다 쓸 수 있다. 그리고 분리된 모듈 사이에서 정보를 공유할 수 있다.
결론은 output은 이름 그대로 저장/출력되는 값이라는 걸 알 수 있다.
# Terraform 활용하기
- ec2 인스턴스 생성을 위한 main.tf 파일의 내용은 아래와 같다.
# 프로바이서 설정 = aws
provider "aws" {
region = "ap-northeast-2"
}
# EC2 인스턴스 설정
resource "aws_instance" "example" {
ami = "ami-081511b9e3af53902" // AMI 이미지 ID를 넣어준다. AWS에서 확인가능
instance_type = "t2.micro" // EC2 인스턴스 타입을 설정한다.
vpc_security_group_ids = ["${aws_security_group.terraform-test.id}"] # 아래의 보안그룹의 정보를 활용한다는 의미로 세팅
user_data = <<-EOF
#!/bin/bash
echo "안녕하세요_테스트 페이지 입니다." > index.html
nohup busybox httpd -f -p 8080 &
EOF
tags = {
Name = "terraform-test" // EC2 인스턴스에 표시될 이름
}
}
resource "aws_security_group" "terraform-test" { //보안그룹 설정
name = "terraform-example-instance"
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
- output.tf 파일 내용은 아래와 같다.
output "public_ip" {
value = aws_instance.example.public_ip
}
output "security_info" {
value = aws_security_group.terraform-test.id
}
output "output-instance_ami" {
value = aws_instance.example.ami
}
output "output-instance_type" {
value = aws_instance.example.instance_type
}
output "output-user-data" {
value = aws_instance.example.user_data
}
output "aws_instance_example_tags" {
value = aws_instance.example.tags
}
output "aws_security_group_instance" {
value = aws_security_group.terraform-test.ingress
}
- terraform apply 후 output의 내용을 확인 할 수 있다.
- terraform에서 output은 리소스의 현재 값을 확인 할 수 있고, 인프라를 구성하는 측면에서 매우 중요하다고 생각한다.