서비스 위주
인터넷 게이트웨이로의 라우팅이 정의되어 있는 라우팅 테이블과 연결된 서브넷
서브넷에 배치되는 인스턴스로 HTTP(80), SSH(22)만 접근을 허용하도록 설정
#!/bin/sh
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
yum -y install httpd php-mbstring
# Start the web server
chkconfig httpd on
systemctl start httpd
# Install the web pages for our lab
if [ ! -f /var/www/html/immersion-day-app-php7.tar.gz ]; then
cd /var/www/html
# wget https://aws-joozero.s3.ap-northeast-2.amazonaws.com/immersion-day-app-php7.tar.gz
wget https://github.com/myanjini/LAB-AWS/releases/download/2024-03-31/php7-app.tar.gz
tar xvfz php7-app.tar.gz
fi
#
cat <<EOF > /var/www/html/get-index-meta-data.php
<?php
\$hostname = gethostname();
\$results = explode(".", \$hostname);
echo "<table style='width:100%'>";
echo "<tr><th style='width:30%'>Meta-Data</th><th style='width:70%'>Value</th></tr>";
echo "<tr><td>Private IP DNS Name</td><td>".\$hostname."</td></tr>";
echo "<tr><td>Private IP</td><td>".getHostByName(\$hostname)."</td></tr>";
echo "<tr><td>Region</td><td>".\$results[1]."</td></tr>";
echo "</table>";
?>
EOF
# Install the AWS SDK for PHP
if [ ! -f /var/www/html/aws.zip ]; then
cd /var/www/html
mkdir vendor
cd vendor
wget https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip
unzip aws.zip
fi
# Update existing packages
yum -y update
https://www.bitvise.com/ssh-client-download
[ec2-user@ip-10-0-10-168 ~]$ cd /var/www/html
[ec2-user@ip-10-0-10-168 html]$ ls
db-update.php load.php rds.conf.php rds-write-config.php
get-cpu-load.php menu.php rds-initialize.php sql
get-index-meta-data.php php7-app.tar.gz rds.php style.css
index.php put-cpu-load.php rds-read-data.php vendor
사용자 데이터에 입력한 쉘 스크립트가 실행되지 않은 경우
[ec2-user@ip-10-0-10-168 html]$ sudo wget
https://github.com/myanjini/LAB-AWS/releases/download/2024-03-31/php7-app.tar.gz
[ec2-user@ip-10-0-10-168 html]$ sudo tar xvfz php7-app.tar.gz
[ec2-user@ip-10-0-10-168 html]$ sudo cat <<EOF > /var/www/html/get-index-meta-data.php
<?php
\$hostname = gethostname();
\$results = explode(".", \$hostname);
echo "<table style='width:100%'>";
echo "<tr><th style='width:30%'>Meta-Data</th><th style='width:70%'>Value</th></tr>";
echo "<tr><td>Private IP DNS Name</td><td>".\$hostname."</td></tr>";
echo "<tr><td>Private IP</td><td>".getHostByName(\$hostname)."</td></tr>";
echo "<tr><td>Region</td><td>".\$results[1]."</td></tr>";
echo "</table>";
?>
EOF
⑴ VPC에서 리소스 맵에서 VPC → 서브넷 → 라우팅 테이블 → Internet Gateway로의 연결이 있는지 확인
⑵ 보안 그룹
인바운드 규칙
IPv4 프로토콜을 사용하는 모든 소스(0.0.0.0/0)로부터 80번 포트와 22번 포트로 접속을 허용
아웃바운드 규칙
IPv4 프로토콜을 사용하는 모든 트래픽을 Anywhere(0.0.0.0/0)으로 나가는 것을 허용
⑶ EC2 인스턴스
⑷ SSH 접속이 안되는 경우
→ KeyPair가 유효하지 않거나 잘못 지정된 경우이니 인스턴스를 새로 생성하면서 KeyPairs를 새롭게 생성, 지정
⑸ EC2 인스턴스에 /var/www/html 디렉터리가 존재하지 않을 때 사용자 데이터에 입력한 쉘 스크립트의 LAMP 패키지 설치에 실패하고 이후 모든 스크립트가 실패
→ AMI 이미지의 버전(Amazon Linux 2 AMI - Kernel 5.10 ...)이 일치하지 않아서 발생한 문제
사용자 데이터 항목에 입력했던 쉘 스크립트 생략 가능
동일한 내용의 서비스를 제공하는 인스턴스가 두 개 실행되고 있음
개별 인스턴스의 주소로 접속하는 경우, 이용이 불편하고 부하가 집중되는 문제가 발생할 수 있음
→ 로드밸런서를 이용해 부하를 분산시키고 쉽게 서비스를 이용할 수 있도록 수정
현재는 사용자 로드밸런서를 이용하지 않고 개별 인스턴스로 직접 접근하는 것이 가능
모든 요청은 로드밸런서를 통해 처리하도록 수정
보안 그룹을 개별 인스턴스에 로드밸런서로부터 오는 HTTP(80)만 허용하도록 수정
→ 로드밸런서로의 접속은 원활하나, 개별 인스턴스의 퍼블릭 주소는 접속되지 않는 것을 확인
애플리케이션과 애플리케이션 또는 애플리케이션과 사용자 간 통신을 위한 완전 관리형 메세징 서비스
게시자에서 구독자(생산자 및 소비자라고도 함)로 메시지를 전송하는 관리형 서비스
https://docs.aws.amazon.com/ko_kr/sns/latest/dg/welcome.html
애플리케이션의 부하(load)를 처리할 수 있도록 EC2 인스턴스를 자동으로 증가 또는 감소시켜주는 서비스
EC2 인스턴스의 모음
Auto Scaling 그룹의 최소/최대 인스턴스 수 지정
ASG에서 용량을 0으로 설정