본문 바로가기

메가존 클라우드 2기 교육/AWS

AWS - IAM, RDS, ELB(NLB, ALB), Route 53, 워드프레스

IAM(Identity and Access Management)

IAM 이란?

AWS 서버스에 대한 액세스를 안전하게 제어하는 웹 서비스이다.

IAM을 통해 사용자, 액세스 키와 같은 보안 자격 증명, 사용자와 애플리케이션이 어떤 AWS 리소스에 액세스할 수 있는지 제어하는 권한을 한 곳에서 관리할 수 있다.


사용자 그룹 생성

'AWSServiceRoleForSupport, AWSServiceRoleForTrustedAdvisor'를 제외한 모든 역할을 삭제. (삭제되지 않기 때문)

'그룹 생성' 클릭

그룹의 권한 설정

사용자 그룹 생성 완료.

사용자 추가

'사용자 추가' 클릭
'AWS Management Console 권한'을 통해 해당 유저에게 AWS 사이트의 콘솔 Web UI를 사용하게 할지 말지를 결정. '자동 생성된 암호'로 첫 로그인을 한 뒤, 사용자가 직접 새 암호를 생성하게 하여 사용자의 보안 정보를 보호.

'직접 정책 연결'은 root 사용자가 본인이 사용할 관리자 사용자를 생성할 때 주로 사용 


사용자 생성 완료. '콘솔 로그인 URL'을 통해 IAM 로그인이 가능

위에서 설정한 대로, 첫 로그인 때 비밀번호를 재설정한다.

이제 설정해준 'ReadOnly' 권한이 잘 적용되는지 확인해본다.

권한이 없어서 인스턴스 생성에 실패했다. 권한 정책이 잘 적용됐음을 확인.

권한 수정

기존의 'ReadOnly'권한을 삭제. (권한 정책은 최대 10개 까지이므로 불필요한 권한은 삭제하는 것이 좋다)
'정책 연결' 클릭

EC2에 대한 모든 권한 추가
권한 추가 완료.

권한 추가가 실시간으로 반영되어 인스턴스 생성에 성공.

 


별칭 수정

IAM으로 로그인 할때, 계정 이름을 외우기 힘들다. 하지만, IAM 계정의 별칭을 변경할 수 있다.

우측의 '계정 별칭'의 '생성' 클릭

 이제 IAM 사용자로 로그인할 때 별칭을 이용해서 로그인 할 수 있다.

 


RDS (Relational Database Service)

RDS란?

AWS 클라우드에서 관계형 데이터베이스를 더 쉽게 설치, 운영 및 확장할 수 있는 웹 서비스이다.

이 서비스는 산업 표준 관계형 데이터베이스를 위한 경제적이고 크기 조절이 가능한 용량을 제공하고 공통 데이터베이스 관리 작업을 관리한다.

DB 인스턴스는 AWS 클라우드에 있는 격리된 데이터베이스 환경이다. DB 인스턴스에 사용자가 만든 여러개의 데이터베이스가 포함될 수 있다.

독립 실행형 데이터베이스 인스턴스와 함께 사용하는 것과 동일한 도구 및 애플리케이션을 사용하여 DB 인스턴스에 액세스 할 수 있다.

 


RDS 생성

user가 RDS를 생성할 권한이 없다.

user에게 RDS에 대한 모든 권한을 부여


RDS 생성 완료.

 


Route 53

아직 user는 Route53에 대한 권한이 없다.
그룹에 Route53에 대한 모든 권한 부여

Route 53 생성

구매했던 도메인 주소 입력

4개의 NS 주소를 복사하여 가비아의 네임 서버에 입력해준다.

 


ELB (Elastic Load Balancing)

ELB란?

EC2 인스턴스, 컨테이너 및 IP 주소와 같은 여러 대상에 대해 수신 애플리케이션 또는 네트워크 트래픽을 여러 가용 영역에 배포한다. 애플리케이션에 대한 트래픽이 시간이 지남에 따라 변경되므로 Elastic Load Balancing가 로드 밸런서를 확장하고, 대다수의 워크로드에 맞게 자동으로 조정할 수 있다.

로드 밸런서는 워크로드를 가상 서버와 같은 다수의 컴퓨팅 리소스로 분산합니다. 로드밸런서를 사용하면 애플리케이션의 가용성(High Availaility)과 내결함성(Fault Tolerant)이 높아진다.


사전 준비

# index.html 파일 수정
sudo vi /var/www/html/index.html
제목을 'web01'로 수정
수정 완료.

웹 페이지로 쓰일 파일 업로드.
# tar파일 해제
sudo tar xvf food.tar -C /var/www/html

# index.html 수정
sudo vi /var/www/html/index.html
제목을 'web02'로 수정
수정 완료.

편한 실습을 위해 'user'가 속한 'admin' 그룹에 모든 권한을 부여한다.

기존 권한 모두 삭제
'AdministratorAccess' 권한(최고 권한) 추가

 

# 메타 데이터 목록 확인
curl http://169.254.169.254/latest/meta-data

# 메타 데이터의 항목 확인
curl http://169.254.169.254/latest/meta-data/(보고싶은 항목)

해당 명령어를 통해 해당 서버의 메타 데이터를 확인할 수 있다.

web01에서의 메타 데이터

web02에서의 메타 데이터

NLB 생성

'로드 밸런서 생성' 클릭

NLB 선택

'대상 그룹 생성' 클릭

다른 플랫폼 처럼 상태 검사(30초마다 10초를 기준으로 정상, 비정상 판단 후, 5회 연속 성공하면 정상, 2번 연속 실패하면 비정상으로 간주)를 진행한다.
체크하고 '아래에 보류 중인 것으로 포함'을 클릭하여 대상 등록

다시 돌아와서,

대상 그룹을 지정하고 '로드 밸런서 생성' 클릭
로드 밸런서 생성 완료.

로드 밸런서의 DNS 이름으로 접속한다.

대상 그룹에 있는 웹 서버들에 연결된다. 최소 접속 알고리즘으로 로드 밸런싱한다.


Route53에 레코드로 NLB 주소 추가

하지만 DNS 주소 이름이 너무 길다. 이를 Route53을 이용하여 간단하게 만들 것이다.

'레코드 생성' 클릭
별칭을 이용하여 쉽게 NLB 지정 가능.
간단한 주소를 통해 NLB 접속

 


워드프레스

워드프레스 서버 생성

#!/bin/bash
yum install -y httpd php php-mysql php-gd php-mbstring wget unzip
cd /tmp
wget https://ko.wordpress.org/wordpress-4.8.2-ko_KR.zip
cd /var/www/html
unzip /tmp/wordpress-4.8.2-ko_KR.zip
mv ./wordpress/* .
chown -R apache:apache /var/www/*
systemctl enable --now httpd

인스턴스 생성 완료.

# web01에 mysql 설치
sudo yum install -y mysql


my-sg-web에 속한 서버들만 DB 접근 가능.
규칙 저장 클릭

wp-dbserver의 엔드포인트 주소를 복사.

# RDS 접속
mysql -h (rds 엔드포인트 주소) -u (아이디) -p
# 유저, 데이터베이스 생성, 권한 부여
CREATE USER 'wpuser'@'%' IDENTIFIED BY 'wppass';
CREATE DATABASE IF NOT EXISTS wordpress;
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'%';
quit

ALB 생성

워드프레스의 가용성을 높이기 위한 ALB를 생성한다.

ALB는 CLB와 비슷하며, NLB가 최소 접속 알고리즘을 써서 로드 밸런싱을 하는것과 다르게 'Round-Robin'방식을 사용한다.

'로드 밸런서 생성' 클릭

'ALB' 선택


NLB와 다르게 보안 그룹이 존재한다. '새 보안 그룹 생성' 클릭

'대상 그룹 생성' 클릭
여기서 실수를 했는데, 대상 그룹 이름을 'my-tg-alb'가 더 구분하기 좋은 표현이다.
워드 프레스만 대상으로 설정.


현재 워드프레스에는 index.html이 없고 php만 있기 때문에 비정상으로 뜬다. 그러므로 테스트를 위해 index.html을 생성한다.
확인해본 결과 php만 존재한다.
# 경로 변경
cd /var/www/html

# index.html 수정을 통한 생성
sudo vi index.html

이렇게 하면 이제 html 파일이 응답하여 ALB에 '정상' 응답이 될 것이다.


하지만, 우리가 원하는 것은 접속할 때 index.php파일을 여는 것인데, html이 php보다 우선순위가 높으므로 index.html이 의도치 않게 열릴 것이다. 그러므로 우선순위를 수정하여 php이 먼저 열리도록 해야한다.

# 경로 변경
cd /etc/httpd/conf

# httpd 설정 파일 수정
sudo vi httpd.conf
//
DirectoryIndex index.php index.html
//

하지만, 이러면 또 헬스 체크를 php파일로 진행한다. 그러므로 상태 검사 경로를 변경할 것이다

다시 비정상으로 뜬다.
다시 정상으로 뜬다.

굳이 php가 아닌 html로 응답을 하려는 이유는, 상태 코드 '200'을 html 파일만이 줄 수 있기 때문이다.


Route 53에 ALB

 하지만 ALB의 엔드포인트 주소로 접속하기엔 민감한 여러 정보들이 하드코딩 되어있으므로 보안상 좋지 않다. 그러므로 Route 53을 이용해서 다른 주소로 접속해야한다.

'레코드 생성' 클릭

워드프레스 설치

Route53으로 지정한 주소로 접속

워드프레스 이미지 생성



이미지가 새로 생겼다. 이름을 알아보기 쉽게 변경
스냅샷이 새로 생겼을 것이다. 이름을 알아보기 쉽게 변경한다.

워드프레스 시작 템플릿 생성

'Create launch template' 클릭

생성했던 AMI 사용
RDS에 대한 방화벽 설정을 'my-sg-web'에 했으므로 선택

시작 템플릿 생성 완료.

시작 템플릿으로 인스턴스 생성

 AWS는 Azure때와 다르게 인스턴스의 퍼블릭 IP를 분리할 수 없다. 이렇게 되면 ALB가 아닌 다른 경로로 외부에서 접근 가능하므로 이는 좋지 않다.

워드프레스 '등록 취소' 클릭
기존의 워드프레스에는 이제 접속할수 없게 된다.

 


서브넷을 '프라이빗'으로 설정하여 외부가 아닌 내부에서만 접근 가능하게 한다.

태그가 없는 인스턴스가 바로 방금 생성한 워드프레스 인스턴스다. 알아보기 쉽게 이름 변경

같은 방법을 반복하여 인스턴스 'wp02'도 생성한다.

이번엔 서브넷을 'my-pvt-2c'로 설정

마지막으로 인스턴스 'wp03'도 똑같이 생성

'my-pvt-2a'로 설정

'wp01', 'wp02', 'wp03' 모두 생성 완료.

이제 다시, 대상 그룹에 위의 세 개의 서버를 추가한다.

'대상 등록' 클릭

프라이빗으로 설정한 워드프레스 서버들을 등록.

정상 응답 확인.

ALB로 다시 접속된다. (ALB로만 접속 가능)

 이처럼 인스턴스를 생성하고 꾸밀 때는 접근이 쉽게 하기 위해 퍼블릭 서브넷을 이용한 뒤, 보안을 위해 만들어진 인스턴스를 이미지로 생성하고, 그 이미지로 프라이빗 서브넷을 사용한 인스턴스로 생성하는 방식을 사용할 수 있다.