terraform

Terraform을 활용한 AWS 환경 구축 하기 - 3(EC2 인스턴스 생성 및 설정, RDS(Mysql)생성 및 설정, wordpress 연결)

kkuniyo 2025. 3. 15. 13:08
반응형

이 글은 Terraform을 활용한 AWS 환경 구축 가이드 3탄

 11_inst.tf

EC2 인스턴스 설정 및 고정 IP 연결

data "aws_ami" "main_ami" {
  most_recent = true  # 가장 최신의 AMI를 반환

  filter {
    name   = "name"
    # "amzn2-ami-kernel-5.10*-hvm-*-x86_64-gp2" 패턴에 맞는 이름을 가진 AMI들을 검색
    values = ["amzn2-ami-kernel-5.10*-hvm-*-x86_64-gp2"]
  }

  filter {
    name   = "virtualization-type"  
    # 가상화 유형 필터
    values = ["hvm"]                
    # 하드웨어 가상화 방식(HVM) 사용
  }

  owners = ["amazon"] 
  # 아마존 공식 소유의 AMI만 검색
}

# - VPC 내에서 사용할 수 있는 고정 퍼블릭 IP 주소를 할당
resource "aws_eip" "main_eip1" {
  domain = "vpc"  
}

# - 앞서 생성한 EIP를 특정 EC2 인스턴스에 연결
resource "aws_eip_association" "main_eassoc" {
  instance_id   = aws_instance.main_web1.id 
  allocation_id = aws_eip.main_eip1.id        
}

# AWS EC2 인스턴스 생성
resource "aws_instance" "main_web1" {
  ami                    = data.aws_ami.main_ami.id          
  instance_type          = "t2.micro"                         
  key_name               = "main-key"                         
  vpc_security_group_ids = [aws_security_group.main-sg.id]    
  availability_zone      = "ap-northeast-2a"                  
  subnet_id              = aws_subnet.main-pub-sub.id         
  private_ip             = "10.0.0.11"                       
  user_data              = file("userdata.sh")                
}

# 출력 변수: 할당된 Elastic IP의 퍼블릭 IP 주소를 출력
output "instance_ip" {
  value = aws_eip.main_eip1.public_ip  
}
  • 최신 Amazon Linux AMI를 조회하여 EC2 인스턴스에 할당한다
  • Elastic IP를 생성하고 EC2 인스턴스와 연결하여 고정 IP를 부여한다
  • 사용자 데이터를 통해 인스턴스 초기 설정을 자동화할 수 있다

📌 12_rds.tf

RDS(MySQL) 데이터베이스 설정

# AWS RDS 인스턴스 생성에 필요한 주문 가능한 DB 인스턴스 정보를 조회
data "aws_rds_orderable_db_instance" "main_rds" {
  engine         = "mysql"                   
  # 사용할 데이터베이스 엔진: MySQL
  engine_version = "8.0.40"                 
  # MySQL 엔진 버전: 8.0.40
  license_model  = "general-public-license"
  # 라이선스 모델: 일반 공개 라이선스
  storage_type   = "gp2"                
  # 스토리지 타입: gp2 (일반 목적 SSD)
  instance_class = "db.t3.micro"         
  # 인스턴스 클래스: db.t3.micro (소규모 인스턴스)
}

# AWS DB 서브넷 그룹 리소스 정의
resource "aws_db_subnet_group" "main-db-subnet" {
  name       = "main-db-subnet" 
  subnet_ids = [aws_subnet.main-pria.id, aws_subnet.main-pric.id, aws_subnet.main-puba.id, aws_subnet.main-pubc.id, aws_subnet.main-dba.id, aws_subnet.main-dbc.id] 
  # RDS 인스턴스가 위치할 서브넷들의 ID
  tags = {
    Name = "main-db-subnet" 
  }
}

# AWS RDS 인스턴스 리소스 생성
resource "aws_db_instance" "main-db" {
  identifier                   = "main-db"                        
  db_name                      = "wordpress"                    
  allocated_storage            = 20                          
  storage_type                 = data.aws_rds_orderable_db_instance.main_rds.storage_type  
  engine                       = data.aws_rds_orderable_db_instance.main_rds.engine       
  engine_version               = data.aws_rds_orderable_db_instance.main_rds.engine_version
  license_model                = data.aws_rds_orderable_db_instance.main_rds.license_model 
  instance_class               = data.aws_rds_orderable_db_instance.main_rds.instance_class 
  username                     = "root"                   
  password                     = "It12345!"                 
  parameter_group_name         = "default.mysql8.0"           
  availability_zone            = "ap-northeast-2a"            
  publicly_accessible          = true                         
  # 퍼블릭 접근 허용 여부 (외부에서 접근 가능)
  skip_final_snapshot          = true                         
  # 인스턴스 삭제 시 최종 스냅샷 생성을 건너뜀
  vpc_security_group_ids       = [aws_security_group.main-sg.id] 
  # 연결할 VPC 보안 그룹 ID 리스트
  db_subnet_group_name         = aws_db_subnet_group.main-db-subnet.name 
  performance_insights_enabled = false                       
  # 성능 인사이트 기능 비활성화
  storage_encrypted            = false                      
  # 스토리지 암호화 사용 여부 (암호화 없음)
  auto_minor_version_upgrade   = false                         
  # 마이너 버전 자동 업그레이드 기능 비활성화
  monitoring_interval          = 0                              
  # 모니터링 간격 (0: 모니터링 비활성화)
  backup_retention_period      = 0                             
  # 백업 보존 기간 (0: 백업 비활성화)
  tags = {
    Name = "main-db" 
  }
}
  • MySQL 기반 RDS 데이터베이스를 구성하며, 데이터베이스는 프라이빗과 퍼블릭 서브넷 환경에서 구성된 서브넷 그룹에 속한다
  • 데이터베이스 엔진 버전, 인스턴스 클래스, 스토리지 타입 등의 정보를 데이터 소스에서 가져와 구성

**userdata.sh**

#! /bin/bash
# Amazon Linux Extras를 사용하여 PHP 8.0 활성화
amazon-linux-extras enable php8.0

yum install -y wget tar httpd php php-cli php-pdo php-fpm php-mysqlnd

wget https://ko.wordpress.org/wordpress-6.7.2-ko_KR.tar.gz

tar xvfz wordpress-6.7.2-ko_KR.tar.gz -C /root/

cp -ar /root/wordpress/* /var/www/html/

sed -i "s/DirectoryIndex index.html/DirectoryIndex index.php/g" /etc/httpd/conf/httpd.conf

cp /var/www/html/{wp-config-sample.php,wp-config.php}

sed -i "s/database_name_here/wordpress/g" /var/www/html/wp-config.php

sed -i "s/username_here/root/g" /var/www/html/wp-config.php

sed -i "s/password_here/It12345\!/g" /var/www/html/wp-config.php

sed -i "s/localhost/자신의 RDS에서 엔드포인트값/g" /var/www/html/wp-config.php

# 간단한 헬스 체크 페이지 생성 (health.html)
cat > /var/www/html/health.html <<eof
<html><body><h1>health-testpage</h1></body></html>
eof

systemctl enable --now httpd

 

여기서 포인트는 자신의 데이터베이스 RDS들어가서 엔드포인트 확인해서 잘 대입

wordpress를 아예 서버에 올려두고싶다면 1편부터 쭉 따라하기


Terraform을 통해 AWS 클라우드 환경에서 EC2 및 RDS 인프라 구성을 자동화하여 효율적으로 관리할 수 있다

 

반응형