컴퓨터/AWS

AWS - S3(Simple Storage Service)

Ko12334 2024. 6. 24. 00:52

 


 

1. 객체 스토리지와 S3

 

 AWS S3(Simple Storage Service)는 AWS에서 제공하는 객체 스토리지로 99.999999999%의 내구성과 확장성, 가용성, 보안의 성능을 갖춘 것입니다.

 

 여기서 객체란 파일(사진, 문서, 동영상 등)과 그 파일에 대한 메타데이터(설명, 속성 등)를 포함하는 독립된 데이터 단위를 말합니다.

 S3는 객체 저장 서비스로, 데이터는 객체 형태로 저장됩니다. 블락 스토리지(EBS)나 파일 스토리지(EFS)와 달리 S3는 실제 폴더 구조를 지원하지 않지만, 폴더처럼 보이도록 키 값을 설정할 수 있습니다. 즉, S3에서 폴더를 생성하면 실제로는 해당 폴더명과 함께 객체의 키값에 포함되어 저장됩니다. 이 덕분에 데이터의 계층 구조를 표현할 수 있지만, 물리적으로는 모든 객체가 평면적으로 저장되는 방식입니다.

 

 객체 스토리지는 대량 데이터 관리에 효과적인 방법으로, 파일 단위로 데이터를 저장하고 고유 식별자와 메타데이터를 통해 관리됩니다. 구글 드라이브와 같은 클라우드 스토리지도 객체 스토리지이며 대용량 파일을 효율적으로 관리합니다.

 

 

1) AWS S3 특징

 

- 글로벌 서비스와 데이터 저장

- 글로벌 서비스: AWS S3는 전 세계적으로 제공되는 글로벌 서비스입니다.

- 리전에 저장: 데이터는 지정된 리전에 저장되어 지역적인 법규 및 데이터를 준수합니다.

 

- 무제한에 가까운 용량

- 객체 크기: 하나의 객체는 0바이트부터 최대 5TB까지 저장 가능합니다.

- 확장성: 사실상 무제한 용량을 제공하여 대규모 저장소로 적합합니다.

 

- 버킷 (Bucket)

- 저장공간 구분 단위: 버킷은 S3의 저장공간을 구분하는 단위로, 폴더와 유사한 개념입니다.

- 고유성: 버킷 이름은 전 세계에서 유일해야 하며, 중복된 이름을 사용할 수 없습니다.

 

- 객체 구성 요소

객체는 다음과 같은 요소로 구성됩니다:

1. 소유자(Owner): 객체의 소유자를 나타냅니다.

2. Key: 객체의 이름입니다.

3. Value: 파일의 실제 데이터입니다.

4. Version ID: 객체의 버전을 구분합니다.

5. 메타데이터: 파일의 추가 정보를 담습니다.

6. ACL(Access Control List): 객체의 접근 권한을 설정합니다.

 

- 내구성 및 가용성

- 내구성: 최소 3개의 가용 영역(AZ)에 데이터를 분산 저장하여 높은 내구성을 제공합니다.

- 99.99% SLA 가용성: 스토리지 클래스에 따라 다르지만, 파일을 안정적으로 접근할 수 있는 가용성을 보장합니다.

 

- 보안 설정

- 기본 비공개: 모든 새로 생성된 버킷은 기본적으로 비공개로 설정됩니다. 필요한 경우 공개 설정할 수 있습니다.

- Bucket Policy: 버킷 단위로 보안 정책을 설정합니다.

- ACL(Access Control List): 객체 단위로 접근 권한을 설정합니다. 다만, 최근에는 주로 버킷 정책을 사용합니다.

- MFA(다중 팩터 인증): 객체 삭제 방지 기능을 제공합니다.

- 버전 관리: 파일 버전 관리로 복구 가능성을 높입니다.

- 액세스 로그: 액세스 로깅을 하여 접근 기록을 생성하고 전송할 수 있습니다.

 

2) 실습

 

EC2에서 S3에 저장되어 있는 파일을 하나 받아오는 과정을 해보겠습니다.

 

- 버킷 생성

1. s3 서비스에서 버킷을 만듭니다.

 

2. 버킷 이름은 전 세계에서 고유값이어야 합니다.

 

3. 기본 설정인 모든 퍼블릭 액세스 차단을 합니다.

 

4. 해당 버킷에 업로드할 파일을 올립니다.

 

 

 

- 버킷에 접근하는 IAM 생성

 

1. IAM 서비스에서 역할을 생성하고 IAM을 적용할 서비스인 EC2를 선택합니다.

 

2. S3 접근에 관한 정책을 선택합니다.

 

 

- EC2 생성

 

1. EC2 고급 세부정보, IAM 옵션에서 방금 만든 IAM으로 설정합니다. 이로써 S3에 접근할 수 있는 권한이 생깁니다.

 

2. EC2 생성 후 실행시킬 명령어를 입력 합니다.

 

#!/bin/bash
yum install httpd php -y
aws s3 cp s3://{bucket_name}/index.php /var/www/html  --region ap-northeast-2
systemctl restart httpd

bash 명령어로, bucket_name에 생성한 버킷의 이름을 입력합니다.

그러면 해당 ec2의 퍼블릭 IP로 접근하면 index.php를 반환합니다.

EC2가 S3로부터 index.php를 받았다는 것을 확인 할 수 있습니다.

 

2. S3 스토리지 클래스

 S3는 사용목적에 따라 다양한 클래스(종류)를 제공합니다. 따라서 저장하려는 목적과 비용을 고려하여 S3클래스를 선택합니다. S3 클래스의 종류에는 8가지가 있습니다. 

 

1) S3 Standard

사용 목적은 자주 접근해야 하는 데이터를 위한 기본 스토리지 클래스입니다.

 

가용성: 99.99%, 내구성: 99.9999999999% (11 9s)을 보장합니다.최소 3개의 가용 영역(AZ)에 데이터가 분산 저장됩니다.

 

파일 요청 비용은 없습니다.(전송 요금은 발생) 비용은 약 0.025$/GB입니다.

 

사용 사례는 다음과 같습니다.

- 자주 업데이트되는 웹 애플리케이션 데이터

- 실시간 데이터 처리

- 빈번히 액세스되는 콘텐츠(예: 동영상 스트리밍, 이미지 호스팅)

 

2) S3 Standard-IA (Infrequently Accessed)

 S3 Standard-IA는 자주 접근하지 않는 데이터를 저렴한 비용으로 저장할 수 있는 스토리지 클래스입니다.

 

 최소 3개의 가용 영역(AZ)으로 데이터를 분산 저장하는 높은 내구성을 제공합니다. 데이터 요청 시 추가 비용이 발생하며, 최소 저장 용량은 128KB, 최소 보관 기간은 30일입니다.

 

 S3 Standard-IA는 적은 비용으로 상대적으로 빈번하게 접근하지 않는 데이터를 저장하는데 최적화되어 있습니다. 예를 들어, 백업 데이터나 장기 보관해야 하지만 자주 접근하지 않는 데이터에 이상적입니다.

 

사용 사례는 다음과 같습니다.

- 자주 접근하지 않는 백업 데이터

- 월간 보고서나 비디오 아카이브와 같은 장기 보관 데이터

 

3) S3 One Zone-IA

 S3 One Zone-IA는 자주 접근하지 않지만 빠르게 복구할 필요가 있는 데이터를 저렴하게 보관할 수 있는 스토리지 클래스입니다.

 

 1개의 가용 영역(AZ)에만 데이터를 저장합니다. 따라서 내구성 측면에서는 다소 손해일 수 있지만, 비용 절감에 매우 유용합니다.

 

사용 사례

- 상대적으로 복원 시간이 덜 중요한 데이터

- 비용 효율적인 백업 솔루션

 

4) S3 Glacier Instant Retrieval

 S3 Glacier Instant Retrieval은 즉시 접근이 가능한 장기 아카이브 데이터를 보관하는데 적합합니다. 아카이브란 자주 접근하지 않지만 장기간 보관이 필요한 데이터를 저비용으로 안전하게 저장하는 저장소입니다.

 

 최소 저장 용량은 128KB, 최소 보관 기간은 90일입니다. 이 클래스는 매우 낮은 저장 비용을 제공하며, 즉각 액세스가 가능해 빠르게 접근해야 하는 법적 문서나 중요한 의료 이미지 데이터 등에 이상적입니다.

 

사용 사례

- 빠르게 접근해야 하는 법적 문서

- 중요한 의료 이미지 데이터

- 오래된 뉴스 아카이브

 

5) S3 Glacier Flexible Retrieval

 S3 Glacier Flexible Retrieval은 비용 효율적인 장기 아카이브 데이터 보관을 위한 스토리지 클래스입니다.

 

 최소 저장 용량은 40KB, 최소 보관 기간은 90일입니다. 요청 후 몇 분에서 몇 시간 내에 데이터를 접근할 수 있으며, 매우 낮은 저장 비용을 제공합니다.

 

사용 사례

- 장애 복구 목적의 데이터

- 시스템 백업 데이터

 

6) S3 Glacier Deep Archive

 S3 Glacier Deep Archive는 거의 접근하지 않는 데이터를 저렴하게 보관할 수 있는 스토리지 클래스입니다.

 

 최소 저장 용량은 40KB, 최소 보관 기간은 180일입니다. 데이터를 요청하면 12~48시간 내에 접근할 수 있고, 가장 낮은 비용을 제공합니다.

 

사용 사례

- 법적 기록 보관

- 장기 보관 문서 저장

- 규제 요구 사항에 따른 데이터 아카이빙

 

7) S3 Intelligent-Tiering

S3 Intelligent-Tiering은 예측 불가능한 접근 패턴을 가진 데이터를 관리하는데 최적화된 스토리지 클래스입니다. 머신러닝을 통해 사용 패턴을 분석하고, 적절한 스토리지 클래스로 자동 전환하여 비용을 최적화합니다.

사용 사례

- 접근 패턴이 불규칙한 데이터

- 응답 시간을 유지하면서 비용 절감을 원하는 데이터

 

8) S3 on Outposts

 S3 on Outposts는 온프레미스 환경에서 AWS S3를 사용하고자 할 때 적합한 스토리지 클래스입니다. AWS Outposts를 통해 동일한 S3 API와 기능을 제공하며, 데이터 로컬리티 요건을 충족할 수 있습니다.

 

사용 사례

- 데이터 레지던시 요구사항을 충족해야 하는 산업

- 로컬 데이터 센터 통합

 

3. 보안

S3에서 보안(접근 컨트롤)은 2가지 방식으로 관리할 수 있습니다.

 

1) 자격 증명 기반 정책

 

 

 

 자격 증명 기반 정책은 특정 사람이 어떤 작업을 할 수 있는지를 정의합니다. 마치 특정 인증서를 가진 사람만이 특정 작업을 할 수 있도록 허용하는 접근 제어와 유사합니다.

 

 IAM을 사용하여 EC2 인스턴스에 접근 권한을 설정하면, 특정 EC2 인스턴스는 특정 IAM 역할을 통해 S3 버킷에 접근할 수 있게 됩니다.

# IAM AmazonS3FullAccess 정책
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "s3-object-lambda:*"
            ],
            "Resource": "*"
        }
    ]
}

 위에서 했던 실습처럼 EC2에 적용한 IAM의 역할은 'AmazonS3FullAccess' 라는 정책이 포함되어 있으며, 이 정책은 모든 S3 버킷의 객체에 모든 것을 하는 권한을 부여합니다.

 

- Statement: 여러 정책을 기술할 수 있습니다. 각 정책은 JSON 객체 형태로 기술됩니다.

 

- Effect: 이 필드는 정책의 효과를 나타냅니다. "Allow"는 허용을, "Deny"는 거부를 의미합니다. 이 예제에서는 특정 작업을 허용하겠다는 의미입니다.

 

- Action:이 필드는 권한을 부여하려는 특정 작업을 명시합니다. "s3:*"는 모든 S3 작업을 의미합니다. Action에 대한 상세한 권한 내용들은 공식문서에 있습니다.

https://docs.aws.amazon.com/AmazonS3/latest/API/API_Operations.html

 

Actions - Amazon Simple Storage Service

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com

(몇 가지 예시로, "s3:GetObject"는 S3 버킷 내의 객체 읽기 권한, "s3:ListBucket"는 S3 버킷 내의 객체 목록을 가져옵니다.)

 

- Resource: 이 필드는 정책이 적용되는 리소스를 정의합니다. "*"는 모든 리소스를 의미합니다. 특정 S3 버킷을 지정할 수 있습니다.

 

2) 리소스 기반 정책

 

 

 리소스 기반 정책은 특정 리소스 자체에 접근 권한을 설정합니다. 즉, 누가 무엇을 할 수 있는지를 리소스에 직접 부여하는 접근 제어 방식입니다.

 

1) 버킷 정책 

 

버킷 정책은 버킷 단위로 접근을 컨트롤 하는 것을 말합니다.

JSON 형식의 정책 문서로, S3 버킷에 대한 세밀한 접근 제어를 설정할 수 있습니다.

 

 기본적으로 모든 버킷은 비공개입니다. 따라서 버킷 정챗을 사용하려면 "버킷의 개별 퍼블릭 액세스 차단 설정" 을 해제해야 합니다.

 

 

편집할 버킷에 들어가면 해당 버킷 정책을 편집할 수 있습니다.

 

 

편집 메뉴에서 해당 json형식의 문서를 작성하면 됩니다.

{
  "Id": "Policy1720088746847",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1720088743279",
      "Action": "s3:GetObject",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::1321313131dadsdad/*",
      "Principal": "*"
    }
  ]
}

 

Action, Effect, Resource, Principal은 IAM정책 설명과 같습니다.

Principal은 해당 정책이 적용되는 AWS 사용자, 역할, 계정 또는 기타 엔티티를 지정하는 요소입니다. 위 설정에서는 모든 소스에서 허용함을 의미합니다.

 

 이 외에도 ACL(Access Controll List)를 통해 버킷 단위가 아닌 객체 단위로 권한 설정을 할 수 있습니다. 하지만 AWS는 일관되고 안전한 접근 제어를 위해 ACL은 사용하지 않는 것을 권장합니다.(https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/about-object-ownership.html)

 

4. 암호화

 AWS S3 암호화는 버킷에 저장하는 객체를 암호화 하는 것을 의미합니다. 이를 통해 데이터를 보호하고 보안 수준을 높일 수 있습니다.

 

 

 

암호화는

1. 데이터 전송 중 암호화(In Transit)

2. 저장 시 암호화(At Rest)

라는 두 가지 암호화 방식이 있습니다.  

 

1) 데이터 전송 중 암호화 (Encryption in Transit)

 

- HTTPS 프로토콜 사용(SSL/TLS 방식)

 

 데이터가 클라이언트와 S3 버킷 사이를 이동할 때 데이터의 기밀성과 무결성을 보장하기 위해 SSL/TLS 암호화를 사용합니다. 이로써 전송 중 데이터가 제3자에 의해 가로채지거나 수정되는 것을 방지할 수 있습니다.

 

 데이터가 전송되는 동안, 클라이언트는 HTTPS를 통해 S3와 통신합니다. HTTPS는 SSL/TLS를 사용하여 데이터를 암호화합니다.

 

2) 저장 시 암호화 (Encryption at Rest)

 

 저장 시 암호화는 데이터를 저장하는 동안 암호화하여 물리적 저장 매체에 접근하는 불법적인 시도로부터 데이터를 보호합니다. AWS S3는 주로 세 가지 방식의 서버 측 암호화(서버 사이드 암호화) 옵션을 제공합니다.

 

- SSE-S3 (Server-Side Encryption with S3 Managed Keys)

 이 방식은 S3가 자체적으로 데이터를 암호화하고 복호화하는 키를 관리합니다. 사용자는 별도로 키 관리를 신경 쓸 필요가 없으며, AWS가 모든 키 관리를 맡습니다.

 

- SSE-KMS (Server-Side Encryption with AWS KMS Managed Keys)

 AWS KMS(Key Management Service)를 사용하여 키를 관리합니다. AWS KMS를 사용하면 더 나은 통제와 관리형 정책을 설정할 수 있으며, 일정한 권한 설정을 통해 접근을 제한할 수 있습니다.

 

- 정교한 키 관리: 사용자 정의 키 정책과 IAM 정책을 통해 접근 권한을 세밀하게 제어할 수 있습니다.

- Audit Logging: AWS CloudTrail을 통해 누가, 언제 키에 접근했는지에 대한 감사 로그를 남깁니다.

 

- SSE-C (Server-Side Encryption with Customer Provided Keys)

 고객이 직접 관리하는 키로 데이터를 암호화합니다. 고객은 각 요청마다 암호화 키를 제공해야 하며, AWS는 이 키를 이용하여 데이터를 암호화하고 복호화합니다.

 

- 고객이 키 관리: 고객이 자체적으로 암호화 키를 관리하고 제공해야 합니다.

 

5. S3 버전관리 및 객체 잠금 기능

 AWS S3 버전 관리는 객체의 모든 변경 내역을 추적하고, 객체 잠금 기능은 객체의 예기치 않은 수정 및 삭제로부터 보호할 수 있도록 해줍니다. 

 

1) S3 버전 관리 (Versioning)

 AWS S3 버전 관리는 객체의 생성, 업데이트, 삭제의 모든 단계를 저장할 수 있는 기능입니다. 이를 통해 특정 시점의 객체 상태를 복원하거나 삭제된 객체를 복구할 수 있습니다. 버전 관리 기능은 버킷 단위로 활성화할 필요가 있으며, 한 번 활성화하면 다시 비활성화할 수는 없지만 중지할 수는 있습니다.

 

- 버전 관리 활성화

 

 버전 관리는 S3 버킷에 대해 활성화할 수 있으며, 활성화하면 객체가 생성 또는 업데이트될 때마다 새로운 버전 ID가 할당됩니다. 삭제 시에는 실제 객체가 삭제되지 않고 삭제 마커가 추가되어 이전 버전을 복원할 수 있는 기능을 제공합니다.

 

 

 

- 버전 표시를 활성화하면 같은 객체에 버전ID가 있습니다.

 

- 버전 관리의 주요 특징

- 객체 추적: 객체가 생성, 업데이트, 삭제되는 모든 단계를 추적할 수 있습니다.

- 복원 가능: 삭제된 객체를 복원하거나 이전 버전으로 되돌릴 수 있습니다.

- 비용: 각 버전마다 비용이 청구됩니다. 예를 들어, 10GB의 객체 버전이 3개라면 30GB에 대한 요금이 청구됩니다.

- MFA 삭제: 보안을 한층 강화하기 위해 다중 요소 인증(MFA)을 요구하여 중요한 객체의 삭제를 방지할 수 있습니다.

 

- 객체 업데이트

같은 객체마다 다른 버전 ID

 

- 객체 삭제

 

객체를 삭제해도 실제로 삭제하지 않고 삭제 마커를 남깁니다. 해당 삭제 마커를 제거하면 파일을 복원할 수 있습니다.

 

2) S3 객체 잠금 (Object Lock)

 

 AWS S3 객체 잠금(Object Lock)은 데이터의 무간섭 보관(WORM: Write Once, Read Many) 기능을 제공하여 객체를 한 번 작성한 후 수정하지 못하게 보호합니다. 객체 잠금 기능을 사용하면 특정 시간 동안 또는 무기한으로 객체가 삭제되거나 덮어쓰이지 않도록 합니다. 객체 잠금을 사용하려면 버전 관리가 활성화되어 있어야 합니다.

 

- 보관 모드

 보관 모드는 객체를 특정 기간 동안 보호하여 해당 기간 동안 수정을 방지하는 설정입니다. 보관 모드는 다시 두 가지로 나뉩니다

 

1. 규정 준수 모드: 누구도 잠금 설정을 변경하거나 객체를 삭제할 수 없습니다.(root 계정도 변경/삭제 불가능)

2. 거버넌스 모드:  특별한 권한이 없는 사용자는 객체를 삭제하거나 잠금 설정을 변경할 수 없습니다.

 

- 법적 보존(Hold)

- 객체에 법적 보존 설정을 부여하면, 법적 보존을 해제하기 전까지 객체가 삭제되거나 수정될 수 없습니다. 보관모드와 달리 제한 기간은 없습니다.

 

6. S3 정적 호스팅(Static Hosting)

 

 AWS S3를 사용하여 정적 웹사이트를 호스팅하는 것은 서버리스 환경에서 높은 가용성과 내구성을 제공하며, 손쉽게 확장이 가능한 접근 방식입니다. 

 

1) AWS S3를 사용한 정적 웹사이트 호스팅

 

 정적 웹사이트 호스팅은 NGINX 같은 별도의 서버 없이, HTML, CSS, JavaScript 및 이미지 파일 등의 정적 콘텐츠를 제공하는 것입니다. AWS S3는 이를 위한 고가용성과 내구성을 제공하여 웹사이트가 지속적으로 운영되도록 보장합니다.

 

- 버킷 속성 설정에서 정적 웹사이트 호스팅을 활성화 합니다.

 

-  버킷 정책 실습을 위해 모두 접근할 수 있게 설정합니다.

 

- 버킷에 index.html을 업로드 합니다.

 

 

- 버킷 웹사이트 엔드포인트에 접속하면 index.html을 받을 수 있습니다.

 

2) Route53 과 연동

 

 Amazon Route 53은 AWS에서 제공하는 확장 가능하고, 고가용성의 DNS(Domain Name System) 웹 서비스로, 도메인 이름 등록, DNS 라우팅, 및 상태 확인 기능을 제공합니다.

 

이를 이용하여 긴 버킷 엔드포인트 주소를 짧게 변경할 수 있습니다. 단, 사용하고자 하는 도메인 이름은 버킷이름과 같아야 합니다. 예를 들어, `www.test.com`이라는 도메인으로 호스팅하려면 버킷 이름도 `www.test.com`이어야 합니다.

 

- 라우트53에 등록된 호스팅 영역에 들어가서 레코드를 생성합니다. 이때 도메인이름과 버킷이름이 일치해야 S3 엔드포인트가 조회됩니다.

 

- 설정을 저장하면 기존보다 짧은 도메인이름으로 접속해서 index.html을 받을 수 있습니다.

 

여기까지 s3, Route53을 이용한 http를 이용한 정적 웹호스팅이었습니다.

반응형