본문 바로가기

♻ Terraform(테라폼)/Terraform output

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은 리소스의 현재 값을 확인 할 수 있고, 인프라를 구성하는 측면에서 매우 중요하다고 생각한다.