
앞선 글에서는 AWS에 VPC, Public Subnet, Internet Gateway, Route Table을 구성해보았다. 이번 글에서는 해당 네트워크 인프라 위에 EC2 인스턴스를 Terraform을 통해 생성해보고, 웹 서버를 실행하는 과정을 다룬다. 이 실습을 통해 Terraform으로 인프라와 애플리케이션을 어떻게 함께 정의할 수 있는지 경험해볼 수 있다.

EC2 인스턴스에 SSH 접속을 하기 위해서는 키페어가 필요하다. 로컬에 .pem 또는 .pub 파일이 이미 있다면 해당 공개키를 Terraform에서 참조하도록 한다.
resource "aws_key_pair" "tf_keypair" {
key_name = "tf_keypair"
public_key = file("~/.ssh/youngyin-key.pub")
tags = {
Name = "tf_keypair"
}
}
주의할 점
public_key 경로는 절대경로 또는 상대경로로 정확히 설정해야 한다.보안 그룹은 EC2 인스턴스의 방화벽 역할을 하며, 인바운드/아웃바운드 트래픽을 제어한다.
resource "aws_security_group" "MyPublicSecugroup" {
name = "MyPublicSecugroup"
vpc_id = aws_vpc.MyVPC06.id
description = "Allow HTTP, HTTPS, and SSH"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "MyPublicSecugroup"
}
}
주의할 점
0.0.0.0/0에 개방하는 것은 보안상 매우 위험하다. 가급적이면 내 IP만 허용하거나, VPN을 사용하는 것이 좋다.이번에는 EC2 인스턴스를 하나 생성하고, Apache 웹 서버를 설치해 웹 페이지를 띄워보자.
resource "aws_instance" "MyWeb1" {
ami = data.aws_ami.latest_amazon_linux2.id
instance_type = "t3.micro"
key_name = aws_key_pair.tf_keypair.key_name
subnet_id = aws_subnet.MyPublicSubnet.id
vpc_security_group_ids = [aws_security_group.MyPublicSecugroup.id]
associate_public_ip_address = true
user_data = <<-EOF
#!/bin/bash
yum install -y httpd
systemctl enable httpd
systemctl start httpd
echo "<h1>Hello from MyWeb1</h1>" > /var/www/html/index.html
EOF
tags = {
Name = "MyWeb1"
}
}
주의할 점
ami는 리전(ap-northeast-2)에 따라 ID가 다를 수 있으므로 data "aws_ami"로 가장 최신 Amazon Linux 2를 받아오는 방식을 추천한다.associate_public_ip_address를 true로 설정하지 않으면 퍼블릭 서브넷에 있더라도 외부 접속이 되지 않는다.user_data는 인스턴스 최초 부팅 시 실행되는 스크립트로, 웹 서버 설정이나 초기 구성에 매우 유용하다.terraform init
terraform plan
terraform apply
생성이 완료되면 AWS 콘솔 또는 CLI를 통해 퍼블릭 IP를 확인한 뒤, 웹 브라우저에서 접속해보자.
curl http://<Public IP>
화면에 Hello from MyWeb1 메시지가 나오면 정상적으로 동작한 것이다.
이번 글에서는 Terraform으로 EC2 인스턴스를 생성하고, 사용자 데이터를 통해 웹 서버를 띄우는 과정을 진행했다. 네트워크 설정과 연계해 인스턴스까지 한 번에 구성하는 흐름을 이해하는 것이 중요하다. 다음 글에서는 동일한 방식으로 프라이빗 서브넷을 구성하고, NAT Gateway를 통해 외부 통신을 허용하는 실습을 다룰 예정이다.