AWS

[re:Invent 2024] Amazon S3 Tables 출시 및 소개

안녕하세요.
2024년 AWS re:Invent에서 소개된 분석 워크로드에 최적화된 스토리지 서비스, Amazon S3 Tables에 대해 이야기해 보고자 글을 작성하였습니다. re:Invent 세션에서 소개된 내용과 맛보기 실습, 제 의견을 요약 전달하고자합니다.

< S3 Tables 소개에 앞서 Amazon S3는? >

Amazon S3(Simple Storage Service)는 2006년에 출시된 객체 스토리지 서비스로, 데이터를 버킷에 객체 형태로 저장하여 대규모 데이터를 효율적으로 관리할 수 있도록 설계되었습니다. 현재까지 400조 개 이상의 객체가 S3에 저장되어 있으며, 연간 1000조 건 이상의 요청을 처리할 만큼 확장성과 성능이 검증되었습니다.

초기에는 웹사이트의 이미지나 동영상과 같은 정적 콘텐츠를 저장하기 위해 설계되었으나, 출시 이후 그 활용 범위가 데이터 레이크, 빅데이터 분석, 머신 러닝 학습 데이터 저장소 등으로 확장되었습니다. 특히 많은 사용자들이 기상 데이터, 금융 거래 기록, 대고객 서비스 데이터와 같은 대규모 데이터를 Apache Parquet 형식으로 저장하며 S3를 표 형식 데이터 저장소로 활용하고 있습니다.

그러나, S3는 데이터 저장소로는 강력했지만, 대규모 데이터를 분석하고 효율적으로 관리하기 위해서는 추가적인 최적화 작업이 필요했습니다. 이러한 요구를 해결하기 위해 Apache Iceberg와 같은 테이블 형식이 주목받기 시작했습니다.

< Amazon S3 Tables 출시! >

Amazon S3 Tables는 분석 워크로드에 최적화된 새로운 스토리지 서비스로, Apache Iceberg 형식을 기본 지원하는 완전 관리형 스토리지 서비스입니다. Iceberg는 대규모 데이터를 효율적으로 관리할 수 있는 포맷으로, 페타바이트에서 엑사바이트에 이르는 데이터를 처리하기에 적합합니다. 이를 기반으로 S3 Tables는 일반 S3보다 최대 3배 빠른 쿼리 성능10배 더 많은 트랜잭션 처리량을 제공합니다.

S3 Tables: 핵심 기능 한눈에 보기

  1. 최적화된 성능
    S3 Tables는 일반 S3 버킷보다 최대 10배 높은 TPS(초당 트랜잭션 수)를 제공하며, 자동 압축 기능을 통해 데이터 파일을 통합하여 테이블 쿼리 성능을 최대 3배까지 향상시킬 수 있습니다. 사용자는 별도의 데이터 정리 작업 없이도 자동으로 성능이 최적화된 환경을 활용할 수 있습니다.
  1. 간편해진 보안 관리
    S3 Tables는 네임스페이스 기능을 통해 프로젝트나 부서별로 데이터를 논리적으로 분리해 관리할 수 있습니다. 이를 통해 테이블 단위로 개별적인 보안 정책을 적용하거나 권한을 설정할 수 있어, 복잡한 보안 관리를 간단하게 해결할 수 있습니다.
  1. 저장 비용 최적화
    S3 Tables는 자동 유지 관리 프로세스를 통해 만료된 스냅샷이나 참조되지 않는 오래된 파일을 정리하여 저장 비용을 최소화합니다. 불필요한 데이터를 자동으로 제거함으로써 비용을 절감할 수 있으며, 사용자는 데이터 관리에 들이는 시간과 노력을 줄일 수 있습니다.
  1. 완벽한 통합
    S3 Tables는 Amazon Athena, EMR, Apache Spark와 같은 분석 도구와 통합되어 데이터를 직접 쿼리하고 분석할 수 있는 플랫폼을 제공합니다. 별도의 데이터 이동이나 변환 작업 없이 저장된 데이터를 즉시 활용할 수 있으며, 테이블 수준에서 스키마 변경, 데이터 버전 관리, 오래된 스냅샷 정리 등의 작업이 자동화되어 운영 효율성이 극대화됩니다.

Amazon S3 Tables는 대규모 데이터 분석 워크로드에 최적화된 서비스로, 데이터를 효율적으로 관리하고 분석할 수 있는 강력한 도구입니다. 특히 Apache Iceberg를 기반으로 한 최대 3배 빠른 쿼리 성능과 10배 높은 트랜잭션 처리량은 S3 Tables의 가장 큰 강점이라 생각합니다. 또한, 자동 압축 및 유지 관리 기능은 성능 최적화뿐만 아니라 비용 절감까지 제공해, 대규모 데이터를 다루는 고객 입장에서 매우 실용적일것 같아 인상적입니다.(참고)

< 맛보기 실습 >

실습에서는 S3 Tables의 Table buckets 생성, Namespace 및 테이블을 생성해보고 Policy를 테이블에 연결하여 특정 사용자의 Table 삭제 명령을 차단하는 것까지 진행하도록 하겠습니다.
현재(25년 1월 기준) S3 Tables는 세 리전에서만 사용 가능합니다:

  • N.Virginia(us-east-1)
  • Ohio(us-east-2)
  • Oregon(us-west-2)

S3 Tables 콘솔에 접속하면 Table Buckets 목록을 확인할 수 있습니다. 만약 해당 항목이 보이지 않거나 사용이 제한되는 경우, 리전을 변경하거나 권한 설정을 점검해 보시기 바랍니다.

S3 Tables의 주요 설정 중 하나는 AWS 분석 서비스와의 통합 활성화입니다.
Table Bucket은 기본적으로 데이터 저장 기능만 제공하며, S3와 마찬가지로 데이터를 직접 분석하거나 해석하는 기능은 포함되어 있지 않습니다. 따라서, 분석 작업은 별도의 분석 서비스(Amazon Athena, Amazon EMR 등)를 통해 이루어져야 합니다.
이제 Table bucket을 생성해보도록 하겠습니다.

S3 Tables에서 통합 기능을 활성화하지 않은 경우, Table bucket 생성 과정에서 통합 활성화 안내 메시지가 표시됩니다.

통합 기능을 활성화하는 경우 다음과 같은 리소스가 자동 생성됩니다.

1. IAM Role 자동 생성
  S3는 사용자를 대신하여 IAM Role을 생성하고 AWS Lake Formation이 계정 내 모든 Table
 Bucket에 접근할 수 있도록 권한을 제공합니다.

2. Glue Data Catalog 자동 생성
  AWS Glue Data Catalog에 s3tablescatalog라는 이름의 기본 카탈로그가 자동으로 생성됩니다.
 또한, Region 내 각 Table Bucket에 대해 하위 Catalog가 생성되어 데이터 관리를 지원합니다.

통합을 활성화 한 후 버킷을 생성하겠습니다.

버킷이 생성되었습니다. 자동으로 생성된 리소스도 확인해보겠습니다.

  1. IAM Role – S3TablesRoleForLakeFormation
// S3TablesPolicyForLakeFormation
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "LakeFormationPermissionsForS3ListTableBucket",
            "Effect": "Allow",
            "Action": [
                "s3tables:ListTableBuckets"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "LakeFormationDataAccessPermissionsForS3TableBucket",
            "Effect": "Allow",
            "Action": [
                "s3tables:CreateTableBucket",
                "s3tables:GetTableBucket",
                "s3tables:CreateNamespace",
                "s3tables:GetNamespace",
                "s3tables:ListNamespaces",
                "s3tables:DeleteNamespace",
                "s3tables:DeleteTableBucket",
                "s3tables:CreateTable",
                "s3tables:DeleteTable",
                "s3tables:GetTable",
                "s3tables:ListTables",
                "s3tables:RenameTable",
                "s3tables:UpdateTableMetadataLocation",
                "s3tables:GetTableMetadataLocation",
                "s3tables:GetTableData",
                "s3tables:PutTableData"
            ],
            "Resource": [
                "arn:aws:s3tables:us-east-1:{accountid}:bucket/*"
            ]
        }
    ]
}
  1. Glue Data Catalog – s3tablescatalog
> aws glue get-catalogs --region us-east-1
{
    "CatalogList": [
        {
            "CatalogId": "{addountid}:s3tablescatalog",
            "Name": "s3tablescatalog",
            "ResourceArn": "arn:aws:glue:us-east-1:{accountid}:catalog/s3tablescatalog",
            "CreateTime": "2025-01-14T17:29:05+09:00",
            "FederatedCatalog": {
                "Identifier": "arn:aws:s3tables:us-east-1:{accountid}:bucket/*",
                "ConnectionName": "aws:s3tables"
            },
            "CatalogProperties": {},
            "CreateTableDefaultPermissions": [],
            "CreateDatabaseDefaultPermissions": []
        }
    ]
}

해당 정보는 AWS Lake Formation – Data Catalog – Catalog에서 확인하거나, CLI 명령으로 확인할 수 있습니다.

다음으로, 테이블을 논리적으로 그룹화하여 관리할 수 있는 구조인 Namespace를 생성해보겠습니다.

## namespace 생성
> aws s3tables create-namespace \
--table-bucket-arn <table-bucket-arn> \
--namespace <new_namespace_name> \

## namespace 목록 확인
> aws s3tables list-namespaces \
--table-bucket-arn <table-bucket-arn> \

Table Bucket 의 테이블 생성도 진행합니다.

## Table 생성
> aws s3tables create-table \
--table-bucket-arn <table-bucket-arn> \
--namespace <namespace_name> \
--name <new_table_name> --format ICEBERG

## Table 목록 확인
> aws s3tables list-tables \
--table-bucket-arn <table-bucket-arn> \

Resource Policy를 생성해서 테이블에 정책을 연결하도록 하겠습니다.

## Policy 생성
{
     "Version": "2012-10-17",
     "Id": "DenyDeleteTable",
     "Statement": [
      {
       "Effect": "Deny",
       "Principal": {
         "AWS": "arn:aws:iam::{차단하고자 하는 iam user 또는 role 등}"
        },
        "Action": [
           "s3tables:DeleteTable",
           "s3tables:UpdateTableMetadataLocation",
           "s3tables:PutTableData",
           "s3tables:GetTableMetadataLocation"

        ],
        "Resource":"arn:aws:s3tables:us-east-1:{accountid}:bucket/gsn-my-s3-bucket-table/table/"
     }]
}

## 테이블에 정책 연결
> aws s3tables put-table-policy \
--table-bucket-arn {table-bucket-arn} \
--namespcae {namespace_name}
--name {table_name} \
--resource-policy file://{file_location}

## 정책 연결 확인
> aws s3tables get-table-bucket-policy \
--table-bucket-arn {table-bucket-arn}

## 특정 계정으로 테이블을 삭제 시도
> aws s3tables delete-table --table-bucket-arn {table-bucket-arn} \
--namespace {namespace_name} --name {table_name}

An error occurred (AccessDeniedException) when calling the DeleteTable operation: User: arn:aws:iam::{ㅁaccountid}:user is not authorized to perform: s3tables:DeleteTable on resource: arn:aws:s3tables:us-east-1:{accountid}:bucket/gsn-my-s3-bucket-table/table/* with an explicit deny
명시적 거부 정책으로 인해 DeleteTable 명령이 차단되었습니다.

리소스 정리

생성 리소스 정리(삭제) 진행 시 Table Bucket의 경우 AWS CLI, SDK, S3 REST API를 사용하여 삭제를 진행하셔야 합니다. 잔여 리소스가 없는지 한번 더 확인합니다.

< Amazon S3 Tables 비용은 얼마나? >

시나리오:(https://aws.amazon.com/ko/s3/pricing/)

  1. 일일 ETL 작업 :
    다양한 정형 및 비정형 데이터 소스를 수집하여 사전 처리 후, Apache Iceberg 형식으로 변환하여 테이블에 데이터를 추가합니다. 이 과정에서 하루 1,000개의 데이터 파일(5MB)과 3개의 메타데이터 파일(10KB)이 생성됩니다.
  2. 쿼리 작업 :
    데이터 세트를 분석하기 위해 매월 약 50만건의 GET 요청을 수행합니다.
  3. 유지 관리 :
    자동 압축 기능을 활성화하여 데이터를 주기적으로 최적화합니다. 월말 기준 테이블의 크기는 1TB이며, 평균 객체 크기는 100MB입니다.

요금 계산:

1. 스토리지 요금 (월 27.14$)
  저장 데이터: 1TB(1,024GB)
  요율: GB당 0.0265$ (첫 50TB 기준)
  계산: 1,024GB * 0.0265$ = 27.14$

2. PUT 요청 요금 (월 0.15$)
  요청량: 1,003건/일 * 30일 = 30,090건/월
  요율: 1,000건당 0.005$
  계산: 30,090건 / 1,000 * 0.005$ = 0.15$

3. GET 요청 요금 (월 0.20$)
  요청량: 50만 건/월
  요율: 1,000건당 0.0004$
  계산: 500,000건 / 1,000 * 0.0004$ = 0.20$

4. 모니터링 요금 (월 0.26$)
  객체 수: 1TB(1,024GB) / 100MB = 약 10,486개 객체
  요율: 1,000개당 0.025$
  계산: 10,486 / 1,000 * 0.025$ = 0.26$

5. 압축 요금 (월 7.44$)
  - 처리 객체 수: 30,000개
   객체 처리 요금: 30,000 / 1,000 * 0.004$ = 0.12$
  - 처리 데이터량: 30,000 * 5MB = 150,000MB (146.48GB)
   데이터 처리 요금: 146.48GB * 0.05$ = 7.32$
  합계: 객체 처리요금 + 데이터 처리 요금 = 0.12$ + 7.32$ = 7.44$

총 요금: 월 35.19$

데이터 처리와 관리 방식에 따라 S3 Tables의 비용은 크게 달라질 수 있습니다. 그렇기 때문에 사용 전, 비용 시나리오를 검토하고 적합한 전략을 수립하는 것이 중요합니다. 예를 들어, 소규모 파일을 대량으로 저장하거나 자주 처리해야 하는 경우에는 PUT 요청 및 압축 요금이 증가할 수 있습니다. 또, 데이터 처리량이 많아지는 환경에서는 압축 관련 비용이 급증할 가능성도 있습니다. 이를 해결하려면 소규모 파일을 병합해 평균 객체 크기를 늘리고, 데이터 처리 빈도를 최적화하는 전략을 통해 월 비용을 절감할 수 있습니다.

대용량 데이터를 분석하고 정기적으로 업데이트가 필요한 환경에 특히 적합합니다. 분석 성능이 중요한 경우에는 압축 비용을 감수하더라도 성능 최적화를 통해 더 높은 효율성을 얻을 수 있습니다. 반면, 소규모 파일이 많고 데이터 처리 작업이 빈번한 환경에서는 비용 효율성이 떨어질 수 있습니다. 또한, 데이터 활용도가 낮은 환경에서는 저장 및 관리 비용이 불필요하게 증가할 가능성이 있습니다.

결과적으로 S3 Tables를 도입하기 전에는 데이터를 처리하고 저장하는 방식과 활용 목적을 명확히 정의하는 것이 필요합니다. 소규모 파일을 병합하거나 업데이트 주기를 조정해 비용 구조를 간소화하고, 데이터 사용 패턴에 맞는 전략을 설계하면 S3 Tables를 보다 비용 효율적으로 활용할 수 있을 것입니다.

< 정리 >

정리를 마지막으로 Amazon S3 Tables에 대한 소개를 마치겠습니다.
S3 Tables는 Apache Iceberg를 기반으로 한 서비스로 대규모 분석 워크로드에 많이 활용 될 것 같은데요. 도입시에 사용 목적, 비용 구조, 데이터 활용 패턴 등을 기반으로 전략을 잘 수립하면 더욱 효과적으로 활용할 수 있겠습니다. 앞으로 데이터 통합 기능, 리전 확장, 세부적인 관리 옵션 등의 발전이 기대가 되는 서비스입니다.
감사합니다!


참고.
[1] AWS re:Invent 2024 – [NEW LAUNCH] Store tabular data at scale with Amazon S3 Tables
[2] AWS Big Data Blog – Improve operational efficiencies of Apache Iceberg tables built on Amazon S3 data lakes
[3] AWS Storage Blog – How Amazon Ads uses Iceberg optimizations to accelerate their Spark workload on Amazon S3
[4] AWS Storage Blog – How Amazon S3 Tables use compaction to improve query performance by up to 3 times
[5] Amazon News Blog – New Amazon S3 Tables: Storage optimized for analytics workloads
[6] Amazon Web Service User Guide – Working with Amazon S3 Tables and table buckets
[7] Creating an Amazon S3 Tables catalog in the AWS Glue Data Catalog
[8] What is Iceberg?

4.3/5 - (평가 개수 : 3)

필자: 성 기상

전체 게시물수 : 1

전체 조회수 : 151

게시물 공유하기