Amazon Web Services 한국 블로그

Amazon S3 Object Lambda 소개 – 코드 기반 S3 검색 데이터 처리 기능

Amazon Simple Storage Service (S3)에 데이터를 저장하면 여러 애플리케이션에서 사용하기 위해 쉽게 공유 할 수 있습니다. 그러나 각 애플리케이션에는 고유 한 요구 사항이 있으며, 데이터를 다르게 살펴 봐야 할 수도 있습니다. 예를 들어, 전자 상거래 애플리케이션에서 생성 된 데이터 세트에는 분석을 위해 처리 될 때 수정해야하는 개인 식별 정보 (PII)가 포함될 수 있습니다. 반면에 동일한 데이터 세트가 마케팅 캠페인에 사용되는 경우, 고객 충성도 데이터베이스의 정보와 같은 추가 세부 정보로 데이터를 보강해야 할 수 있습니다.

여러 애플리케이션에 서로 다른 데이터 보기를 제공하기 위해서는 현재 두 가지 옵션이 있습니다. 먼저 데이터의 추가 파생 복사본을 생성, 저장 및 유지하여 각 애플리케이션에 자체 사용자 지정 데이터 세트를 갖거나 Amazon S3 앞에 프록시 계층으로 인프라를 구축 및 관리하여 요청에 따라 데이터를 가로채서 처리하는 방법입니다. 두 옵션 모두 복잡성과 비용이 추가되므로, S3 팀은 더 나은 솔루션을 구축하기로 결정했습니다.

바로 Amazon S3 Object Lambda 기능입니다. 검색된 데이터를 애플리케이션에 반환하기 전에 자체 코드를 추가하여 처리 할 수 있는 새로운 기능입니다. S3 Object Lambda는 기존 애플리케이션과 함께 작동하며, AWS Lambda 함수를 사용하여 S3에서 검색되는 데이터를 자동으로 처리하고 변환합니다. Lambda 함수는 표준 S3 GET 요청과 함께 인라인으로 호출되므로 애플리케이션 코드를 변경할 필요가 없습니다.

이러한 방식으로 동일한 데이터 세트의 여러 보기를 쉽게 표시 할 수 있으며, Lambda 함수를 업데이트하여 언제든지 데이터 보기를 수정할 수 있습니다.

아키텍처 다이어그램.

이 접근 방식으로 단순화 할 수 있는 많은 활용 사례가 있습니다. 예를 들면 다음과 같습니다.

  • 분석 또는 비 생산 환경을 위해 개인 식별 정보 수정
  • XML을 JSON으로 변환하는 것과 같은 데이터 형식 간 변환
  • 다른 서비스 또는 데이터베이스의 정보로 데이터 보강
  • 다운로드 되는 파일 압축 또는 압축 해제
  • 개체를 요청한 사용자와 같은 발신자 별 세부 정보를 사용하여 즉시 이미지 크기 조정 및 워터 마킹
  • 데이터에 액세스하기 위한 사용자 지정 권한 부여 규칙 구현

몇 가지 간단한 단계를 통해 S3 Object Lambda 사용을 시작할 수 있습니다.

  1. 사용 사례에 맞게 데이터를 변환하는 Lambda 함수를 생성합니다.
  2. S3 관리 콘솔 에서 S3 객체 Lambda 액세스 포인트를 생성합니다 .
  3. 위에서 생성한 Lambda 함수를 선택합니다.
  4. S3 Access Point 를 제공하여 S3 Object Lambda에 원본 객체에 대한 액세스 권한을 부여합니다.
  5. 새로운 S3 Object Lambda 액세스 포인트를 사용하여, S3에서 데이터를 검색하도록 애플리케이션 구성을 업데이트합니다.

S3 Object Lambda의 작동 방식을 더 잘 이해하기 위해 실제로 사용해 보겠습니다.

S3 Object Lambda에 대한 Lambda 함수를 생성하는 방법
함수를 생성하려면 먼저 Lambda 함수가 S3 Object Lambda에서 수신하는 입력 이벤트의 구문을 살펴 봅니다.

{
    "xAmzRequestId": "1a5ed718-5f53-471d-b6fe-5cf62d88d02a",
    "getObjectContext": {
        "inputS3Url": "https://myap-123412341234.s3-accesspoint.us-east-1.amazonaws.com/s3.txt?X-Amz-Security-Token=...",
        "outputRoute": "io-iad-cell001",
        "outputToken": "..."
    },
    "configuration": {
        "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:123412341234:accesspoint/myolap",
        "supportingAccessPointArn": "arn:aws:s3:us-east-1:123412341234:accesspoint/myap",
        "payload": "test"
    },
    "userRequest": {
        "url": "/s3.txt",
        "headers": {
            "Host": "myolap-123412341234.s3-object-lambda.us-east-1.amazonaws.com",
            "Accept-Encoding": "identity",
            "X-Amz-Content-SHA256": "e3b0c44297fc1c149afbf4c8995fb92427ae41e4649b934ca495991b7852b855"
        }
    },
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "...",
        "arn": "arn:aws:iam::123412341234:user/myuser",
        "accountId": "123412341234",
        "accessKeyId": "..."
    },
    "protocolVersion": "1.00"
}

getObjectContext 속성에는 Lambda 함수에 대한 가장 유용한 정보가 포함되어 있습니다.

  • inputS3Url있는 미리 서명 된 URL 함수가 지원하는 액세스 포인트에서 원본 개체를 다운로드하는 데 사용할 수 있습니다. 이러한 방식은 Lambda 함수의 원본 객체를 검색하기 위해 S3 읽기 권한이 필요하지 않으며, 각 호출에서 처리 된 객체에만 액세스 할 수 있습니다.
  • outputRouteoutputToken매개 변수는 WriteGetObjectResponseAPI 를 사용하여 수정 된 개체를 다시 보내는 데 사용되는 두 개의 매개 변수입니다.

configuration속성에는 Amazon Resource Name (ARN) 객체 및 Lambda 액세스 포인트 및 지원 액세스 포인트가 포함됩니다. userRequest 속성은 URL의 경로 및 HTTP 헤더와 같은 원래 요청에 대한 추가 정보를 제공합니다. 마지막으로 userIdentity 섹션은 원래 요청한 사람의 세부 정보를 반환하며 데이터에 대한 액세스를 사용자 지정하는 데 사용할 수 있습니다.

이제 이벤트 구문을 기반으로 Lambda 함수를 생성 할 수 있습니다. 간단하게 원본 객체의 모든 텍스트를 대문자로 변경하는 Python으로 작성된 함수가 있습니다.

import boto3
import requests

def lambda_handler(event, context):
    print(event)

    object_get_context = event["getObjectContext"]
    request_route = object_get_context["outputRoute"]
    request_token = object_get_context["outputToken"]
    s3_url = object_get_context["inputS3Url"]

    # Get object from S3
    response = requests.get(s3_url)
    original_object = response.content.decode('utf-8')

    # Transform object
    transformed_object = original_object.upper()

    # Write object back to S3 Object Lambda
    s3 = boto3.client('s3')
    s3.write_get_object_response(
        Body=transformed_object,
        RequestRoute=request_route,
        RequestToken=request_token)

    return {'status_code': 200}

위의 함수 코드를 살펴보면 세 가지 주요 섹션이 있습니다.

  • 먼저 inputS3Url입력 이벤트의 속성을 사용하여 원본 개체를 다운로드합니다. 값이 미리 서명 된 URL이므로 함수는 S3에서 읽기 위한 권한이 필요하지 않습니다.
  • 그런 다음 텍스트를 모두 대문자로 변환합니다. 사용 사례에 맞게 함수의 동작을 사용자 지정하려면 변경해야 하는 부분입니다. 예를 들어, 개인 식별 정보 (PII)를 인지하기 위해, Amazon ComprehendDetectPiiEntities API를 사용하여  PII 개체의 위치를 별표 혹은 수정항목 유형으로 바꿀 수 있습니다.
  • 마지막으로WriteGetObjectResponseAPI 를 사용하여 변환 결과를 다시 S3 Object Lambda로 보냅니다. 이러한 방식으로 변환 된 객체는 Lambda 함수가 반환하는 응답의 최대 크기보다 훨씬 클 수 있습니다. 큰 개체인 경우, WriteGetObjectResponseAPI는  스트리밍 데이터 전송을 구현하기 위해 청크 전송 인코딩을 지원합니다. Lambda 함수는 상태 코드가 200 OK 경우, S3 GetObjectAPI 에 최종 오류 및 선택적으로 반환 된 객체의 메타 데이터를 지정합니다.

이제 라이브러리 의존성을 포함하여 함수를 패키징하고 Lambda 함수를 업로드합니다. S3 Object Lambda에서 사용하는 Lambda 함수의 최대 시간은 60 초이며,WriteGetObjectResponseAPI를 호출하려면 Lambda 함수에 AWS Identity and Access Management (IAM) 권한이 있어야 합니다.

콘솔에서 S3 Object Lambda 액세스 포인트를 생성하는 방법
S3 관리 콘솔에서 S3 버킷 중 하나에 S3 액세스 포인트를 만듭니다.

S3 콘솔 스크린 샷.

그런 다음 방금 생성 한 지원 액세스 포인트를 사용하여 S3 객체 Lambda 액세스 포인트를 생성합니다. Lambda 함수는 지원되는 액세스 포인트를 사용하여 원본 객체를 다운로드합니다.

S3 콘솔 스크린 샷.

아래와 같이 S3 Object Lambda 액세스 포인트를 구성하는 동안 위에서 생성한 Lambda 함수의 최신 버전을 선택합니다. 선택적으로 byte range 를 사용하거나 part numbers 요청에 대한 지원을 활성화 할 수 있습니다. (지금은 비활성화 상태로 둡니다.) 더 자세한 것은 기술 문서를 참고하시기 바랍니다.

S3 콘솔 스크린 샷.

S3 Object Lambda 액세스 포인트를 구성 할 때, 문자열을payload 해당 액세스 포인트에서 오는 모든 호출에서 Lambda 함수로 전달됩니다. configuration는 앞서 설명한 샘플 이벤트의 속성입니다. 이러한 방식으로 여러 S3 Object Lambda 액세스 포인트에 대해 동일한 Lambda 함수를 구성하고 payload 각각의 동작을 지정할 수 있습니다.

S3 콘솔 스크린 샷.

마지막으로 일반 S3 액세스 포인트로 수행 할 수 있는 것과 유사한 정책을 설정하여, S43 Object Lambda 액세스 포인트를 통해 액세스 할 수 있는 객체 접근을 제공 할 수 있습니다. (지금은 이 정책을 비워 둡니다. 그런 다음 모든 공개 액세스를 차단하고 Object Lambda 액세스 포인트를 생성하는 기본 옵션을 그대로 둡니다.)

이제 S3 객체 Lambda 액세스 포인트가 준비되었으므로 사용 방법을 살펴 보겠습니다.

S3 Object Lambda 액세스 포인트를 사용하는 방법
S3 콘솔에서 새로 생성 된 Object Lambda 액세스 포인트를 선택합니다. 속성에서 나중에 사용할 수 있도록 ARN을 복사합니다.

S3 콘솔 스크린 샷.

AWS 명령 줄 인터페이스 (CLI)을 이용하여, S3 Object Lambda 액세스 포인트 뒤에 S3 버킷에 몇 문장을 포함하는 텍스트 파일을 업로드합니다.

$ aws cp s3.txt s3://danilop-data/

기존 애플리케이션에서 S3 Object Lambda를 사용하는 것은 매우 간단합니다. S3 버킷을 S3 Object Lambda 액세스 포인트의 ARN으로 교체하고, S3 Object Lambda ARN을 사용하여 새 구문을 수락하도록 AWS SDK를 업데이트 하면 됩니다.

예를 들어, 아래 코드는 방금 업로드 한 텍스트 파일을 다운로드하는 Python 스크립트입니다. 먼저 S3 버킷에서 직접 다운로드 한 다음 S3 Object Lambda 액세스 포인트에서 다운로드합니다. 두 다운로드의 유일한 차이점은 Bucket 매개 변수입니다.

import boto3

s3 = boto3.client('s3')

print('Original object from the S3 bucket:')
original = s3.get_object(
  Bucket='danilop-data',
  Key='s3.txt')
print(original['Body'].read().decode('utf-8'))

print('Object processed by S3 Object Lambda:')
transformed = s3.get_object(
  Bucket='arn:aws:s3-object-lambda:us-east-1:123412341234:accesspoint/myolap',
  Key='s3.txt')
print(transformed['Body'].read().decode('utf-8'))

이제  로컬 컴퓨터에서 스크립트를 시작합니다.

$ python3 read_original_and_transformed_object.py

아래는 얻은 결과입니다.

Original object on S3:
Amazon Simple
Storage Service (Amazon S3) is an object storage service that offers
industry-leading scalability, data availability, security, and
performance. This means customers of all sizes and industries can use it
to store and protect any amount of data for a range of use cases, such
as data lakes, websites, mobile applications, backup and restore,
archive, enterprise applications, IoT devices, and big data analytics.

Object processed by S3 Object Lambda:
AMAZON
SIMPLE STORAGE SERVICE (AMAZON S3) IS AN OBJECT STORAGE SERVICE THAT
OFFERS INDUSTRY-LEADING SCALABILITY, DATA AVAILABILITY, SECURITY, AND
PERFORMANCE. THIS MEANS CUSTOMERS OF ALL SIZES AND INDUSTRIES CAN USE IT
TO STORE AND PROTECT ANY AMOUNT OF DATA FOR A RANGE OF USE CASES, SUCH
AS DATA LAKES, WEBSITES, MOBILE APPLICATIONS, BACKUP AND RESTORE,
ARCHIVE, ENTERPRISE APPLICATIONS, IOT DEVICES, AND BIG DATA ANALYTICS.

첫 번째 출력은 소스 버킷에서 직접 다운로드되며 예상대로 원본 콘텐츠가 표시됩니다. 두 번째로 객체는 검색 될 때 Lambda 함수에 의해 처리되며 결과적으로 모든 텍스트는 대문자로 표시되었습니다.

S3 Object Lambda에 대한 추가 사용 사례
S3 Object Lambda를 사용하여 객체를 검색 할 때 같은 이름의 객체가 S3 버킷에 존재할 필요가 없습니다. Lambda 함수는 파일 이름 또는 HTTP 헤더의 정보를 사용하여 사용자 지정 객체를 생성 할 수 있습니다.

예를 들어, sunset_600x400.jpg라는 이름이 있는 이미지에 S3 Object Lambda 액세스 포인트를 사용하도록 요청하는 경우,  Lambda 함수는 이름이 지정된 이미지를 찾을 수 있습니다. sunset.jpg파일 이름에 설명된 대로 최대 너비와 높이에 맞게 크기를 조정합니다. 이 경우 객체 키가 미리 서명 된 URL에서 사용 된 것과 다르기 때문에 Lambda 함수는 원본 이미지를 읽기 위해 액세스 권한이 필요합니다.

또 다른 흥미로운 사용 사례는 JSON 또는 CSV 문서를 검색하는 것입니다. order.json 또는 items.csv 같은 데이터베이스의 내용을 기반으로 즉석에서 생성할 수 있습니다. HTTP 헤더의 메타 데이터를 사용하여 orderId를 사용할 수 있구요. 고객들의 다양한 창의적인 사례가 있을 것으로 예상됩니다.

다음은 S3 Object Lambda의 작동 방식과 사용 방법을 설명하는 짧은 동영상입니다.

정식 출시 및 가격
Amazon S3 Object Lambda는 현재 아시아 태평양 (오사카) , AWS GovCloud (미국 동부) , AWS GovCloud (미국 서부) , 중국 (베이징) 중국 (닝샤) 리전을 제외한 모든 AWS 리전에서 사용할 수 있습니다 . S3 Object Lambda는 AWS 관리 콘솔 , AWS 명령 줄 인터페이스 (CLI) AWS SDK 에서 사용할 수 있습니다.

S3 Object Lambda를 사용하면 데이터를 처리하는 데 필요한 AWS Lambda 컴퓨팅 및 요청 요금과 S3 Object Lambda가 애플리케이션으로 반환하는 데이터에 대한 비용을 지불합니다. Lambda 함수에 의해 호출 된 S3 요청에 대한 비용도 지불합니다. 자세한 요금 정보는 Amazon S3 요금 페이지를 참고하세요.

새로운 기능을 사용하면 여러 애플리케이션에서 데이터를 훨씬 쉽게 공유하고 변환 할 수 있습니다.

지금 바로 S3 Object Lambda를 사용하여 스토리지 아키텍처를 단순화해 보세요.

Danilo