Terraform으로 EC2 인스턴스 생성하기

y001·2025년 3월 30일
0
post-thumbnail

시작하며

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


1. 키페어 생성

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 경로는 절대경로 또는 상대경로로 정확히 설정해야 한다.
  • 키페어 이름은 중복되면 에러가 발생하므로 기존에 동일한 이름의 키페어가 있는지 확인 필요하다.

2. 보안 그룹 설정

보안 그룹은 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"
  }
}

주의할 점

  • 실습 목적이 아니라면 SSH(22번 포트)를 0.0.0.0/0에 개방하는 것은 보안상 매우 위험하다. 가급적이면 내 IP만 허용하거나, VPN을 사용하는 것이 좋다.

3. EC2 인스턴스 생성

이번에는 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는 인스턴스 최초 부팅 시 실행되는 스크립트로, 웹 서버 설정이나 초기 구성에 매우 유용하다.

4. 구성 확인

terraform init
terraform plan
terraform apply

생성이 완료되면 AWS 콘솔 또는 CLI를 통해 퍼블릭 IP를 확인한 뒤, 웹 브라우저에서 접속해보자.

curl http://<Public IP>

화면에 Hello from MyWeb1 메시지가 나오면 정상적으로 동작한 것이다.


5. 마무리

이번 글에서는 Terraform으로 EC2 인스턴스를 생성하고, 사용자 데이터를 통해 웹 서버를 띄우는 과정을 진행했다. 네트워크 설정과 연계해 인스턴스까지 한 번에 구성하는 흐름을 이해하는 것이 중요하다. 다음 글에서는 동일한 방식으로 프라이빗 서브넷을 구성하고, NAT Gateway를 통해 외부 통신을 허용하는 실습을 다룰 예정이다.

0개의 댓글