CloudFormation 템플릿을 사용하여 S3 객체 Lambda 설정 자동화 - Amazon Simple Storage Service

CloudFormation 템플릿을 사용하여 S3 객체 Lambda 설정 자동화

AWS CloudFormation 템플릿을 사용하여 Amazon S3 객체 Lambda 액세스 포인트를 빠르게 생성할 수 있습니다. CloudFormation 템플릿은 관련 리소스를 자동으로 생성하고, AWS Identity and Access Management(IAM) 역할을 구성하고, 객체 Lambda 액세스 포인트를 통해 요청을 자동으로 처리하는 AWS Lambda 함수를 설정합니다. CloudFormation 템플릿을 사용하면 모범 사례를 구현하고 보안 태세를 개선하고 수동 프로세스로 인한 오류를 줄일 수 있습니다.

GitHub 리포지토리에는 CloudFormation 템플릿 및 Lambda 함수 소스 코드가 포함되어 있습니다. 스키마 템플릿을 사용하는 방법에 대한 지침은 객체 Lambda 액세스 포인트 생성 섹션을 참조하십시오.

템플릿에 제공된 Lambda 함수는 변환을 실행하지 않습니다. 대신 기본 데이터 소스에서 있는 그대로 객체를 반환합니다. 함수를 복제하고 고유한 변환 코드를 추가하여 애플리케이션에 반환되는 데이터를 수정하고 처리할 수 있습니다. 함수 수정에 대한 자세한 내용은 Lambda 함수 수정S3 객체 Lambda 액세스 포인트에 대한 Lambda 함수 작성 섹션을 참조하십시오.

템플릿 수정

새로운 지원 액세스 지점 생성

S3 객체 Lambda는 객체 Lambda 액세스 포인트와 지원 액세스 포인트라고도 하는 표준 S3 액세스 포인트라는 두 가지 액세스 포인트를 사용합니다. 객체 Lambda 액세스 포인트에 요청을 수행할 때 S3는 S3 객체 Lambda 구성에 따라 사용자를 대신하여 Lambda를 호출하거나 지원 액세스 포인트에 요청을 위임합니다. 템플릿을 배포할 때 aws cloudformation deploy 명령의 일부로 다음 파라미터를 전달하여 새로운 지원 액세스 지점을 생성할 수 있습니다.

CreateNewSupportingAccessPoint=true
함수 페이로드 구성

템플릿을 배포할 때 aws cloudformation deploy 명령의 일부로 다음 파라미터를 전달하여 Lambda 함수에 추가 데이터를 제공하도록 페이로드를 구성할 수 있습니다.

LambdaFunctionPayload="format=json"
Amazon CloudWatch 모니터링 사용

템플릿을 배포할 때 aws cloudformation deploy 명령의 일부로 다음 파라미터를 전달하여 CloudWatch 모니터링을 사용 설정할 수 있습니다.

EnableCloudWatchMonitoring=true

이 파라미터는 Amazon S3 요청 지표에 대한 객체 Lambda 액세스 포인트를 활성화하고 클라이언트 측 오류와 서버 측 오류를 모니터링하는 2개의 CloudWatch 경보를 생성합니다.

참고

Amazon CloudWatch를 사용하면 추가 비용이 발생합니다. Amazon S3 요청 지표에 대한 자세한 내용은 액세스 포인트 모니터링 및 로깅 섹션을 참조하십시오.

요금에 대한 자세한 내용은 CloudWatch 요금을 참조하십시오.

프로비저닝된 동시성 구성

지연 시간을 줄이려면 Resources 아래에 다음 줄을 포함하도록 템플릿을 편집하여 객체 Lambda 액세스 포인트를 지원하는 Lambda 함수에 대해 프로비저닝된 동시성을 구성합니다.

LambdaFunctionVersion: Type: AWS::Lambda::Version Properties: FunctionName: !Ref LambdaFunction ProvisionedConcurrencyConfig: ProvisionedConcurrentExecutions: Integer
참고

동시성 프로비저닝에 대한 추가 요금이 발생합니다. 프로비저닝된 동시성에 대한 자세한 내용은 AWS Lambda 개발자 안내서Lambda 프로비저닝된 동시성 관리를 참조하십시오.

요금에 대한 자세한 내용은 AWS Lambda 요금을 참조하십시오.

Lambda 함수 수정

GetObject 요청의 헤더 값 변경

기본적으로 Lambda 함수는 미리 서명된 URL 요청에서 GetObject 클라이언트로 Content-LengthETag를 제외한 모든 헤더를 전달합니다. Lambda 함수의 변환 코드를 기반으로 GetObject 클라이언트에 새 헤더 값을 보내도록 선택할 수 있습니다.

WriteGetObjectResponse API 작업에서 새 헤더 값을 전달하여 Lambda 함수를 업데이트하여 새 헤더 값을 보낼 수 있습니다.

예를 들어 Lambda 함수가 Amazon S3 객체의 텍스트를 다른 언어로 번역하는 경우 Content-Language 헤더에 새 값을 전달할 수 있습니다. 다음과 같이 writeResponse 함수를 수정하면 됩니다.

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, ContentLanguage: 'my-new-language' }).promise(); }

지원되는 헤더의 전체 목록은 Amazon Simple Storage Service API ReferenceWriteGetObjectResponse 섹션을 참조하십시오.

메타데이터 헤더 반환

WriteGetObjectResponse API 작업 요청에서 새 헤더 값을 전달하여 Lambda 함수를 업데이트하여 새 헤더 값을 보낼 수 있습니다.

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest, 'my-new-header': 'my-new-value' }, ...headers }).promise(); }
새 상태 코드 반환

사용자 정의 상태 코드를 WriteGetObjectResponse API 작업 요청에서 전달하여 GetObject 클라이언트에 반환할 수 있습니다.

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, StatusCode: Integer }).promise(); }

지원되는 상태 코드의 전체 목록은 Amazon Simple Storage Service API ReferenceWriteGetObjectResponse 섹션을 참조하십시오.

원본 객체에 RangepartNumber 적용

기본적으로 CloudFormation 템플릿에서 생성된 객체 Lambda 액세스 포인트는 RangepartNumber 파라미터를 처리할 수 있습니다. Lambda 함수는 요청된 범위 또는 부품 번호를 변환된 객체에 적용합니다. 이를 위해 이 함수는 전체 객체를 다운로드하고 변환을 실행해야 합니다. 경우에 따라 변환된 객체 범위가 원본 객체 범위에 정확히 매핑될 수 있습니다. 즉, 원본 객체에서 바이트 범위 A-B를 요청하고 변환을 실행하면 전체 객체를 요청하고 변환을 실행하고 변환된 객체에서 바이트 범위 A-B를 반환하는 것과 동일한 결과를 얻을 수 있습니다.

이러한 경우 Lambda 함수 구현을 변경하여 범위 또는 부품 번호를 원본 객체에 직접 적용할 수 있습니다. 이 방법을 통해 전체 함수 지연 시간과 필요한 메모리가 줄어듭니다. 자세한 내용은 Range 및 partNumber 헤더 작업 섹션을 참조하세요.

RangepartNumber 처리 사용 중지

기본적으로 CloudFormation 템플릿에서 생성된 객체 Lambda 액세스 포인트는 RangepartNumber 파라미터를 처리할 수 있습니다. 이 동작이 필요하지 않은 경우 템플릿에서 다음 줄을 제거하여 이를 비활성화할 수 있습니다.

AllowedFeatures: - GetObject-Range - GetObject-PartNumber - HeadObject-Range - HeadObject-PartNumber
대형 객체 변환

기본적으로 Lambda 함수는 S3 객체 Lambda에 대한 응답 스트리밍을 시작하기 전에 메모리에서 전체 객체를 처리합니다. 변환을 수행할 때 응답을 스트리밍하도록 함수를 수정할 수 있습니다. 이렇게 하면 변환 대기 시간과 Lambda 함수 메모리 크기를 줄이는 데 도움이 됩니다. 구현 예는 압축된 콘텐츠 스트리밍 예를 참조하십시오.