단일 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 |