본문 바로가기

♻ Terraform(테라폼)/Terraform provisioner

Terraform Provisioner 를 활용한 ShellScript 실행

# Terraform Provisioner 를 활용한 ShellScript 실행하기

Terraform을 활용하여 인프라를 만들다보면 여러가지 패키지를 설치할 필요가 있다.

예를들어 ec2 인스턴스를 생성하면서 아파치 웹서버를 동시에 설치하고, 해당 index.html 파일에 특정 문자를 넣고 웹 서비스를 실행할때, 아래와 같은 스크립트가 필요할 것이다.

#!/bin/bash
sudo yum install -y httpd
touch /var/www/html/index.html
sudo su -
echo "zzanggu의 DB서버 테스트 중..." > /var/www/html/index.html
exit
sudo systemctl start httpd
sudo systemctl enable httpd

- 위의 스크립트가 정상적으로 설치가 되면 아래와 같이 웹페이지 화면에서 확인이 가능하다.

- 그렇다면 Terraform 설치 중 어떻게 해당 서버에 커넥션을 하여 설치를 진행하는지 코드를 통해 알아본다.

1. 구조

- 파일의 구조는 아래와 같다. main.tf 파일이 리소스를 코드로 정의한 파일이고, script.sh는 쉘스크립트의 내용이 담겨 있다. 그리고 webserver.pem 파일은 인증 파일로써 ec2에 접근할때 사용 된다. (script.sh 파일의 내용은 위의 작성한 shellscript의 내용과 같다.)

2. Provisioner와 관련된 내용이 설명된 자료

일단 Provisioner는 3가지 타입을 제공한다.

1. local-exec Provisioner: 로컬에 있는 shellscript를 실행

2. remote-exec Provisioner: local-exec와 반대로 로컬 영역이 아닌 생성한 리소스에서 실행한다.
(inline으로 실행하거나 test.sh와 같은 쉘 스크립트를 생성하여 실행한다.)
(스크립트 파일을 실행하는 경우 해당 스크립트 파일을 원격 서버 경로에 복사 후 실행한다.)

3. null_resource Provisioner: 특정 리소스에 연결하지 않고 프로비저너를 실행할때 사용한다. 실제 리소스에는 연결되지 않는다.

3. 코드를 활용한 실제 Provisioner 사례 살펴보기

# ############################## EC2 인스턴스 생성 (DB-Public) ##############################
resource "aws_instance" "db" {
  ami                    = "ami-0eddbd81024d3fbdd"
  instance_type          = "t2.micro"
  key_name               = "webserver"
  subnet_id              = aws_subnet.terraform_vpc_test-public_subnet.id
  vpc_security_group_ids = ["${aws_security_group.dbsg.id}"]

connection {
  type ="ssh"
  host =self.public_ip
  user="ec2-user"
  private_key = file("/webserver.pem") # pem 파일의 경로::root 해당 main.tf 파일의 경로이다.
  }

provisioner "local-exec" {
  command = "echo ${self.private_ip} >> test.txt" # local에 파일 저장::public_ip를 조회하여 test.txt 파일에 저장한다.
  }

provisioner "file" {
  source      = "script.sh" # 로컬 파일
  destination = "/tmp/script.sh" # 서버에 복사될 장소
  }
 
provisioner "remote-exec" {
  inline = [
    "chmod +x /tmp/script.sh",
    "/tmp/script.sh args",
    ]
  }

  tags = {
    Name = "DB"
  }
}
...
...
...

4. 주의할점

Provisioner는 리소스가 생성될 때 1회만 실행이 된다. 예를들어 test.sh라는 shellscript 파일이 존재하고 권한 문제로 인해 전체의 shellscript 내용이 실행된것이 아닌 일부만 실행되고 해당 리소스가 생성됐다 하더라도, terraform에서는 정상적으로 생성되었다고 메세지가 떨어질 것이다. 여기서 기억해야 할 것이 Provisioner는 리소스가 생성될 당시 1회만 생성이 되고 추후에 Provisioner내용 즉 shellscript의 내용이 변경됐다 하더라도 재 실행 되지 않는다. 마치 ec2의 userdata와 같다고 보면 된다. 만약 리소스가 Provisioner내용과 함께 생성된 후에 shellscript 내용을 변경하고자 한다면 해당 서버의 복사된 shellscript 파일을 직접 수정하여 실행 & 적용해야 한다. (위의 코드를 예시로 보면 Destination 저장소인 /tmp/script.sh 파일을 수정해야 한다.)

'♻ Terraform(테라폼) > Terraform provisioner' 카테고리의 다른 글

Terrafrom Provisioner 란?  (1) 2022.12.14