[AWS] S3 - Simple Storage Service
말 그대로 AWS에서 제공하는 저장소
EBS는 EC2 인스턴스에 붙어서 로컬 디스크처럼 사용되는 블록 스토리지이고, S3는 버킷 구조를 사용하는 객체의 클라우드 스토리지이다.
EBS는 디스크 S3는 클라우드 저장소라고 생각하자. S3는 데이터를 거의 무제한으로 저장할 수 있다.
버킷 (Bucket)
S3에서 데이터를 저장하는 컨테이너 역할을 수행한다.
AWS 계정으로 여러 버킷을 생성할 수 있고, 이 때 생성하는 버킷의 이름은 고유값이다.
객체 (Object)
S3에 저장되는 데이터의 단위.
Key(Full Path)로 데이터를 식별하고 메타데이터로 파일 형식, 사용자 정의 태그를 명시한다.
디렉토리 구조를 지원하지 않지만 Key를 사용해 가상 디렉토리 구조를 표현한다.
S3의 접근 제어 방식은 크게 User-Based와 Resource-Based로 구분된다.
User-Based
모든 AWS 제공 서비스가 그렇듯 IAM으로 AWS 계정 내 리소스 접근을 제어할 수 있다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::i3months-bucket/*"
}
]
}
Resource-Based
버킷에 적용되는 리소스 기반 정책으로 IAM과 마찬가지로 JSON으로 작성된다. (Bucket Policy)
리소스 자체에 권한을 정의한다. 특정 사용자, 역할, 서비스에 대해 버킷 수준의 접근 권한을 부여한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::i3months-bucket/*"
}
]
}
S3 내 모든 객체에는 Versioning을 적용할 수 있다.
적용 시 모든 객체에 고유한 버전ID가 발급되고 모든 변경사항이 기록된다.
실수로 덮어쓴 파일이나 삭제한 파일을 복구할 수 있지만 저장 용량이 증가하니 클라우드 사용 비용이 증가한다.
Versioning을 적용한 객체에는 Replication을 적용할 수 있는데, 새로운 객체가 업로드되거나 기존 객체가 수정되면 S3가 감지해 Destination Bucket으로 객체를 복사한다.
저장된 데이터를 자동으로 관리하기 위한 규칙으로 Lifecycle Rule을 설정할 수 있다.
S3에도 여러 종류가 있는데, 필요하지 않은 데이터를 삭제하거나 더 저렴한 S3 클래스로 이동시키도록 설정한다.
Transition Action
객체를 다른 스토리지 클래스로 전환하는 작업이다.
장기 보관에 적합한 객체를 Standard 에서 Glacier로 전환하거나, 자주 엑세스 하지 않는 객체를 Standard에서 Standard-IA로 전환할 때 사용한다.
객체를 업로드한 후 30일 뒤에 Standard-IA로 전환하고, 90일 후에는 Glacier로 전환하는 등 비용 절감에 유용하다.
S3 Analytics로 데이터를 분석해 자주 엑세스되지 않는 데이터를 찾은 후 클래스를 전환하기도 한다.
Expiration Action
객체를 삭제하는 작업으로 특정 기간동안 사용되지 않았거나 더 이상 필요하지 않은 객체를 삭제해 스토리지 비용을 절감한다.
{
"Rules": [
{
"ID": "i3monthsTransition",
"Status": "Enabled",
"Filter": {
"Prefix": "logs/"
},
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
}
],
"Expiration": {
"Days": 365
}
}
]
}
Lifecycle Rules Advisor를 통해 설정한 Lifecycle Rule이 효율적으로 작성됐는지, 불필요한 비용을 줄일 수 있는지 검토할 수 있다.
대용량 객체를 업로드 할 때는 분할정복 기법을 사용하는 Multipart Upload를 사용한다.
파일을 분할해 병렬로 업로드하고 조합해서 하나의 객체로 만드는 방식이다.
S3에 데이터를 저장하거나 전송할 때의 암호화는 네 가지 유형으로 구분된다.
Server Side Encryption
객체를 S3 버킷에 저장하기 전에 AWS가 암호화하고, 데이터를 요청할 때 복호화하는 방식이다.
S3 자체에서 AES-256 알고리즘을 사용하는 암호화 키를 관리하고,
객체 메타데이터에 "x-amz-server-side-encryption": "AES256" 헤더를 포함시킨다.
Key Management Service를 사용해서 암호화 키를 관리하는 경우 사용자가 KMS 키를 생성하고 암호화한다.
"x-amz-server-side-encryption": "aws:kms" 헤더를 포함시킨다.
사용자가 직접 암호화 키를 관리하는 SSE-C 방식에서는 AWS에서 키를 관리하지 않고, S3에 접근할 때 마다 사용자가 키를 제공해야 한다.
Client Side Encryption
클라이언트가 데이터를 S3에 업로드 하기 전에 데이터를 암호화하고, 복호화도 직접 처리하는 방식이다.
AWS는 암호화된 데이터만 저장하고 키는 클라이언트가 직접 관리한다.
이 때 AWS Encryption SDK같은 암호화 라이브러리를 사용한다.
암호화 키가 요청 헤더에 포함되니 HTTPS로 키와 데이터를 암호화 해야 한다.
Encryption in Transit
데이터가 네트워크를 통해 전송될 때 암호화하는 방식이다.
전송 중 암호화는 HTTPS 프로토콜 사용이 필수적이니 S3 Bucket Policy에서 aws:SecureTransport 조건을 설정해 줘야 한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ForceEncryptionInTransit",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::i3monthsBucket",
"arn:aws:s3:::i3monthsBucket/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
버킷 단위 정책을 사용할 경우, 모든 조건을 Bucket Policy에 포함해야 해서 관리가 복잡해진다.
이 때 Access Point를 사용하면 사용자 그룹별로 정책을 분리해서 관리할 수 있고, VPC연결과 함께 특정 네트워크에서의 접근만 허용하도록 설정해 특정 버킷에 대한 정책을 따로 관리할 수 있어 유용하다.
PB 단위의 데이터를 S3로 전송할 때는 AWS Snowball을 사용한다.
네트워크로 전송하기 어려울 정도로 큰 데이터를 AWS 클라우드로 옮길 때, 잠시 데이터를 보관하는 택배 상자 정도로 생각하면 된다.
전송 시간과 비용을 모두 단축할 수 있고 Snowball 내부 암호화 로직으로 물리적으로 이동하는 동안에도 데이터를 안전하게 보관할 수 있다.
민감한 데이터는 온프레미스 환경, 일부 데이터는 AWS S3에 데이터를 보관하는 Hybrid Cloud 환경에서도 AWS Storage Gateway 서비스를 사용해 온프레미스 서버와 클라우드 스토리지 간 데이터를 원활하게 전송할 수 있다.
File Gateway
온프레미스 파일 기반 애플리케이션에서 S3에 저장된 객체에 엑세스한다.
S3 버킷을 로컬 파일 서버처럼 다룰 수 있다.
Volume Gateway
iSCI 볼륨을 통해 온프레미스 서버에서 클라우드 스토리지를 사용한다.
전체 데이터를 온프레미스에 보관하거나 자주 히트되는 데이터의 일부만 캐시로 보관하는 전략을 사용한다.
Tape Gateway
Virtual Tape Library를 사용해 데이터를 S3나 Glacier로 백업한다.
'DevOps > Amazon Web Service' 카테고리의 다른 글
[AWS] Route53 (0) | 2025.01.18 |
---|---|
[AWS] RDS - Relational Database Service (0) | 2025.01.17 |
[AWS] Availability and Scalability (0) | 2025.01.14 |
[AWS] EC2 - Elastic Compute Cloud (0) | 2025.01.10 |
[AWS] IAM - Identity and Access Management (0) | 2025.01.06 |
댓글
이 글 공유하기
다른 글
-
[AWS] Route53
[AWS] Route53
2025.01.18 -
[AWS] RDS - Relational Database Service
[AWS] RDS - Relational Database Service
2025.01.17 -
[AWS] Availability and Scalability
[AWS] Availability and Scalability
2025.01.14 -
[AWS] EC2 - Elastic Compute Cloud
[AWS] EC2 - Elastic Compute Cloud
2025.01.10