Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- AWS
- 네트워크
- AWS 침해사고 사례 분석
- AWS 아키텍처 분석
- 운영체제
- reversing.kr
- AWS 보안 사고 사례 모음
- AWS 사고 사례 분석
- 프로그래머스
- AWS 보안 아키텍처 분석
- 침입 차단 시스템(IPS)
- dreamhack
- AWS Active Directory
- AWS 침해 사고 사례 분석
- operating system
- AWS 3 Tier Architecture
- TryHackMe
- Amazon S3
- 드림핵
- C
- AWS 인프라 분석
- programmers
- terraform
- AWS 인프라 아키텍처
- network
- 리버싱
- reversing
- python
- AWS IAM Role
- IAM Federation
Archives
- Today
- Total
lhywk 님의 블로그
AWS 3-Tier 및 Data Pipeline 구축 With Terraform (5) 본문
AWS 3 Tier Architecture 구축해보기 2-5
https://github.com/estrellaSia/AWS_3Tier_Infra_Data_Pipeline/tree/main참고 깃허브 1.web-user-data.sh 스크립트 작성#!/bin/bash# Amazon Linux 2 userdata script for setting up Nginx with ProxyPass# Update packagessudo yum update -y# Install Nginxsu
kujung.tistory.com
1. web-user-data.sh 스크립트
#!/bin/bash
# Amazon Linux 2 userdata script for setting up Nginx with ProxyPass
# 1. 시스템 업데이트 및 필수 패키지 설치
sudo yum update -y
sudo yum install -y nginx amazon-ssm-agent
# 2. 서비스 시작 및 자동 실행 설정
sudo systemctl start nginx amazon-ssm-agent
sudo systemctl enable nginx amazon-ssm-agent
# 3. Nginx ProxyPass 설정 (Web -> WAS 연결용)
# 도메인으로 들어오는 트래픽을 내부 ALB로 전달
cat << EOF > /etc/nginx/conf.d/proxy.conf
server {
listen 80;
server_name ddongteacher.xyz;
location /app {
proxy_pass http://${alb_dns}/;
}
error_log /var/log/nginx/mark_error.log;
access_log /var/log/nginx/mark_access.log combined;
}
EOF
# 4. EC2 메타데이터 조회 (IMDSv2 토큰 사용)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s)
RZAZ=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" \
-s http://169.254.169.254/latest/meta-data/placement/availability-zone)
IID=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" \
-s http://169.254.169.254/latest/meta-data/instance-id)
LIP=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" \
-s http://169.254.169.254/latest/meta-data/local-ipv4)
# 5. 메인 인덱스 페이지(HTML) 생성
cat << EOF > /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Web Server</title>
<style>
body { font-family: Arial, sans-serif; font-size: 50px; margin: 0; padding: 20px; }
h1 { font-weight: bold; font-size: 50px; margin: 0 0 20px 0; }
.info { font-weight: normal; font-size: 40px; line-height: 1.5; }
.info br { margin-bottom: 10px; }
</style>
</head>
<body>
<h1>Web Server</h1>
<div class="info">
Region/AZ: $RZAZ<br>
Instance ID: $IID<br>
Private IP: $LIP<br>
</div>
</body>
</html>
EOF
# 6. 설정 적용을 위한 Nginx 재시작
sudo systemctl restart nginx
- Nginx(웹 서버)와 SSM Agent(원격 관리 도구)를 설치하고 가동
- /app 경로로 들어오는 요청을 내부 로드밸런서(alb_dns)로 토스. 3-Tier 아키텍처에서 Web 서버가 WAS로 요청을 넘길 때 쓰는 핵심 설정
- 현재 이 서버가 어떤 AZ에 있는지, 아이디(ID)와 내부 IP는 무엇인지 AWS 시스템에서 긁어옴
- 긁어온 정보를 HTML 페이지에 담아 화면에 뿌림. 로드밸런싱이 잘 되는지(매번 다른 IP가 뜨는지) 확인할 때 유용
2. app-user-data.sh 스크립트
#!/bin/bash
# Amazon Linux 2 userdata script for setting up Nginx, PHP, and RDS connection
# 1. 시스템 업데이트 및 필수 패키지 설치
sudo yum update -y
sudo yum install -y nginx php php-mysqlnd amazon-ssm-agent mariadb105
# 2. 서비스 시작 및 자동 실행 설정
sudo systemctl start nginx amazon-ssm-agent
sudo systemctl enable nginx amazon-ssm-agent
# 3. 데이터베이스(RDS) 초기화 및 데이터 삽입
# 테라폼 변수(${host}, ${username} 등)를 받아와서 DB에 테이블을 만들고 데이터를 넣습니다.
mysql -h "${host}" -P 3306 -u "${username}" -p"${password}" "${db}" -e "
CREATE TABLE IF NOT EXISTS info (
name VARCHAR(50) PRIMARY KEY,
email VARCHAR(50),
age INT
);"
mysql -h "${host}" -P 3306 -u "${username}" -p"${password}" "${db}" -e "
INSERT INTO info (name, email, age)
VALUES ('mk', 'mk@google.com', 23)
ON DUPLICATE KEY UPDATE email=VALUES(email), age=VALUES(age);"
# 4. PHP 환경 확인 페이지 생성 (test.php)
cat << EOF > /usr/share/nginx/html/test.php
<?php
phpinfo();
?>
EOF
# 5. 실제 DB 연동 페이지 생성 (db.php)
cat << EOF > /usr/share/nginx/html/db.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>DB Page</title>
</head>
<body>
<h1>DB Data List</h1>
<?php
// RDS 연결 설정
\$conn = new mysqli("${host}", "${username}", "${password}", "${db}", 3306);
if (\$conn->connect_error) {
die("Connection failed: " . \$conn->connect_error);
}
\$sql = "SELECT name, email, age FROM info";
\$result = \$conn->query(\$sql);
if (\$result->num_rows > 0) {
while(\$row = \$result->fetch_assoc()) {
echo "Name: " . \$row["name"] . " | Email: " . \$row["email"] . " | Age: " . \$row["age"] . "<br>";
}
} else {
echo "0 results";
}
\$conn->close();
?>
</body>
</html>
EOF
# 6. 설정 적용을 위한 Nginx 재시작
sudo systemctl restart nginx
- 웹 서버(Nginx)와 동적 페이지 처리를 위한 PHP, 그리고 DB 접속을 위한 MySQL 클라이언트를 설치
- 서버가 뜨자마자 RDS에 접속하여 info라는 테이블을 만들고 샘플 데이터('mk')를 집어넣는다. (DB 초기화 작업)
- 서비스 확인 (test.php): PHP가 정상적으로 설치되었는지, 모듈들은 잘 로드되었는지 브라우저에서 확인할 수 있게 한다.
- 비즈니스 로직 (db.php): PHP 코드가 실제로 RDS에 쿼리를 날려 데이터를 가져오고 화면에 뿌려줌. 3-Tier의 핵심인 WAS-DB 연동을 시각적으로 보여주는 페이지

현재까지 모든 과정을 Terraform을 적용하여 인프라를 구축했습니다.
이제 AWS에 적용해보겠습니다.
main.tf 설정 추가
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "6.35.1" # 로컬에 설치한 최신 버전 맞추기
}
}
}
provider "aws" {
region = "ap-northeast-2"
}
Terraform init

Terraform plan

Terraform apply
구축 결과 확인하기
1. VPC




2. 인터넷 게이트웨이

3. NAT Gateway

4. 서브넷, 라우팅 테이블


5. ALB, ALB SG


6. 시작 템플릿

7. Target Group

8. Auto Scaling Group, Auto Scaling Group SG


9. DB SG, DB Subnet Group


10. RDS 파라미터 그룹, RDS


11. Output

WEB, WAS, DB 접속 확인
- WEB 확인 페이지
- Web-ALB-DNS-주소
- WAS 확인 페이지 (PHP 정보)
- http://[Web-ALB-DNS-주소]/app
- DB 연동 페이지 (RDS 데이터 조회)
- http://[Web-ALB-DNS-주소]/app/db.php




실습이 끝났다면 Terraform destroy까지!
'AWS' 카테고리의 다른 글
| Drizly (2020) 사고 사례 분석 (0) | 2026.03.16 |
|---|---|
| AWS 3-Tier 및 Data Pipeline 구축 With Terraform (6) (0) | 2026.03.15 |
| AWS 3-Tier 및 Data Pipeline 구축 With Terraform (4) (0) | 2026.03.14 |
| AWS 3-Tier 및 Data Pipeline 구축 With Terraform (3) (1) | 2026.03.13 |
| AWS 3-Tier 및 Data Pipeline 구축 With Terraform (2) (0) | 2026.03.13 |