테라폼으로 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 |