본문 바로가기
OOP/<오브젝트>, 조영호

[콘솔과 테라폼 구현] 사용자 > 100 : EC2, DB 분리

by 민휘 2023. 10. 22.

단일 EC2를 사용하는 아키텍처의 문제점

단일 EC2를 사용하는 아키텍처의 문제점

  • SPOF, EC2에 장애 발생 시 비즈니스 연속성에 바로 영향을 미침
  • 페일오버 없음
  • 이중화 없음

→ 한 바구니에 계란을 모두 담지 말자!

 

인스턴스 역할 분리하기

단일 EC2가 하나의 기능을 하도록 인스턴스 역할을 나눈다.

  • 웹 서버용 EC2 인스턴스
  • DB용 EC2 인스턴스 혹은 AWS DB 관리 서비스 (운영 부담 덜함)

 

구현 사항

  • EC2에 웹서버와 PHP를 설치하고 워드 프레스를 실행한다.
  • AWS RDS에 MySQL 엔진을 실행해 워드 프레스 애플리케이션의 백엔드로 사용한다.

 

콘솔 구현

자료

 

1. EC2, SG 생성

  • 이름 : step2-ec2-console
  • AMI : AMI 2 (HVM)
  • 인스턴스 유형 : t2.micro
  • 네트워크 설정 : 보안 그룹 생성, SSH 및 인터넷 HTTP 트래픽 허용
  • 사용자 데이터 (user data) : 아래 참고
  • 나머지는 디폴트 설정
#!/bin/bash
# Use this for your user data (script from top to bottom)
# install httpd (Linux 2 version)
sudo yum install httpd -y
sudo systemctl start httpd
sudo systemctl enable httpd
sudo wget https://wordpress.org/wordpress-5.7.2.tar.gz
sudo tar -xzf wordpress-5.7.2.tar.gz
sudo cp -r wordpress/* /var/www/html

sudo yum install -y amazon-linux-extras
sudo amazon-linux-extras enable php7.2
sudo yum clean metadata -y
sudo yum install php-cli php-pdo php-fpm php-json php-mysqlnd -y
sudo systemctl restart httpd

 

2. EIP 생성 및 할당

 

3. RDS 생성

  • 생성 방식 : 표준
  • 엔진 : MySQL
  • 템플릿 : 프리 티어
  • 자격 증명 : 마스터 사용자 이름, 마스터 암호
  • 퍼블릭 액세스 가능
  • DB 서브넷 그룹 : 자동 설정
  • DB 인증 : 암호 인증
  • 스토리지 : 범용 SSD, 20 GiB

보안그룹 인바운드에 내 IP와 EC2 SG 추가

 

4. 결과 확인

 

테라폼 구현

 

자료

 

1. AWS 키 페어 생성

EC2 SSH 접속 시 사용

 

2. 테라폼 파일 작성

 

provider

provider "aws" {
}

 

ec2 & eip

resource "aws_instance" "wordpressfrontend" {
  ami           = "ami-0f0cc846201190547"
  instance_type = "t2.micro"
  key_name = "ec2-ssh"
  security_groups = [ "allow ssh & http" ]
  tags = {
    app = "wordpress"
    role = "frontend"
  }
}

resource "aws_eip" "wpip" {
  instance = aws_instance.wordpressfrontend.id
  vpc      = true
  tags = {
    app = "wordpress"
  }
}

 

sg

resource "aws_security_group" "FESG" {
  name = "allow ssh & http"

  ingress{
    cidr_blocks = [ "0.0.0.0/0" ]
    description = "allow ssh"
    from_port = 22
    to_port = 22
    protocol = "tcp"  
  }

  ingress {
    cidr_blocks = [ "0.0.0.0/0" ]
    description = "allow http"
    from_port = 0
    to_port = 80
    protocol = "tcp"
  } 

  egress{
    cidr_blocks = [ "0.0.0.0/0" ]
    description = "permit all"
    from_port = 0
    to_port = 0
    protocol = "-1"
  } 
  
}

 

rds

variable "dbpassword" {
  type = string
  default = "terraform"
}

resource "aws_db_instance" "wordpressbackend" {

  instance_class = "db.t3.micro"
  engine = "mysql"
  publicly_accessible = false
  allocated_storage = 20
  db_name = "wordpress"
  username = "admin"
  password = var.dbpassword
  skip_final_snapshot  = true
  tags = {
    app = "mysql"
  }
  
}

 

null resource

resource "null_resource" "configweb12" {
  connection {
    type     = "ssh"
    user     = "ec2-user"
    private_key = file("/Users/minhwi/.ssh/ec2-ssh.pem")
    host     = aws_eip.wpip.public_ip
  }
  provisioner "remote-exec" {
    inline = [
      "sudo yum install httpd -y",
      "sudo systemctl start httpd",
      "sudo systemctl enable httpd",
      "sudo wget https://wordpress.org/wordpress-5.7.2.tar.gz",
      "sudo tar -xzf wordpress-5.7.2.tar.gz",
      "sudo cp -r wordpress/* /var/www/html/"
    ]
  }
  
}

resource "null_resource" "configphp" {

  connection {
    type     = "ssh"
    user     = "ec2-user"
    private_key = file("/Users/minhwi/.ssh/ec2-ssh.pem")
    host     = aws_eip.wpip.public_ip

    }

  provisioner "remote-exec" {
    inline = [
      "sudo yum install -y amazon-linux-extras",
      "sudo amazon-linux-extras enable php7.2",
      "sudo yum clean metadata -y",
      "sudo yum install php-cli php-pdo php-fpm php-json php-mysqlnd -y",
      "sudo systemctl restart httpd"
    ]
  }
  
}

 

output

output "WebServerIP" {
    value = aws_eip.wpip.public_ip
    description = "Web Server IP Address"
}

output "DatabaseName" {
    value = aws_db_instance.wordpressbackend.db_name
    description = "The Database Name!"
}

output "DatabaseUserName" {
    value = aws_db_instance.wordpressbackend.username
    description = "The Database Name!"
}

output "DBConnectionString" {
    value = aws_db_instance.wordpressbackend.endpoint
    description = "The Database connection String!"
}

 

 

3. 결과 확인

인스턴스

 

보안 그룹

 

RDS

 

탄력적 IP로 접속

'OOP > <오브젝트>, 조영호' 카테고리의 다른 글

5장 책임 할당 GRASP 패턴  (0) 2024.01.17
4장 설계 품질과 트레이드오프 (캡슐화)  (0) 2024.01.17
3장 협력, 책임, 역할  (0) 2024.01.17
2장 객체지향 프로그래밍  (0) 2023.04.29
1장 객체, 설계  (0) 2023.02.20