카테고리 없음

[2023-04-28 금] AWS EFS, NGW, S3 버킷, IAM 역할

16비트 2023. 4. 28. 17:45

 

1.

망도

 

보안 그룹 vs 네트워크

방화벽이라는 공통점이 있다. 외부에서 트래픽 접근 제어를 할 수 있다.

 

보안 그룹 (Security Group)

  • 인스턴스 레벨에서 운영된다. 
  • 허용규칙만 지원한다.
    특정한 IP, 특정한 Network, 특정한 보안 그룹를 거부할 수 없다
  • 상태 저장(Stateful) : 외부에서 들어온 트래픽에 대한 응답을 왔던 길목으로 나간다. 길목을 저장하고 있다가 다시 내보낸다. 규칙에 관계없이 반환 트래픽이 자동으로 허용된다. 아웃바운드 트래픽을 컨트롤하지 않아도 된다
  • 트래픽 허용 여부를 결정하기 전에 모든 규칙을 평가한다
  • 인스턴스시작시 누군가 보안그룹을 지정하거나, 나중에 보안 그룹을 인스턴스와 연결하는 경우에만 인스턴스에 적용됨

 

네트워크 ACL (NACL)

  • 서브넷 단위로 운영된다
  • 허용 및 거부 규칙 지원한다.
    특정한 IP, Network를 거부(deny, block)할 수 있다.
    보안 그룹을 많이 사용하지만 콕 집어 차단하고 싶을 때 NACL을 사용한다
    허용과 거부가 있을 때 우선순위가 있다. 순위가 낮을수록 우선 적용된다.
  • 상태 비저장(Stateless): 들어오고 나가는 것을 세팅해줘야 한다. 반환 트래픽이 규칙에 의해 명시적으로 허용되어야 한다.
  • 트래픽 허용여부를 결정할때 번호가 가장 낮은 규칙부터 순서대로 규칙을 처리한다.
  • 연결된 서브넷의 모든 인스턴스에 자동 적용된다 (보안 그룹 규칙이 지나치게 허용적일 경우 추가 보안 계층 제공)
    NACL에서 차단해버리면 뒷 단에는 트래픽이 도달하지 않아서 보안 그룹의 허용 규칙을 적용할 수 없다

2.

AWS 기본 세팅

bastion host 인스턴스 poweron

Route53

호스팅 영역 생성 - 'changhoon.shop'

가비아에 AWS Route53 네임서버 등록

WIN cmd창에 nslookup -type=ns changhoon.shop 명령으로 도메인이 네임서버에 적용되었는지 확인할 수 있음

RDS 시작

EFS 만들기

EFS 보안그룹 만들기

보안 그룹 이름 'my-sg-efs'

설명 'my-sg-efs'

VPC 'my-vpc'

인바운드 규칙 '규칙 추가'

유형 'NFS' - 소스 '사용자 지정' - 'my-sg-web'    // 소슼(출발지)가 보안 그룹이 my-sg-web인 애들만 허용

EFS 만들기

efs이름 'my-efs'

vpc 'my-vpc'

스토리지 클래스 'Stantdard'    // 여러 AZ에 걸쳐 데이터를 중복 저장한다, One Zone에 비해 가격이 비쌈

네트워크 설정에서 보안 그룹이 default로 설정되어 있는 것을 다 지우고 my-sg-efs로 설정한다

 

NAT Gateway 이론

이전 실습에서 firewalld로 IP 공유기를 만들었었다. zone을 internal, external로 나누었음

NAT게이트웨이의 위치가 중요하다. 반드시 퍼블릭 서브넷에 만들어야 한다

예전에는 EC2로 NAT instance로 만들었었다. 이건 금액이 안들어감. 좁은 대역폭을 가지고 있음

NAT Gateway는 금액이 들어감. 넓은 대역폭을 가지고 있음

※ Azure는 퍼블릭 IP가 없어도 인터넷 연결이 되었다. NAT Gateway를 Azure에서 연결해주었다

  • NAT(네트워크 주소 변환) 게이트웨이를 사용하여 프라이빗 서브넷의 인스턴스를 인터넷 또는 기타 AWS 서비스에 연결하는 한편, 인터넷에서 해당 인스턴스와의 연결을 시작하지 못하도록 할 수 있습니다.
  • 계정에서 NAT 게이트웨이 생성 및 사용에 대한 요금이 청구된다.
  • NAT 게이트웨이 시간당 사용 요금 및 데이터 처리 요금이 적용된다.
  • 다음 다이어그램은 NAT 게이트웨이가 있는 VPC의 아키텍처를 보여 준다.
  • 기본 라우팅 테이블은 프라이빗 서브넷의 인스턴스에서 NAT 게이트웨이로 인터넷 트래픽을 보낸다.
  • NAT 게이트웨이는 NAT 게이트웨이의 탄력적IP 주소를 소스 IP 주소로 사용하여 인터넷 게이트웨이로 트래픽을 보낸다.

 

3.

인스턴스 만들기

인스턴스 이름 'wp01'

이미지 '내 AMI' - '내 소유' - 'my-ami-wp'

인스턴스 유형 't2.micro'

키 페어 'my-key'

서브넷 'my-pvt-2a'   // 프라이빗에 인스턴스 생성

방화벽(보안 그룹) '기존 보안 그룹 선택'

보안 그룹 'my-sg-web'     // rds에 접근할 수 있는 소스

인스턴스를 만들 때 EFS와 쉽게 연결이 가능하다

파일 시스템 'my-efs'

탑재 지점 '/mnt/efs/fs1'

'보안 그룹을 자동을 생성 및 연결' 체크 해제 // 우린 보안 그룹을 설정했다

'필요한 사용자 데이터 스크립트를 연결하여 공유 파일 시스템을 자동으로 탑재' 체크 // efs-utils을(를) 설치할 사용자 데이터를 업데이트하여 파일 시스템을 자동으로 탑재합니다. 파일 시스템을 수동으로 탑재하려면 확인란의 선택을 취소합니다.

체크하면 사용자 데이터에 자동으로 스크립트를 넣어준다. 사용자 데이터 명령어가 실행되려면 퍼블릭 서브넷이어야 한다. 하지만 지금 프라이빗으로 설정했다. 그러므로 사용자 데이터가 실행되지 않을 것이다

설치가 될 수도 있다. 아마존 리눅스2에 기본적으로 nfs-utils가 설치되었을 수도 있기 때문.

배스천 호스트를 통해 생성한 wp01 인스턴스 접속해서 EFS 접근하기

배스천 호스트 MobaXterm으로 접속

my-key.pem 으로 wp01 접속

프라이빗 서브넷에 인스턴스가 생성되어서 인터넷 연결이 안된다

사용자 데이터가 실행되지 않는다

사용자 데이터 명령이 실행되지 않아 EFS가 연결이 안되어서 수동으로 연결해주어야 한다

명령어를 복사해서 wp01 MobaXterm에 붙여넣어서 수동으로 마운트시켜준다

mkdir efs    // efs가 연결될 폴더를 만들어준다

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-0f7cef32a03a9ac58.efs.ap-northeast-2.amazonaws.com:/ efs

df -h   // 잘 마운트 되었다

NGW를 만들기

NGW를 통해 wp01에게 인터넷 연결하기

NGW를 만들면 라우팅 테이블 설정에 라우팅 정보를 추가해줘야한다

비용이 나가는 서비스

NGW 이름 'my-ngw'

서브넷 'my-pub-2a'

'탄력적 IP 할당' 클릭 // 클릭하자마자 생성된다. 탄력적 IP주소 1개만은 사용 중일 때 무료로 해준다. 안쓰면 돈나감. NAT 기능을 하기 때문에 퍼블릭 IP가 있어야 한다

NGW가 생성되고 퍼블릭IPv4 주소를 할당 받으면 라우팅 테이블 설정에 세팅해줘야한다

현재 my-pvt-rtb 에는 local통신밖에 안된다

NGW 라우팅 정보를 등록해줘서 인터넷 연결이 되게 해준다

대상(목적지) 0.0.0.0/0

대상(타겟) NGW

라우팅 테이블에 등록하고 ping google.com으로 접속 테스트를 해보면 바로 된다

이제 프라이빗 서브넷에 생성되는 인스턴스들은 인터넷 연결이 된다

프라이빗 서브넷에 인스턴스를 만들기

인스턴스 이름 'wp02'

이미지 '내 AMI' - 'my-ami-wp'

키 페어 'my-key'

VPC 'my-vpc'

서브넷 'my-pvt-2c'

방화벽(보안 그룹) '기존 보안 그룹 선택'

보안 그룹 'my-sg-web'

파일 시스템 'EFS' - 'my-efs'

'보안 그룹을 자동을 생성 및 연결' 체크 해제

접속 테스트

ssh -i my-key.pem ec2-user@10.40.99.207    // key를 통해 

df -h    // 127.0.0.1 이 EFS다.

인터넷이 연결되었기 때문에 프라이빗 서브넷에 인스턴스를 생성하였지만 사용자 데이터 명령이 실행되었다. NGW가 연결되었기 때문

wp02 인스턴스에서 test.txt 파일을 efs에 만들고 wp01 인스턴스에서 공유되는 것을 확인할 수 있다

wp02 인스턴스에서 cd /mnt/efs/fs1 경로로 이동해서 파일 생성

wp02 인스턴스 세션에서 ls efs로 test.txt를 확인할 수 있다

4.

EFS를 생성하면 가용영역에 하나씩 생성된다. 총 4개가 생성됨. 가용성을 높이기 위함

하나의 EFS에 저장하면 복제가 되어서 나머지 3개에 동시에 저장이 된다

 

5.

NGW가 없을 때 EFS가 인스턴스에 마운트 되는지 확인하기

NGW 삭제

탄력적 IP 릴리스(삭제)하기

wp01 인스턴스 삭제하기

 

wp01 인스턴스 다시 만들고 마운트 되었는지 확인해보기

인스턴스 이름 'web01'

이미지 '내 AMI' - 'my-ami-wp'

키 페어 'my-key'

vpc 'my-vpc'

서브넷 'my-pvt-2a'

퍼블릭 IP 자동 할당 '비활성화'

방화벽(보안 그룹) '기존 보안 그룹 선택'

보안 그룹 'my-sg-web'

파일 스토리지 'my-efs'

 

efs-test 인스턴스 만들기

인스턴스 이름 'efs-test'

이미지 'Qtick Start' - Ubuntu 'Ubuntu Server 20.04 LTS (HVM)'

키 페어 'my-key'

vpc 'my-vpc'

서브넷 'my-pvt-2c'

퍼블릭 IP 자동 할당 '비활성화'

방화벽(보안 그룹) '기존 보안 그룹 선택'

보안 그룹 'my-sg-web'

파일 시스템 'my-efs'

'보안 그룹을 자동으로 생성 및 연결' 체크 해제

OS가 달라도 여러 가지의 명령어가 다 들어가있어서 알아서 설치가 된다

 

 wp01 인스턴스 efs 마운트되는지 확인하기.

인터넷 연결이 안되었지만 EFS가 마운트되어있다

cd /var/log

sudo cat cloud-init-output.log | grep nfs    // 이미 NFS가 설치된 것을 확인할 수 있다

 

방금 만든 우분투 서버 'efs-test' 인스턴스 MobaXterm 접속

ssh -i my-key.pem ubuntu@10.40.109.0

우분투는 마운트 안되어있음


마운트를 하기위한 util가 없으면 설치해야하는데 인터넷이 안되면 설치가 안되어야 하는데 우분투는 여전히 마운트가 안되고 있다

wp01은 시간이 흐르면 명령이 실행이 되면서 EFS가 타입을 알고있기 떄문에 utils가 설치안되고 인터넷이 안되도 마운트가 된다

우분투 OS의 경우 인터넷이 되어야만 사용자 데이터 명령들이 설치가 되고 마운트가 된다

 

 

우분투 로그를 확인해보니 설치가 안되었다

cd /var/log

sudo cat cloud-init-output.log | grep nfs-common

우분투 서버에 수동으로 EFS를 설치하기

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-0f7cef32a03a9ac58.efs.ap-northeast-2.amazonaws.com:/ efs           // 마운트가 안된다.

// 우분투 서버는 nfs-common을 설치해야만 마운트 명령이 실행이 된다.(인터넷이 되어야한다) 지금 우분투 서버는 NGW를 삭제했기 때문에 인터넷 연결이 안되어 있다

정리

EFS도 프라이빗 서브넷에 위치한다.

EFS는 퍼블릭 접근이 안된다. 오로지 내부에서 EC2로 이용될 수 있다

라우팅 정보만 제대로 되어있고 인터넷이 되어있어야 EFS를 마운트할 수 있다(Amazon Linux는 인터넷 없어도 됨)

 

NGW도 라우팅 테이블을 통해 인터넷 게이트웨이를 거쳐서 외부로 나가게 된다.

NFW는 반드시 퍼블릭 서브넷에 위치시켜야한다.

 

6.

S3 (Simple Storage Service)

  • 확장성과 데이터 가용성 및 보안과 성능을 제공하는 객체 스토리지 서비스다.
  • HTTP API Restful 또는 S3:// 로 데이터를 업로드하고 다운로드할 수 있다
  • 즉, 어떤 규모 어떤 산업의 고객이든 이 서비스를 사용하여 정적 웹 사이트, 모바일 애플리케이션, 백업 및 복원, 아카이브,엔터프라이즈 애플리케이션, loT 디바이스, 빅데이터 분석 등과 같은 다양한 사용 사례에서 원하는 만큼의 데이터를 저장하고 보호할 수 있다.
  • Amazon S3는 사용하기 쉬운 관리 기능을 제공하므로 특정 비즈니스, 조직 및 규정 준수 요구 사항에 따라 데이터를 조직화하고 세부적인 액세스 제어를 구성할 수 있다.
  • S3는 붙특정 다수와 파일을 공유하기 위해 사용하기에는 비싸다

버킷 만들기

버킷 이름 'peach-seoul'

AWS 리전 '아시아 태평양(서울) ap-northeast-2'

'ACL 비활성화됨' 체크  // 외부에 내 데이터 접근을 완전 차단하는 옵션. 권한을 가진 사용자만 접근할 수 있다. 이 버킷의 모든 객체는 이 계정이 소유합니다. 이 버킷과 그 객체에 대한 액세스는 정책을 통해서만 지정됩니다

// 나중에 CloudFront서비스를 연동하기 위해 ACL를 활성화 할 것

'모든 퍼블릭 액세스 차단' 체크

버킷 버전 관리 '비활성화'    // 버전 관리란 롤백(복원)할 수 있는 옵션. 활성화해줘야함. 사진에는 '비활성화' 실수했다

AWS CLI도구

AWS CLI 도구를 설치해야함

AWS 공식 홈페이지에서 Windows용 AWS CLI MSI 설치 관리자(64비트)를 다운로드

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

 

최신 버전의 AWS CLI 설치 또는 업데이트 - AWS Command Line Interface

이전 버전에서 업데이트하는 경우 unzip 명령을 실행하면 기존 파일을 덮어쓸지 묻는 메시지가 표시됩니다. 스크립트 자동화와 같은 경우에 이러한 프롬프트를 건너뛰려면 unzip에 대한 -u 업데이

docs.aws.amazon.com

https://awscli.amazonaws.com/AWSCLIV2.msi 클릭하면 바로 다운로드된다

다운로드 파일 클릭

 

AWS CLI 설치 진행

 

윈도우에 AWS CLI가 잘 설치되었는지 확인하기

aws --verion

7.

기존에 있던 그룹과 사용자 삭제

 

IAM 에서 S3 권한 사용자 만들기

사용자 이름 's3-user'

권한 옵션 '직접 정책 연결'     // 관리형 정책을 사용자에게 직접 연결합니다. 사용자에게 연결하는 대신, 정책을 그룹에 연결한 후 사용자를 적절한 그룹에 추가하는 것이 좋습니다

권한 정책 - 's3 검색' - 'AmazonS3FullAccess' 선택

검토 및 생성 '사용자 생성'

 

키 만들기

'보안 자격 증명' - '액세스 키 만들기'

'Command Line Interface(CLI)' 선택

'권장 사항' 체크

액세스 키는 ID, 비밀 액세스 키는 비밀번호

'.csv 파일 다운로드' 클릭해서 ID 비밀번호가 액셀로 되어있는 csv 파일을 다운로드한다  // 키, 비밀번호를 외울 수 없어서 저장해놓는다. 이것은 절대 외부에 노출되면 안된다.

 

WIN cmd 창에 aws configure     // 키와 아이디를 물어본다

Default region name [None]: ap-northeast-2
Default output format [None]: json

aws s3 ls   // IAM 권한을 가진 사용자만 s3에 접근할 수 있다

지금 bastion host는 s3에 접근할 수 없다. 자격증명이 아직 안되어있기 때문

그런데 bastion host는 AWS CLI를 설치하지 않았는데 설치되어있다 aws 명령이 된다.

하지만 설치 버전이 구형 버전이다. 내가 설치한 것이 아닌 Amazon Linux 2 에 기본적으로 설치되어있다.

rabbit.jpg와 index.html 파일을 C:\Users\COM 경로에 넣어둔다

WIN cmd창에 dir을 쳐보면 C:\Users\COM 경로에 two-rabbit.jpg, index.html이 있다

index.html파일을 수정한다

cmd창에서 S3로 업로드하기

aws s3 ls    // peach-seoul이 뜨는데 버킷 이름이다

aws s3 cp index.html s3://peach-seoul   // 업로드 명령

aws s3 ls s3://peach-seoul   // 버킷 안에 파일 확인

aws s3 cp two-rabbit.jpg s3://s3://peach-seoul/images/    // images폴더가 없으면 images 폴더를 만들고 two-rabbit.jpg 파일을 넣어둔다

aws s3 ls s3://peach-seoul/images/     // two-rabbit.jpg 파일이 있다

 

S3에 폴더를 통째로 업로드해보기

aws s3 sync backup s3://peach-seoul/backup/   // 폴더와 폴더 안에 파일들이 전부 S3에 업로드된다

aws s3 ls s3://peach-seoul/backup/    // 파일이 잘 업로드되었다

8.

S3 파일 지워보기

aws s3 rm s3://peach-seoul/backup/food.tar    // 파일 삭제하기

 

aws s3 rm s3://peach-seoul/backup/    // 폴더 안에 파일이 있으면 폴더가 안지워진다

aws s3 rm s3://peach-seoul/backup/ --recursive   // recursive 명령을 추가해주면 안에 파일이 있어도 폴더가 삭제된다

 

bastion host 인스턴스에 IAM S3 역할 추가

cmd에 s3권한을 줄 때 액세스 키로 권한을 줬었다

EC2에 s3 권한을 줄 때 IAM 역할로 권한을 준다

신뢰할 수 있는 엔터티 유형 'AWS 서비스'

일반 사용 사례 'EC2'

권한 정책 's3' 검색 - 'AmazonS3FullAccess' 선택

역할 이름 's3-role'

bastion host에게 IAM 역할을 적용시키기

bastion host 우클릭 '보안' - 'IAM 역할 수정'

IAM 역할 's3-role' - 'IAM 역할 업데이트'

 

MobaXterm bastion host 세션에서 

aws s3 ls    // IAM 역할이 적용되었기 때문에 S3에 접근할 수 있다

 

aws s3 cp s3://peach-seoul/index.html ./      // bastion host 서버로 index.html을 다운로드

aws s3 cp s3://peach-seoul/images/two-rabbit.jpg ./    // images 폴더 안에 있는 rabbit.jps 파일 다운로드

 

마무리하기

버킷 삭제하기

'버전 표시' 토글을 on하면 삭제했던 파일을 복원할 수 있다

 

버킷을 삭제하려면 안에 있는 파일들을 전부 삭제해야한다. 

'비어있음' 클릭

IAM 사용자, 역할 지우기

라우팅 테이블 설정 지우기

NGW를 삭제해서 블랙홀로 바뀌었다

 

efs 삭제하기

RDS 중지하기

Route53 영역 삭제

인스턴스 지우기

bastion host 빼고 전부 종료(삭제)

bastion host는 중지(poweroff)

sns 삭제

구독을 먼저 지워야한다. 주제를 먼저 지우면 구독이 일주일 뒤에 지워진다