웹 사이트 호스팅
VPC 생성 ( 아래의 코드를 참조하여 terraform으로 생성 )
# region 지정
provider "aws" {
region = "ap-northeast-2"
}
# VPC 생성
resource "aws_vpc" "terraform-vpc" {
cidr_block = "10.250.0.0/16"
tags = {
Name = "vec-prd-vpc"
}
}
# 가용영역 2a의 서브넷 지정
resource "aws_subnet" "terraform-BASTION-PUB-2A" {
vpc_id = aws_vpc.terraform-vpc.id
cidr_block = "10.250.4.0/24"
availability_zone = "ap-northeast-2a"
map_public_ip_on_launch = true
tags = {
Name = "VEC-PRD-VPC-BASTION-PUB-2A"
}
}
resource "aws_subnet" "terraform-NGINX-PUB-2A" {
vpc_id = aws_vpc.terraform-vpc.id
cidr_block = "10.250.1.0/24"
availability_zone = "ap-northeast-2a"
map_public_ip_on_launch = true
tags = {
Name = "VEC-PRD-VPC-NGINX-PUB-2A"
}
}
resource "aws_subnet" "terraform-TOMCAT-PRI-2A" {
vpc_id = aws_vpc.terraform-vpc.id
cidr_block = "10.250.2.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "VEC-PRD-VPC-TOMCAT-PRI-2A"
}
}
resource "aws_subnet" "terraform-DB-PRI-2A" {
vpc_id = aws_vpc.terraform-vpc.id
cidr_block = "10.250.3.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "VEC-PRD-VPC-DB-PRI-2A"
}
}
# 가용영역 2c의 서브넷 지정
resource "aws_subnet" "terraform-NGINX-PUB-2C" {
vpc_id = aws_vpc.terraform-vpc.id
cidr_block = "10.250.11.0/24"
availability_zone = "ap-northeast-2c"
map_public_ip_on_launch = true
tags = {
Name = "VEC-PRD-VPC-NGINX-PUB-2C"
}
}
resource "aws_subnet" "terraform-TOMCAT-PRI-2C" {
vpc_id = aws_vpc.terraform-vpc.id
cidr_block = "10.250.12.0/24"
availability_zone = "ap-northeast-2c"
tags = {
Name = "VEC-PRD-VPC-TOMCAT-PRI-2C"
}
}
resource "aws_subnet" "terraform-DB-PRI-2C" {
vpc_id = aws_vpc.terraform-vpc.id
cidr_block = "10.250.13.0/24"
availability_zone = "ap-northeast-2c"
tags = {
Name = "VEC-PRD-VPC-DB-PRI-2C"
}
}
# 인터넷 게이트웨이 생성
resource "aws_internet_gateway" "terraform-igw" {
vpc_id = aws_vpc.terraform-vpc.id
tags = {
Name = "VEC-PRD-IGW"
}
}
# 퍼블릭 라우트 테이블 생성 및 인터넷 게이트웨이 연결
resource "aws_route_table" "terraform-public-rt" {
vpc_id = aws_vpc.terraform-vpc.id
tags = {
Name = "VEC-PRD-RT-PUB"
}
}
resource "aws_route" "public_internet_access" {
route_table_id = aws_route_table.terraform-public-rt.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.terraform-igw.id
}
# 퍼블릭 서브넷을 퍼블릭 라우트 테이블에 연결
resource "aws_route_table_association" "pub-rt-assoc-BASTION-2A" {
subnet_id = aws_subnet.terraform-BASTION-PUB-2A.id
route_table_id = aws_route_table.terraform-public-rt.id
}
resource "aws_route_table_association" "pub-rt-assoc-NGINX-2A" {
subnet_id = aws_subnet.terraform-NGINX-PUB-2A.id
route_table_id = aws_route_table.terraform-public-rt.id
}
resource "aws_route_table_association" "pub-rt-assoc-NGINX-2C" {
subnet_id = aws_subnet.terraform-NGINX-PUB-2C.id
route_table_id = aws_route_table.terraform-public-rt.id
}
# NAT 게이트웨이 생성
resource "aws_eip" "terraform-nat-eip" {
vpc = true
tags = {
Name = "VEC-PRD-NAT-EIP-2A"
}
}
resource "aws_nat_gateway" "terraform-nat-gw" {
allocation_id = aws_eip.terraform-nat-eip.id
subnet_id = aws_subnet.terraform-NGINX-PUB-2A.id
tags = {
Name = "VEC-PRD-NGW-2A"
}
}
# 프라이빗 라우트 테이블 생성 및 NAT 게이트웨이 연결
resource "aws_route_table" "terraform-private-rt" {
vpc_id = aws_vpc.terraform-vpc.id
tags = {
Name = "VEC-PRD-RT-PRI"
}
}
resource "aws_route" "private_nat_gateway" {
route_table_id = aws_route_table.terraform-private-rt.id
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.terraform-nat-gw.id
}
# 프라이빗 서브넷을 프라이빗 라우트 테이블에 연결
resource "aws_route_table_association" "pri-rt-assoc-TOMCAT-2A" {
subnet_id = aws_subnet.terraform-TOMCAT-PRI-2A.id
route_table_id = aws_route_table.terraform-private-rt.id
}
resource "aws_route_table_association" "pri-rt-assoc-DB-2A" {
subnet_id = aws_subnet.terraform-DB-PRI-2A.id
route_table_id = aws_route_table.terraform-private-rt.id
}
resource "aws_route_table_association" "pri-rt-assoc-TOMCAT-2C" {
subnet_id = aws_subnet.terraform-TOMCAT-PRI-2C.id
route_table_id = aws_route_table.terraform-private-rt.id
}
resource "aws_route_table_association" "pri-rt-assoc-DB-2C" {
subnet_id = aws_subnet.terraform-DB-PRI-2C.id
route_table_id = aws_route_table.terraform-private-rt.id
}
# 보안 그룹 생성
resource "aws_security_group" "terraform-sg-bastion" {
vpc_id = aws_vpc.terraform-vpc.id
name = "VEC-PRD-VPC-Bastion-PUB-SG-2A"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "VEC-PRD-VPC-Bastion-PUB-SG-2A"
}
}
resource "aws_security_group" "terraform-sg-nginx" {
vpc_id = aws_vpc.terraform-vpc.id
name = "VEC-PRD-VPC-NGINX-PUB-SG-2A"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "VEC-PRD-VPC-NGINX-PUB-SG-2A"
}
}
resource "aws_security_group" "terraform-sg-tomcat" {
vpc_id = aws_vpc.terraform-vpc.id
name = "VEC-PRD-VPC-TOMCAT-PRI-SG-2A"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["10.250.0.0/16"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["10.250.0.0/16"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "VEC-PRD-VPC-TOMCAT-PRI-SG-2A"
}
}
resource "aws_security_group" "terraform-sg-db" {
vpc_id = aws_vpc.terraform-vpc.id
name = "VEC-PRD-VPC-DB-PRI-SG-2A"
ingress {
from_port = 3306
to_port = 3306
protocol = "tcp"
cidr_blocks = ["10.250.0.0/16"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "VEC-PRD-VPC-DB-PRI-SG-2A"
}
}
terraform을 수행하여 VPC 생성 후
인스턴스 시작을 하여 인스턴스 생성 ( nginx )
이름 : VEC-PRD-VPC-NGINX-PUB-2A
이미지 linux 2 AMI 선택 후
생성해둔 keypair 선택 ( soldesk.pem )
네트워크 설정에서 생성해둔 VPC 선택 ( vec-prd-vpc : 10.250.0.0/16 )
서브넷도 마찬가지로 선택 ( VEC-PRD-VPC-NGINX-PUB-2A )
퍼블릭 ip 자동 활성화
보안 그룹은 기존 보안 그룹 선택 ( VEC-PRD-VPC-NGINX-PUB-SG-2A )
고급 네트워크 구성의 기본 IP : 10.250.1.212 로 구성
고급 세부 정보의 사용자 데이터 입력
#!/bin/bash
yum update -y
amazon-linux-extras install nginx1 -y
systemctl start nginx
systemctl enable nginx
echo "<h1>Welcome to NGINX</h1>" > /usr/share/nginx/html/index.html
인스턴스 생성 확인 후 index.html 생성
생성된 인스턴스의 public IP로 ssh 접속 후
ftp를 이용해서 이전에 terraform으로 실행시킨 html 파일을 /usr/share/nginx/html/index.html로 이동
브라우저에서 public IP로 접속해서 확인 ( 이후에 route 53으로 도메인 설정 )

인스턴스 시작을 하여 인스턴스 생성 ( Bastion )
이름 : VEC-PRD-VPC-Bastion-PUB-2A
이미지 linux 2 AMI 선택 후
생성해둔 keypair 선택 ( soldesk.pem )
네트워크 설정에서 생성해둔 VPC 선택 ( vec-prd-vpc : 10.250.0.0/16 )
서브넷도 마찬가지로 선택 ( VEC-PRD-VPC-BASTION-PUB-2A )
퍼블릭 ip 자동 활성화
보안 그룹은 기존 보안 그룹 선택 ( VEC-PRD-VPC-Bastion-PUB-SG-2A )
고급 네트워크 구성의 기본 IP : 10.250.4.107 로 구성
인스턴스 생성 ( 동적 웹 사이트 호스팅 )
인스턴스 시작을 하여 인스턴스 생성 ( TOMCAT )
이름 : VEC-PRD-VPC-TOMCAT-PRI-2A
이미지 linux 2 AMI 선택 후
생성해둔 keypair 선택 ( soldesk.pem )
네트워크 설정에서 생성해둔 VPC 선택 ( vec-prd-vpc : 10.250.0.0/16 )
서브넷도 마찬가지로 선택 ( VEC-PRD-VPC-TOMCAT-PRI-2A )
퍼블릭 ip 비활성화
보안 그룹은 기존 보안 그룹 선택 ( VEC-PRD-VPC-TOMCAT-PRI-SG-2A )
고급 네트워크 구성의 기본 IP : 10.250.2.115 로 구성
고급 세부 정보의 사용자 데이터 입력
#!/bin/bash
# Update the package repository
yum update -y
# Install Java (OpenJDK)
yum install -y java-1.8.0-openjdk-devel
# Create a user for Tomcat
useradd -m -U -d /opt/tomcat -s /bin/false tomcat
# Download Tomcat
cd /tmp
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz
# Extract Tomcat
mkdir /opt/tomcat
tar -zxvf apache-tomcat-9.0.65.tar.gz -C /opt/tomcat --strip-components=1
# Change ownership of the Tomcat directory
chown -R tomcat: /opt/tomcat
# Make scripts executable
chmod +x /opt/tomcat/bin/*.sh
# Create a systemd service file for Tomcat
cat <<EOT > /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/jre-openjdk"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
EOT
# Reload systemd to apply the new service
systemctl daemon-reload
# Start Tomcat
systemctl start tomcat
# Enable Tomcat to start on boot
systemctl enable tomcat
사전 준비
VEC-PRD-VPC-Bastion-PUB-SG-2A 보안그룹에, tcp 8080 포트 규칙 추가
ftp를 통해 VEC-PRD-VPC-Bastion-PUB-2A 인스턴스에 key pair, create-survey.html 이동
scp를 이용하여 VEC-PRD-VPC-TOMCAT-PRI-2A에 create-survey.html저장
웹 사이트 호스팅
먼저 Tomcat의 기본 웹 애플리케이션 디렉터리인 webapps 폴더로 이동합니다.
웹사이트를 호스팅할 디렉터리를 생성합니다. 예를 들어, mywebsite라는 디렉터리를 생성합니다.
생성한 디렉터리(mywebsite)에 HTML 파일들을 업로드합니다. HTML 파일을 직접 작성할 수도 있고, 기존 파일을 복사할 수도 있습니다.
변경 사항을 반영하기 위해 Tomcat을 재시작합니다.
웹 브라우저를 열고 서버의 IP 주소와 생성한 디렉터리명을 이용하여 접속합니다.
마지막으로
보안 그룹 설정을 확인 합니다
두 인스턴스가 서로 통신할 수 있도록 보안 그룹 설정을 확인합니다. VEC-PRD-VPC-TOMCAT-PRI-SG-2A 보안 그룹이 VEC-PRD-VPC-Bastion-PUB-SG-2A 보안 그룹에서 오는 트래픽을 허용하는지 확인합니다.
VEC-PRD-VPC-TOMCAT-PRI-SG-2A 보안 그룹에 아래와 같이 인바운드 규칙을 추가합니다.
유형: HTTP
포트 범위: 8080
소스: VEC-PRD-VPC-Bastion-PUB-SG-2A 보안 그룹의 ID
이 단계를 통해 VEC-PRD-VPC-Bastion-PUB-2A 인스턴스에서 VEC-PRD-VPC-TOMCAT-PRI-2A 인스턴스의 웹사이트에 접근할 수 있습니다.
route 53 으로 도메인 설정과 load balancer 작업 필요
VPC 엔드포인트 생성:
AWS 콘솔에 로그인합니다.
서비스 목록에서 "VPC"를 선택합니다.
왼쪽 메뉴에서 "Endpoints"를 선택합니다.
"Create Endpoint"를 클릭합니다.
서비스를 "DynamoDB"로 선택합니다.
VPC를 선택합니다 (예: VEC-PRD-VPC).
서브넷을 선택합니다 (예: VEC-PRD-VPC-DB-PRI-2A).
정책을 선택합니다 (기본적으로 전체 접근을 허용하는 정책을 선택할 수 있습니다).
"Create Endpoint"를 클릭합니다.
DynamoDB 테이블 생성:
서비스 목록에서 "DynamoDB"를 선택합니다.
왼쪽 메뉴에서 "Tables"를 선택합니다.
"Create table"을 클릭합니다.
테이블 이름과 기본 키를 입력합니다.
나머지 설정은 기본값으로 두고 "Create"를 클릭합니다.
VPC 엔드포인트와 DynamoDB 연결 확인:
생성한 VPC 엔드포인트가 제대로 연결되었는지 확인합니다.
VPC 엔드포인트의 상태가 "Available"인지 확인합니다.
DynamoDB 콘솔로 이동하여 테이블을 확인합니다.
생성된 테이블을 선택하여 항목을 추가하거나 관리할 수 있습니다.
VPC 엔드포인트를 사용하여 DynamoDB와 연결하여 항목을 확인하거나 관리하는 이유와 장점
보안 강화:
데이터 보안: VPC 엔드포인트를 사용하면 데이터가 인터넷을 통해 전송되지 않고, AWS 네트워크 내에서만 이동합니다. 이를 통해 데이터 전송 시 보안을 강화할 수 있습니다.
프라이빗 액세스: VPC 내부에서 DynamoDB에 접근하기 때문에 퍼블릭 인터넷을 통해 접근하는 것보다 안전합니다.
네트워크 성능 향상:
지연 시간 감소: 데이터가 AWS 네트워크 내에서만 이동하기 때문에 지연 시간이 줄어들어 응답 속도가 빨라질 수 있습니다.
대역폭 절감: 인터넷을 통해 데이터를 전송할 필요가 없기 때문에 대역폭 사용을 절감할 수 있습니다.
비용 절감:
네트워크 제어:
세부적인 액세스 제어: VPC 보안 그룹과 네트워크 ACL을 사용하여 특정 IP 범위나 인스턴스에서만 DynamoDB에 접근할 수 있도록 제어할 수 있습니다.
정책 기반 관리: 엔드포인트 정책을 통해 어떤 리소스가 DynamoDB에 접근할 수 있는지 세부적으로 관리할 수 있습니다.
운영의 단순화:
DynamoDB와 VPC 엔드포인트 연결 테스트
aws configure를 통해 계정 인증을 한 후에
다음과 같이 AWS CLI를 사용하여 DynamoDB 테이블의 항목을 스캔할 수 있습니다
