본문 바로가기

클라우드/Public Cloud(Naver, Amazon)

aws AWS에서 웹 어플리케이션 배포(Arch-2)

기존에 서버를 배포하고 보안을 구성하던 방법은 복잡하여 여러 팀이 관여해야 하고, 시간도 오래 지연되는 경우가 많았다. 다행히도 클라우드에 보안 인프라를 배포하는 것은 빠르고 간편하다. Amazon RDS를 사용하여 데이터베이스 시작, Amazon EC2를 사용하여 애플리케이션 서버 시작, 자동으로 애플리케이션 설치를 진행하겠다.

보안을 구성하겠다. 보안은 아키텍처의 각 계층, 즉 애플리케이션, 서버, 네트워크를 비롯해 인터넷에 연결할 때도 구현되어야 한다. 이 작업에서는 Amazon EC2 애플리케이션 서버와 Amazon RDS 데이터베이스 인스턴스용 Security Groups를 정의한다.

보안 그룹은 하나 이상의 인스턴스에 대한 트래픽을 제어하는 가상 방화벽 역할을 한다. 인스턴스를 시작할 때 하나 이상의 보안 그룹을 인스턴스와 연결한다. 연결된 인스턴스와 트래픽을 주고받을 수 있게 하는 규칙을 각 보안 그룹에 추가한다. 언제든지 보안 그룹에 대한 규칙을 수정할 수 있다. 새 규칙은 보안 그룹과 연결된 모든 인스턴스에 자동으로 적용된다. 먼저 App Security Group을 생성한다. 인터넷에서 들어오는 HTTP 연결을 허용하도록 구성한다.

먼저 Services메뉴에서 EC2를 클릭한다.

왼쪽 탐색 창에서 Security Groups를 클릭한다.

이름과 설명과 VPC를 설정하고 규칙을 추가한다. Add rules를 눌러 http를 허용한다. 소스는 위치 무관인 Anywhere로 설정하고 생성한다.

무사히 생성되었고 생성된 App-SG를 선택한다.

페이지 하단부의 Description 탭에 표시된 Group ID를 복사한다.

보안그룹을 하나 더 생성한다. 역시 이름과 설명과 VPC를 입력한다. inbound에서 규칙을 추가한다. MYSQL/Aurora를 선택 한 후 Source에 복사한 Group ID를 넣어준다. 한 보안 그룹이 다른 보안 그룹을 참조하는 기능이다. App-SG와 연결만 하면 추가 EC2 인스턴스가 데이터베이스에 엑세스 할 수 있게 된다. APP-SG와 연결된 인스턴스는 데이터베이스와 통신이 가능해지게 된다.

보안 그룹 설정이 끝나고 이제 Amazon RDS 데이터베이스를 생성하겠다. 일반적으로 데이터베이스 생성은 데이터베이스 관리자 또는 시스템 관리자가 있어야하는데 클라우드에서는 Amazon RDS를 사용하여 간단하게 생성할 수 있다.

서비스 메뉴에서 RDS를 클릭한 후 대시보드에서 create database를 선택한다.

(Switch to your original interface 선택!) Select engine 페이지에서 MYSQL를 선택한다.

(엔터프라이즈급 데이터베이스에서 개발/테스트 시스템에 이르는 여러 사용 사례가 제시된다. 그리고 클라우드용으로 재설계된 Amazon Aurora에 대한 내용도 나온다.) 대규모 MYSQL 또는 PostgreSQL 데이터베이스를 사용할 경우 Amazon Aurora에서 향상된 성능을 제공할 수 있다.)

Choose use case 페이지에서 Dev/Test-MYSQL을 선택한다.

Specify DB detail 페이지에서 다음의 사항들을 구성한다.

Network와 보안 섹션에서 VPC를 설정한다.

기존에 있는 VPC 보안 그룹 선택! DB-SG 추가하고 default값은 제거해야 한다.

Database의 이름을 inventory로 설정하겠다.

DB 인스턴스가 생성되었다. 시간이 몇분 걸린다.

이제 Amazon EC2를 사용하여서 애플리케이션 서버를 시작하겠다. 서비스에서 EC2클릭!

Launch Instance(인스턴스 시작)클릭한다.

인스턴스 시작에 사용될 디스크 볼륨 사본이 있는 AMI를 선택할 수 있다. Linux 인스턴스를 생성하기 위해 Amazon Liunx2 이미지를 선택한다.

인스턴스 유형은 가상 CPU, 메모리, 디스크 스토리지, 네트워크 성능 조합을 할당한다. Appt2.micro 인스턴스 유형을 사용한다.

인스턴스 세부 정보 구성하겠다. VPC, Subnet, IAM role을 생성하겠다.

Inventory –App-Role은 인스턴스에 실행 중인 어플리케이션이 AWS 서비스로 요청할 권한을 부여한다. 역할을 아래와 같다.


"Version": "2012-10-17",

"Statement": [

{ "Action": "ssm:*",

"Resource": "arn:aws:ssm:*:*:parameter/inventory-app/*",

"Effect": "Allow" }

 ] }

 

아래로 스크롤한 다음 고급 세부 정보를 확장한다. 사용자 데이터 필드가 나타난다. 인스턴스를 시작할 떄 User data필드를 통해 구성 스크립트를 전달 할 수 있다.

#!/bin/bash

# Install Apache Web Server and PHP

yum install -y httpd mysql

amazon-linux-extras install -y php7.2

# Download Lab files

wget https://us-west-2-tcprod.s3.amazonaws.com/courses/ILT-TF-100-ARCHIT/v6.3.4/lab-2-webapp/scripts/inventory-app.zip

unzip inventory-app.zip -d /var/www/html/

# Download and install the AWS SDK for PHP

wget https://github.com/aws/aws-sdk-php/releases/download/3.62.3/aws.zip

unzip aws -d /var/www/html

# Turn on web server

chkconfig httpd on

service httpd start

(이 스크립트는 apache 웹 서버와 php 언어 설치, 인벤토리 어플리케이션 및 AWS SDK 다운로드, 웹 서버를 활성화하여 부팅 시 자동으로 시작되도록 구성)

이 유형의 스크립트를 사용하면 로그인하여 소프트웨어를 수동으로 구성할 필요 없이 새 인스턴스를 구성할 수 있다. * 인벤토리 앱을 통해서 데이터베이스의 데이터를 가져온다.

스토리지를 추가한다. 디스크 볼륨을 추가하고 그 크기와 성능을 구성할 수 있다.

태그를 사용하여 목적, 소유자 또는 환경 등 다양한 방식으로 AWS 리소스를 분류할 수 있다. 이 기능은 동일 유형 리소스가 여러 개일 때 유용하다. 태그로 특정 리소스를 신속하게 찾을 수 있다.

보안그룹은 인스턴스에 App-SG를 선택한다. (인바운드 규칙에 따라 인터넷 상의 모든 곳에서 오는 HTTP 트래픽이 허용된다.) Review and Launch 클릭!

경고가 표시되면 continue 클릭한다.

Details를 검토하고 시작한다.

키 페어는 기존 키 페어를 선택하고 인스턴스를 시작한다.

인스턴스 상태가 running으로 표시되고 Status Checks2/2가 보여야 무사히 생성!

이제 어플리케이션이 작동하는지 테스트해야 한다. EC2 인스턴스를 클릭하여 Description탭에서 ipv4 공인 ip를 복사하여 웹 페이지에 입력한다. 웹 어플리케이션이 나타나야 하는데 애플리케이션이 아직 데이터베이스에 연결되지 않아 표시되는 정보가 거의 없다.연결하기 위해 Settings를 클릭한다.

RDS 서비스에 들어간다. 앞으로 생성한 Amazon RDS DB 인스턴스를 사용하도록 애플리케이션을 구성할 수 있다. Database endpoint를 불러와 앱과 데이터베이스를 연결한다.

databases클릭한다. 생성한 데이터베이스를 클릭한다 .

Connectivity(연결성)섹션으로 화면 아래로 이동하여 엔드포인트를 클립보드로 복사한다.

Endpoint database의 정보들을 입력하고 저장한다.

애플리케이션이 데이터베이스에 연결되어 일부 초기 데이터와 표시 정보를 불러온다. 웹 어플리케이션을 사용하여 인벤토리 정보를 추가 편집 및 삭제 한다.

Add inventory를 통해 임의로 duck을 추가해보았다.

인벤토리 정보는 앞에서 생성한 Amazon RDS MYSQL 데이터베이스에 저장된다. 따라서 애플리케이션 서버에 장애가 발생해도 데이터가 손실되지 않는다. 그리고 여러 애플리케이션 서버에 동일한 데이터에 엑세스할 수 있다. 데이터베이스에 직접 접근하지 않고 앱서버를 통해서 데이터베이스에 접근하였다.