AWS

AWS 외부에서 EC2로 HTTPS 연결 설정 IaC

devfinger 2024. 10. 24. 21:18

아래는 AWS EC2 인스턴스를 HTTPS로 연결하기 위해 필요한 리소스들(ACM, Route 53, EC2 등)을 Terraform을 사용하여 Infrastructure as Code(IaC)로 설정하는 예제

이 예제에서는 다음을 포함합니다:

  1. ACM 인증서: 도메인에 대한 SSL 인증서 발급
  2. Route 53: 도메인에 대한 DNS 레코드 생성
  3. EC2 인스턴스: 웹 서버로 사용할 EC2 인스턴스 생성
  4. 보안 그룹: HTTPS 및 HTTP 트래픽을 허용하는 보안 그룹 설정

Terraform 구성 예제

provider "aws" {
  region = "us-east-1"  # 원하는 리전을 설정합니다.
}

# Route 53 Hosted Zone 생성
resource "aws_route53_zone" "main_zone" {
  name = "example.com"  # 사용할 도메인을 입력합니다.
}

# ACM 인증서 발급
resource "aws_acm_certificate" "cert" {
  domain_name               = aws_route53_zone.main_zone.name
  validation_method         = "DNS"

  subject_alternative_names = [
    "*.example.com"  # 서브도메인을 추가할 수 있습니다.
  ]

  tags = {
    Name = "ACM Certificate for example.com"
  }
}

# Route 53 인증서 검증을 위한 DNS 레코드 생성
resource "aws_route53_record" "cert_validation" {
  count   = length(aws_acm_certificate.cert.domain_validation_options)
  zone_id = aws_route53_zone.main_zone.zone_id
  name    = aws_acm_certificate.cert.domain_validation_options[count.index].resource_record_name
  type    = aws_acm_certificate.cert.domain_validation_options[count.index].resource_record_type
  ttl     = 60

  records = [aws_acm_certificate.cert.domain_validation_options[count.index].resource_record_value]
}

# ACM 인증서 검증 후 인증서 상태 업데이트
resource "aws_acm_certificate_validation" "cert_validation" {
  certificate_arn         = aws_acm_certificate.cert.arn
  validation_record_fqdns = aws_route53_record.cert_validation[*].fqdn
}

# EC2 인스턴스에 사용할 보안 그룹 생성
resource "aws_security_group" "web_sg" {
  vpc_id = aws_vpc.main_vpc.id  # 기존에 생성한 VPC ID를 입력합니다.

  ingress {
    from_port   = 80  # HTTP 포트
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 443  # HTTPS 포트
    to_port     = 443
    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"]
  }
}

# EC2 인스턴스 생성
resource "aws_instance" "web_instance" {
  ami                    = "ami-0c55b159cbfafe1f0"  # Amazon Linux 2 AMI
  instance_type          = "t2.micro"
  subnet_id              = aws_subnet.public_subnet_az1.id  # 기존에 생성한 서브넷 ID를 입력합니다.
  security_groups        = [aws_security_group.web_sg.name]

  tags = {
    Name = "WebServer"
  }

  # EC2 인스턴스가 시작될 때 웹 서버를 설정하기 위한 userdata
  user_data = <<-EOF
              #!/bin/bash
              yum update -y
              yum install -y httpd
              systemctl start httpd
              systemctl enable httpd
              echo "<h1>Hello, HTTPS from EC2!</h1>" > /var/www/html/index.html
              EOF
}

# Route 53 A 레코드 생성 (EC2 인스턴스 IP로 연결)
resource "aws_route53_record" "www" {
  zone_id = aws_route53_zone.main_zone.zone_id
  name     = "www"  # www 서브도메인
  type     = "A"

  alias {
    name                   = aws_instance.web_instance.public_ip
    zone_id                = aws_instance.web_instance.id
    evaluate_target_health = false
  }
}

 

설명

  • Route 53 Hosted Zone: 도메인을 관리하기 위한 호스팅 영역을 생성
  • ACM 인증서: HTTPS를 사용할 도메인에 대한 SSL 인증서를 생성합니다. DNS 검증을 통해 인증서를 발급
  • EC2 인스턴스: Apache 웹 서버가 설치된 EC2 인스턴스를 생성하고, 기본 HTML 페이지를 설정
  • 보안 그룹: HTTP와 HTTPS 트래픽을 허용하는 보안 그룹을 생성합
  • Route 53 A 레코드: EC2 인스턴스의 공인 IP로 접근할 수 있도록 A 레코드를 생성

이 코드를 실행하기 위해서는 AWS CLI와 Terraform이 설정되어 있어야 하며, 도메인(example.com)을 자신의 도메인으로 변경해야 합니다. ACM 인증서 발급과 Route 53 레코드 생성에는 시간이 소요될 수 있다.