AWS #2 / TIL

S3 / RDS

Featured image

S3(Simple Storage Service)

AWS에서 제공하는 *클라우드 스토리지 서비스이다.
S3는 리전 위에 위치한 가용 영역(AZ)이 개별적 위치에 떨어져 존재하기 때문에, 한 곳의 AZ에서 가동이 불가 해져도 다른 가용 영역에서 백업 해 놓은 데이터를 활용해 문제 없이 서버가 가동된다. 따라서, AWS에서 제공하는 서비스들은 다음과 같은 이점들이 발생한다.

클라우드 스토리지

인터넷 공간에 데이터를 저장하는 저장소
뛰어난 접근성을 가지고 있어 장소에 구애받지 않고 언제든 저장된 파일에 접근할 수 있다.

이 외에도 S3 사용 시 정적 웹 사이트 호스팅이 가능하다는 이점이 있다. *버킷이 사용자들이 정적 웹 사이트를 배포할 수 있는 공간을 제공한다. 버킷에 정적 파일을 업로드하고, 버킷을 정적 웹 사이트 호스팅 용도로 구성하면 정적 웹 사이트를 배포할 수 있다.


버킷

객체를 저장하는 컨테이너 역할을 하는 최상위 디렉토리.

객체

버킷에 저장된 모든 것. S3에서 저장소에 데이터를 저장할 때 키-값 페어 형식으로 데이터를 저장하기 때문에 객체라고 부른다.


대표적인 스토리지 클래스

S3는 다양한 스토리지 클래스를 제공한다.


접근성 통제

S3 버킷에 누가 어떻게 접근하도록 할 것인지 정의하는 것. 주로 JSON을 이용해 작성된 정책을 통해 이루어지며, 접근 정책, 버킷 정책, 접근 제어 목록 등의 방식을 사용한다.

정책을 만드는 JSON 파일의 구조

하나의 Statement에는 하나의 permission 정보가 포함된다. 정책에 포함된 다수의 statement는 논리합(Logical OR) 관계를 맺는다.

접근 정책 (Identity-based policies)

IAM(신분 및 접근 관리 정책)으로 S3의 객체를 매우 세분화해 통제할 수 있다.

다음 예시를 보면서 알아보자. AWS 계정의 IAM 사용자에게 버킷 중 하나인 awxexamplebucket1에 대한 액세스 권한을 부여하고 이 사용자에게 객체를 추가, 업데이트, 삭제하도록 허용하려 한다.

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Effect":"Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource":"*"
    },
    {
      "Effect":"Allow",
      "Action":["s3:ListBucket","s3:GetBucketLocation"],
      "Resource":"arn:aws:s3:::awsexamplebucket1"
    },
    {
      "Effect":"Allow",
      "Action":[
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:GetObjectAcl",
        "s3:DeleteObject"
      ],
      "Resource":"arn:aws:s3:::awsexamplebucket1/*"
    }
  ]
} 

위 예시에서는 하나의 정책에 총 3개의 statement가 삽입되었다. 이렇게 작성된 정책을 그룹, 유저 등에 할당하여 사용할 수 있다.

  1. s3:PutObject, s3:GetObject, s3:DeleteObject 권한을 사용자에게 부여한다.
  2. s3:ListAllMyBucket, s3:GetBucketLocation, s3:ListBucket 권한을 사용자에게 부여한다. (콘솔에 필요한 추가 권한)
  3. s3:PubObjectAcl, s3:GetObjectAcl 작업을 하여, 콘솔에서 객체를 복사, 자르기, 붙여넣기를 할 수 있게 하였다.


버킷 정책 (Resource-based policies)

S3 버킷을 세분화된 방식으로 제어할 수 있도록 하는 버킷 레벨에서 생성한 정책을 의미한다.

대표적 버킷 정책 사례는 특정 버킷에 있는 객체에 대한 익명의 사용자로부터 리드 온리 접근을 허용하는 케이스이다. 이는 S3 리소스 기반의 정적 웹 사이트를 운영하거나, 웹을 통해 불특정 다수의 접근을 허용할 때 자주 사용되는 방법으로, 버킷에 GetObject 액세스 권한을 부여하면 된다.

다음 devopscodestates를 위한 S3 버킷 정책의 예시를 통해 알아보자.

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicRead",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::devopscodestates/*"]
    }
  ]
}

devopscodestates 버킷의 모든 리소스를 GetObject 작업으로 누구나 접근(“*“)할 수 있음을 Principal 필드의 값을 통해 확인할 수 있다.

S3의 보안 Best Practice

» S3 스토리지 클래스 레퍼런스 «


EBS (Elastic Block Store)


EC2 인스턴스에 사용할 수 있는 블록 수준 영구 스토리지 볼륨. 영구 스토리지는 EC2 인스턴스의 수명 주기를 넘어서서 존재할 수 있는 스토리지를 의미한다.

EBS는 볼륨에 대한 특정 시점의 스냅샷을 지속적으로 작성해 S3에 저장하는 방식으로 다수의 AZ에서 자동 복제 기능을 제공한다. 이를 통해 생성된 스냅샷은 또 다른 EBS 볼륨 생성을 위한 시작점으로 활용될 수 있으며, 장기간 서버와 관련된 데이터를 안전하게 보호할 수 있다. 이 스냅샷은 리전 간 복제해서 사용할 수도 있으므로, 재난 복구, 데이터 센터 마이그레이션 등에도 편리하게 사용할 수 있다.

EBS 볼륨


EFS (Elastic File System)


서버를 사용하지 않는 간단하고 탄력적인 파일 시스템을 빠르고 쉽게 구성할 수 있는 간편 웹 서비스 인터페이스를 제공하고, EC2 인스턴스에 파일 시스템을 탑재한 후 파일 시스템에 데이터를 작성하거나 파일 시스템에서 데이터를 읽을 수 있다.

이 서비스에서 모든 파일 스토리지 인프라를 관리해주므로, 사용자는 복잡한 파일 시스템 구성을 배포, 패치, 및 유지보수 하는데 따르는 복잡성에서 벗어날 수 있다.

애플리케이션을 중단하지 않고 온디맨드 방식으로 페타바이트 규모까지 확장되도록 구축되어, 사용자가 파일을 추가하고 제거할 때 자동으로 확장/축소되므로 데이터 증가에 맞춰 용량을 *프로비저닝 및 관리할 필요가 없다.


RDS (Relational Database Service)


AWS에서 제공하는 관계형 데이터베이스 서비스.
EC2 인스턴스에 DB를 설치하여 데이터를 관리하게 되면 유지 보수, 보험처리 같은 일들을 온전히 사용자가 부담한다. 가용성과 내구성도 확보되지 않아 저장된 데이터가 유실되거나 정상적으로 사용하지 못할 확률이 커지며, 필요에 따라 DB 규모 확장이 어렵다. 또한 직접 DB 엔진을 설치/관리 해야하고, 사용자가 일일이 데이터를 백업해야 한다.

하지만 RDB를 설치하게 되면, AWS가 DB 규모확장, 백업, 설치, 시설 구축 등을 자동 관리해주고 가용성과 내구성이 확보된다. 사용자가 해야할 일은 초기 설정을 제외하고 DB에 저장된 데이터를 관리하는 일 밖에 없다.


단어 정리

*정적 파일 : 서버의 개입 없이 클라이언트에 제공될 수 있는 파일
*웹 호스팅 : 서버의 한 공간을 빌려주어 웹 사이트의 배포, 운영이 가능하게 만들어주는 서비스
*프로비저닝 : 컴퓨터 시스템이나 네트워크에 필요한 자원, 서비스, 애플리케이션 등을 사전에 설정하거나 준비하는 과정
*DBMS : 데이터 저장, 조직화, 인출과 관련된 제반 업무를 관장하는 소프트웨어. RDB는 열과 행으로 이루어진 테이블에 저장되고, 테이블에 저장된 데이터는 공통 키 또는 컨셉에 따라 서로 관계를 유지하며, 테이블에서 데이터를 인출할 때 이와 같은 관계성을 이용한다는 측면에서 관계형 데이터베이스라는 이름이 붙었다.