본문 바로가기

AWS

AWS 5. VPC, S3

1. VPC

Virtual Private Cloud. AWS에서 제공하는 클라우드 컴퓨팅 리소스를 사용할 수 있는 가상의 사설 네트워크로, IP 주소 범위, 라우팅 테이블, 서브넷 및 보안 그룹을 설정할 수 있다. Region마다 존재하며, 여러 AZ에 걸쳐 있을 수 있다. 가상 서버, 스토리지 및 데이터베이스와 같은 다양한 AWS 리소스를 만들고 관리할 수 있다.

2. 서브넷, 게이트웨이, NAT

  • 서브넷: IP 주소 범위를 지정하는 가상의 네트워크. 서브넷은 라우팅 테이블에 연결되며, 각 서브넷은 하나의 라우팅 테이블에만 연결될 수 있다. 서브넷을 사용하여 VPC 내에서 다른 서브넷과 격리된 가상 네트워크를 생성할 수 있으며 이를 통해 서비스가 요구하는 보안 요구 사항을 충족시키거나 성능을 향상시킬 수 있다.
    • 퍼블릭 서브넷은 인터넷 게이트웨이와 연결된 서브넷으로, 인터넷에 직접 연결되어 있는 서브넷이다. 퍼블릭 서브넷을 사용하면 인터넷에서 직접 액세스할 수 있는 인스턴스를 실행할 수 있다. 이러한 인스턴스는 공인 IP 주소를 사용하며, 인터넷 게이트웨이를 통해 인터넷으로 트래픽을 보낼 수 있다.
    • 프라이빗 서브넷(App Subnet, Data Subnet)은 인터넷과 직접 연결되지 않는 서브넷이다. 이러한 서브넷에서 실행되는 인스턴스는 인터넷에 직접 액세스할 수 없다. 대신, NAT 게이트웨이를 사용하여 인터넷을 통해 인스턴스에 연결하거나, VPC 피어링 등을 사용하여 다른 VPC와 연결할 수 있다.
  • VPC의 라우팅 테이블: VPC 내에서 트래픽이 전달되는 방법을 제어하는 데 사용한다. 라우팅 테이블은 서브넷과 연결되며, 각 서브넷에는 하나의 라우팅 테이블이 있어야 한다. 라우팅 테이블은 목적지 IP 주소와 목적지로 보내기 위해 거쳐야하는 게이트웨이 / NAT 게이트웨이와 같은 대상을 매핑한다. 라우팅 테이블은 여러 개의 라우팅 규칙을 포함할 수 있으며, 이를 사용하여 서브넷에서 트래픽을 전달하는 방법을 제어할 수 있다.
  • IGW (Internet Gateway): VPC와 인터넷 간의 통신을 가능하게 하는 게이트 웨이로, 외부에서 VPC 내부로 들어오는 트래픽을 받아 해당 VPC에 연결된 서브넷으로 라우팅한다. 즉 모든 인바운드/아웃바운드 트래픽의 논리적인 '관문'역할을 한다.
  • NAT (Network Address Translation) Gateway: 프라이빗 서브넷에서 아웃바운드 인터넷 트래픽을 가능하게 하는 서비스다. 프라이빗 서브넷 내 인스턴스가 인터넷으로 나가는 트래픽에 적힌 사설 IP를 공인 IP 주소로 바꿔주고, 인터넷 게이트웨이로부터 들어오는 트래픽을 프라이빗 서브넷으로 라우팅해준다.

* 게이트웨이: 한 네트워크에서 다른 네트워크로 이동하기 위하여 거쳐야 하는 지점

** DHCP와 NAT 차이: DHCP는 주어진 IP범위 안에서 각 사용자(기기)에게 IP를 동적으로 할당해준다. 이 IP는 NAT에 의해 번역되는 사설IP 일 수도, 공인IP 일 수도 있다. NAT는 사설IP를 공인 IP로 변환하는 역할만 한다.

3. S3: Simple Storage Service

S3는 구글클라우드나 네이버 클라우드 같은 클라우드 스토리지 서비스와 유사한 서비스이다. 개발자나 IT 운영자가 웹 규모 컴퓨팅 작업을 수행하는 데 필요한 데이터 저장 공간을 제공한다. 정적 웹 사이트 호스팅, 온라인 백업, 데이터 아카이브, 기업 애플리케이션, Big Data 분석 등 다양한 용도로 사용할 수 있다.

  • (정적)웹 사이트 호스팅
  • 멀티미디어 파일 저장 및 스트리밍
  • 애플리케이션 데이터 저장
  • 백업 및 복원
  • 아카이브

S3 서비스의 장점

  • 높은 내구성, 가용성 및 안정성
  • 손쉬운 사용 및 관리
  • 보안성
  • 높은 확장성

Buckets

S3에서 버킷이란 데이터를 저장하는 가장 상위 레벨의 폴더 형태의 컨테이너이다. S3에 저장되는 파일들을 ‘객체’ 라고 부르고 모든 객체는 ‘키’(디렉토리)로 식별된다. 식별 형태는 일반적인 PC에서의 디렉토리 구조와 유사하게 보인다.

s3://my-bucket/my_folder/my_file.txt

버킷은 다음과 같은 용도를 지닌다. 이또한 디렉토리와 유사하다.

  • 데이터를 저장하는 컨테이너 역할
  • 객체에 대한 공용 또는 개인적인 접근 권한을 설정하기 위한 위치
  • 객체에 대한 특별한 이벤트 알림을 설정하기 위한 위치
  • AWS 계정에서 버킷 및 객체 사용에 대한 비용 추적 및 모니터링을 위한 위치

S3 사용해보기

먼저 S3 버킷을 새로 생성한다. 이름을 지어줄 때, 이 이름은 모든 region에서 유일(globally unique) 해야한다.

버킷 네이밍 컨벤션

  • 대문자 금지, 언더스코어 금지
  • 버킷 이름은 3자(최소)에서 63자(최대) 사이여야 합니다.
  • 버킷 이름은 소문자, 숫자, 점(.) 및 하이픈(-)으로만 구성될 수 있습니다.
  • 버킷 이름은 문자 또는 숫자로 시작하고 끝나야 합니다.
  • 버킷 이름에 두 마침표를 나란히 붙여 사용하면 안 됩니다.
  • 버킷 이름은 IP 주소 형식(예: 192.168.5.4)을 사용하지 않습니다.

S3 서비스는 region 별로 나뉘어 제공되는 서비스 이지만, global 하게 내가 만든 버킷 콘솔창에서 region 상관없이 모두 볼 수 있다.

생성된 버킷을 확인할 수 있다. Delete의 경우 안에 어떠한 오브젝트도 남아있지 않아야 삭제할 수 있다.

버킷의 상세 정보를 볼 수 있다. upload를 통해 디렉토리나 파일을 업로드 할 수 있다.

이미지 파일을 하나 올린 후 object url을 통해 이미지 파일을 조회하면 아래와 같이 조회되지 않는다.

하지만 open을 누르면 이미지가 조회가 되는데, URL이 꽤 차이가 나는 것을 알 수 있다.

 

이는 버킷을 만들 당시 public 접근을 막았고, open 시에는 S3에서 미리 만들어진 pre-signed URL을 통해 일시적으로 조회 권한이 부여되어 조회가능한 것이다.

버킷 폴리시

IAM과 유사한 JSON 형식의 문서로 버킷의 모든 객체에 대한 접속을 제어할 수 있다. 특정 객체나 객체그룹에 대한 엑세스를 제어하거나, 허용 IP 범위, 엑세스 할 수 있는 리소스 범위 제한 등이 가능하다. 암호화된 연결을 사용하도록 강제할 수도 있다.

  • Resource : 버킷 혹은 오브젝트
  • Effect: Allow 혹은 Deny
  • Principal : 대상 유저

예시


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUserToGetBucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT-ID:user/USERNAME"
            },
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::BUCKET-NAME"
        }
    ]
}

IAM 사용자 "USERNAME"이 GetBucketLocation 작업을 수행할 수 있도록 버킷 "BUCKET-NAME"에 대한 액세스를 허용하고 있다.

ARN

AWS에서 사용하는 고유한 식별자로 AWS의 모든 리소스에 대한 고유한 식별자 역할을 한다.

//형식:
// arn:partition(aws):서비스명:region:account-id:resource-id
// arn:partition(aws):서비스명:region:account-id:resource-type/resource-id
// arn:partition(aws):서비스명:region:account-id:resource-type:resource-id

// 예시:
arn:aws:iam::123456789012:user/johndoe
arn:aws:s3:::my_corporate_bucket/
arn:aws:ec2:us-east-1:123456789012:vpc/vpc-0e9801d129EXAMPLE
  • arn: AWS 리소스 이름을 가리키는 고정 문자열
  • aws: 리소스가 AWS에서 호스팅되는 것을 나타내는 고정 문자열
  • service: AWS 서비스 이름 ( s3, lambda, ec2 ...)
  • region: AWS 리전 이름을 나타내는 문자열 (us-east-1, ap-northeast-2 ...)
  • account-id: AWS 계정 ID를 나타내는 숫자
  • resource-id: 해당 리소스의 고유 식별자 (S3 버킷 이름 등)

버킷 폴리시 적용해보기

먼저 public access는 허용해 준다. 이것을 막아주면 폴리시도 작동하지 않는다.

policy generator를 이용해 폴리시를 작성할 수 있다. Select Type of Policy를 S3로 선택하고 사용자(principal)는 모두를 허용한다.(*) 원하는 actions을 선택해서 허용할 수 있는데, 조회를 허용할 경우 GetObject를 허용하면 된다. arn은 버킷의 property에서 확인할 수 있다.

생성된 policy를 복사해서 붙여놓고 적용한다. 이때 Resource는 bucket 내부의 모든 오브젝트에 폴리시를 적용해야하므로, '/*' 를 붙여준다.


폴리시가 적용된 뒤에는 object URL로도 잘 조회되는 것을 볼 수 있다.

S3로 정적 웹사이트 배포하기

index.html파일을 만들어 버킷의 루트 디렉토리에 업로드한다.

이후 property의 가장 아래에 있는 Static website hosting를 편집한다.

Static website hosting을 enable로 하고, index document는 반드시 index.html을 지정한다.

저장하면 위와같이 Bucket website endpoint가 생기는걸 볼 수 있다. 접속해서 잘 배포 되었는지 확인할 수 있다.

S3로 배포한 정적 웹사이트에 도메인 달아주기

  • 주의 사항: 반드시 버킷 이름과 도메인 이름이 같아야 함
    따라서 도메인 이름에 맞춰서 버킷을 새로 만든 뒤 위의 과정을 반복해 웹사이트를 배포하게 만들고 진행한다.

이후 route 53에서 위와같이 alias로 레코드를 생성한다.

이름이 같으면, 자동으로 연결할 버킷을 찾아준다. 반드시 이름이 같아야한다.

이제 지정된 도메인으로 접속해서 도메인이 잘 지정되었는지 확인한다.
HTTPS는 적용되지 않은 것을 알 수 있는데, HTTPS를 적용하기 위해선 다음에 배울 cloud front를 사용해야한다.

레퍼런스

https://wedul.site/205

 

NAT와 DHCP설명 및 차이점

NAT : Network address translation(네트웍 주소 변환) IPv4에서는 IP주소가 부족하고 보안상에 몇가지 문제가 있어서, 점점 더 많은 네트웍에서 인터넷에서 사용할 수 없는 사설 IP(10.0.0.0/255.0.0.0, 172.16.0.0/25

wedul.site

 

'AWS' 카테고리의 다른 글

AWS 7. Elastic BeanStalk  (0) 2023.05.09
AWS 6. Cloud Front  (0) 2023.05.06
AWS 4. DNS, route53  (0) 2023.05.04
AWS 3. RDS  (0) 2023.05.03
AWS 2. 확장성/가용성, ELB  (0) 2023.05.03