[Terraform] 프로비저너 :: local-exec, remote-exec

Squirrel·2024년 8월 25일

Terraform

목록 보기
2/4
post-thumbnail

✅ 프로비저너(provisioner)란?

프로비저너(provisioner)란 리소스가 생성된 후 리소스에 대해 추가 설정 작업을 수행하기 위해 사용되는 도구이다.
가령,EC2 생성 후, 해당 인스턴스에 소프트웨어를 설치하거나 설정을 적용하는 작업을 자동으로 실행한다.

✅ 프로비저너 종류

  1. local-exec : 로컬 머신에서 명령을 실행
  2. remote-exec : 원격 리소스에서 명령을 실행
  3. file : 파일을 로컬 머신에서 원격 리소스로 복사

✅ (예제1) local file 업로드하기

local에 있는 file "script.sh"를 원격 인스턴스로 복사하는 작업을 진행한다.

1. key 생성

  • 아래 명령어로 key 생성
$ ssh-keygen -f mykey
  • 아래와 같이 public key, private key 생성됨

2. tf 파일에 provisioner 내용 + key 내용 추가

resource "aws_key_pair" "mykey" {
  key_name   = "mykey"
  public_key = file(var.PATH_TO_PUBLIC_KEY)
}

resource "aws_instance" "example" {
  ami           = var.AMIS[var.AWS_REGION]
  instance_type = "t2.micro"
  key_name      = aws_key_pair.mykey.key_name

  provisioner "file" {
    source      = "script.sh"
    destination = "/tmp/script.sh"
  }
  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/script.sh",
      "sudo sed -i -e 's/\r$//' /tmp/script.sh",  # Remove the spurious CR characters.
      "sudo /tmp/script.sh",
    ]
  }
  connection {
    host        = coalesce(self.public_ip, self.private_ip)
    type        = "ssh"
    user        = var.INSTANCE_USERNAME
    private_key = file(var.PATH_TO_PRIVATE_KEY)
  }
}

3. EC2에 SSH 규칙 추가

4. terraform apply

  • 당연히 앞에서 생성한 key들은 tf 파일들이 위치한 경로 내에 존재해야 한다.
  • terraform apply를 하면 전에 생성한 public_key가 보여진다.

  • 스크립트를 프로비전 및 실행하고 ssh를 통해 연결을 시도한다.
  • 파일은 복사 + remote-exec는 호스트에 연결 + 사용자는 우분투
  • 마지막으로 nginx까지 설치된 것을 알 수 있다.


✅ (예제2) output / attribute 활용

local-exec를 사용하여 {aws_instance.example.private_ip} 속성으로 인스턴스의 private IP를 파일로 출력한다.
이 예제를 활용하여 인프라 프로비저닝 후에 Ansible 호스트 파일에 IP 주소를 채우고 Ansible Playbook을 사용하여 대상 인스턴스들 내에 소프트웨어를 설치할 수 있다.

이 외에도 Terraform에는 다양한 프로비저너가 있는 것을 알 수 있는데 ansible도 잘 불러올 수 있는 듯 하다.
terraform이 조금 더 익숙해지고 프로비저너로 ansible playbook도 실행해 봐야겠다.

https://developer.hashicorp.com/terraform/language/resources/provisioners/syntax

0개의 댓글