본문 바로가기

IaC

테라폼 스터디 - 3주차 추가내용

테라폼으로 instance 띄우고 그 instance 내부에서 nginx 띄우는 방법?

 

방법 1. user_data 이용

 

인스턴스를 시작할 때 제공할 사용자 데이터. 이 인수를 통해 gzip 압축 데이터를 전달하지 마시고, 대신 user_data_base64를 참조하세요. 이 필드를 업데이트하면 기본적으로 EC2 인스턴스의 중지/시작이 트리거됩니다. user_data_replace_on_change가 설정되어 있으면 이 필드를 업데이트하면 EC2 인스턴스의 삭제 및 재생성이 트리거됩니다.

 

 

특징

  • 인스턴스가 처음 실행될 때 한번만 실행됨
  • 이미 실행된 인스턴스에 대해 변경사항 반영하기 어려움 / 인스턴스 재시작 또는 재생성이 필요
resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  key_name      = "your-ssh-key"
  security_groups = ["default"]

  user_data = <<-EOF
              #!/bin/bash
              # Docker 설치
              sudo yum update -y
              sudo amazon-linux-extras install docker -y
              sudo service docker start
              sudo usermod -a -G docker ec2-user
              # Nginx 컨테이너 실행
              sudo docker run -d -p 80:80 nginx
            EOF

  tags = {
    Name = "nginx-instance"
  }

  # 보안 그룹을 추가하여 HTTP(80) 포트를 열기
  security_groups = ["default"]
}

output "instance_ip" {
  value = aws_instance.example.public_ip
}

 

 


 

 

방법 2. ec2 instance의 provisioner 이용

 

Provisioner는 마지막 수단입니다.

 

Terraform은 Terraform의 선언적 모델에서 직접적으로 표현할 수 없는 특정 동작이 항상 있다는 것을 알고 실용성의 척도로 프로비저너 개념을 포함시켰습니다.
그러나 Terraform 사용에 상당한 복잡성과 불확실성을 더합니다. 첫째, Terraform은 원칙적으로 모든 조치를 취할 수 있기 때문에 프로비저너의 작업을 계획의 일부로 모델링할 수 없습니다. 둘째, 프로비저너를 성공적으로 사용하려면 Terraform 사용에 일반적으로 필요한 것보다 훨씬 더 많은 세부 사항을 조정해야 합니다. 서버에 대한 직접 네트워크 액세스, 로그인을 위한 Terraform 자격 증명 발급, 모든 필수 외부 소프트웨어가 설치되어 있는지 확인하는 것 등입니다.
다른 기술을 사용하여 문제를 먼저 해결해 보고, 다른 옵션이 없는 경우에만 프로비저너를 사용하는 것이 좋습니다.

 

 

특징

  • 실행 로그가 생성되므로, 트러블슈팅에 이점
  • 기본적으로 리소스 생성 시점에 실행되지만, 옵션을 통해 리소스 삭제 시점에도 실행이 가능함
  • terraform에서 다른 방법을 먼저 수행해보고 마지막 수단으로 사용하라고 권장

 

 

provisioner 주요 유형

  • local-exec : 로컬 머신에서 명령 실행(테라폼 수행 머신)
  • remote-exec : 원격 머신에서 명령 실행
  • file : 로컬에서 원격으로 파일 전송
resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"  # Amazon Linux 2 AMI
  instance_type = "t2.micro"
  key_name      = "your-ssh-key"
  security_groups = ["default"]

  # EC2 인스턴스 생성 후 명령 실행
  provisioner "remote-exec" {
    inline = [
      "sudo yum update -y",
      "sudo amazon-linux-extras install docker -y",
      "sudo service docker start",
      "sudo usermod -a -G docker ec2-user",
      "sudo docker run -d -p 80:80 nginx"
    ]

    connection {
      type        = "ssh"
      user        = "ec2-user"
      private_key = file("~/.ssh/your-ssh-key.pem")
      host        = aws_instance.example.public_ip
    }
  }

  tags = {
    Name = "nginx-instance"
  }
}

output "instance_ip" {
  value = aws_instance.example.public_ip
}

 

'IaC' 카테고리의 다른 글

스터디 5주차 - 모듈 추가 내용  (0) 2025.01.05
테라폼 스터디 5주차 - 모듈  (3) 2025.01.05
테라폼 스터디 - 4주차  (1) 2024.12.29
테라폼 스터디 3주차  (1) 2024.12.22
테라폼 스터디 - 2주차  (1) 2024.12.14