팀 프로젝트- 5회차

박형준·2024년 6월 18일

웹 사이트 호스팅

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저장

    • scp -i soldesk.pem.pem /home/ec2-user/create-survey.html ec2-user@10.250.2.115:/home/ec2-user/index.html
  • ssh를 이용하여 VEC-PRD-VPC-TOMCAT-PRI-2A에 접속
    • ssh -i soldesk.pem.pem ec2-user@10.250.2.115

웹 사이트 호스팅

  • 먼저 Tomcat의 기본 웹 애플리케이션 디렉터리인 webapps 폴더로 이동합니다.

    • cd /opt/tomcat/webapps
  • 웹사이트를 호스팅할 디렉터리를 생성합니다. 예를 들어, mywebsite라는 디렉터리를 생성합니다.

    • mkdir mywebsite
  • 생성한 디렉터리(mywebsite)에 HTML 파일들을 업로드합니다. HTML 파일을 직접 작성할 수도 있고, 기존 파일을 복사할 수도 있습니다.

    • cp /home/ec2-user/index.html /opt/tomcat/webapps/mywebsite/
  • 변경 사항을 반영하기 위해 Tomcat을 재시작합니다.

    • systemctl restart 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 작업 필요


AWS 콘솔을 사용하여 DynamoDB 테이블과 VPC를 연결하여 항목을 확인하거나 관리하는 방법

  • 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 엔드포인트를 사용하면 데이터 전송 시 비용이 더 저렴할 수 있습니다.
  • 네트워크 제어:

    • 세부적인 액세스 제어: VPC 보안 그룹과 네트워크 ACL을 사용하여 특정 IP 범위나 인스턴스에서만 DynamoDB에 접근할 수 있도록 제어할 수 있습니다.

    • 정책 기반 관리: 엔드포인트 정책을 통해 어떤 리소스가 DynamoDB에 접근할 수 있는지 세부적으로 관리할 수 있습니다.

  • 운영의 단순화:

    • 구성의 단순화: 인터넷 게이트웨이, NAT 게이트웨이 등을 구성하지 않고도 VPC 내에서 DynamoDB에 접근할 수 있어 운영이 단순해집니다.
    • 통합된 모니터링: AWS에서 제공하는 모니터링 도구를 사용하여 네트워크 트래픽과 엔드포인트 사용을 쉽게 모니터링할 수 있습니다.

DynamoDB와 VPC 엔드포인트 연결 테스트

  • aws configure를 통해 계정 인증을 한 후에

  • 다음과 같이 AWS CLI를 사용하여 DynamoDB 테이블의 항목을 스캔할 수 있습니다

    • aws dynamodb scan --table-name your-table-name

0개의 댓글