CloudFormation 템플릿으로 S3 Object Lambda 설정 자동화
CloudFormation 템플릿으로 S3 Object Lambda 설정 자동화 (Automate S3 Object Lambda setup with a CloudFormation template)
AWS CloudFormation 템플릿을 사용하면 Amazon S3 Object Lambda 접근 지점을 빠르게 만들 수 있어요. 템플릿이 관련 리소스를 자동으로 만들고, AWS Identity and Access Management(IAM) 역할을 구성하고, Object Lambda 접근 지점을 통한 요청을 자동으로 처리하는 AWS Lambda 함수까지 설정해 줘요.
참고 2025년 11월 7일부터 S3 Object Lambda는 현재 이 서비스를 사용 중인 기존 고객과 일부 AWS 파트너 네트워크(APN) 파트너만 이용할 수 있어요. S3 Object Lambda와 비슷한 기능이 필요하다면 Amazon S3 Object Lambda 가용성 변경 문서를 확인해 주세요.
출처: 문서
본문
CloudFormation 템플릿을 사용하면 모범 사례를 적용하고 보안 태세를 개선하며 수동 프로세스로 인한 오류를 줄일 수 있어요. 이 GitHub 리포지토리에는 CloudFormation 템플릿과 Lambda 함수 소스 코드가 있어요. 템플릿 사용 방법에 대한 지침은 Object Lambda 접근 지점 만들기를 참고하세요.
템플릿에 포함된 Lambda 함수는 어떤 변환도 실행하지 않아요. 대신 기본 데이터 소스에서 객체를 그대로 반환하죠. 함수를 복제해 애플리케이션에 데이터가 반환될 때 데이터를 수정·처리하는 여러분만의 변환 코드를 추가할 수 있어요. 함수 수정에 대한 자세한 내용은 Lambda 함수 수정과 S3 Object Lambda 접근 지점용 Lambda 함수 작성을 참고하세요.
템플릿 수정
새 지원 접근 지점 만들기
S3 Object Lambda는 두 개의 접근 지점, 즉 Object Lambda 접근 지점과 **지원 접근 지점(supporting access point)**이라고 부르는 표준 S3 접근 지점을 사용해요. Object Lambda 접근 지점에 요청을 보내면 S3 Object Lambda 구성에 따라 S3가 여러분을 대신해 Lambda를 호출하거나 요청을 지원 접근 지점으로 위임해요. 템플릿을 배포할 때 aws cloudformation deploy 명령의 일부로 다음 파라미터를 전달하면 새 지원 접근 지점을 만들 수 있어요.
CreateNewSupportingAccessPoint=true
함수 페이로드 구성
템플릿을 배포할 때 aws cloudformation deploy 명령의 일부로 다음 파라미터를 전달하면 Lambda 함수에 보충 데이터를 제공하는 페이로드를 구성할 수 있어요.
LambdaFunctionPayload="format=json"
Amazon CloudWatch 모니터링 활성화
템플릿을 배포할 때 aws cloudformation deploy 명령의 일부로 다음 파라미터를 전달하면 CloudWatch 모니터링을 활성화할 수 있어요.
EnableCloudWatchMonitoring=true
이 파라미터는 Object Lambda 접근 지점을 Amazon S3 요청 지표에 대해 활성화하고, 클라이언트 측 및 서버 측 오류를 모니터링하는 두 개의 CloudWatch 알람을 만들어요.
참고 Amazon CloudWatch 사용에는 추가 비용이 발생해요. Amazon S3 요청 지표에 대한 자세한 내용은 접근 지점 모니터링 및 로깅을 참고하세요. 요금에 대한 자세한 내용은 CloudWatch 요금을 참고하세요.
프로비저닝된 동시성 구성
지연 시간을 줄이려면 Object Lambda 접근 지점을 뒷받침하는 Lambda 함수에 대해 프로비저닝된 동시성을 구성할 수 있어요. 템플릿을 편집해 Resources 아래에 다음 줄을 포함하면 돼요.
LambdaFunctionVersion:
Type: AWS::Lambda::Version
Properties:
FunctionName: !Ref LambdaFunction
ProvisionedConcurrencyConfig:
ProvisionedConcurrentExecutions: Integer
참고 동시성 프로비저닝에는 추가 요금이 발생해요. 프로비저닝된 동시성에 대한 자세한 내용은 AWS Lambda 개발자 안내서의 Lambda 프로비저닝된 동시성 관리를 참고하세요. 요금에 대한 자세한 내용은 AWS Lambda 요금를 참고하세요.
Lambda 함수 수정
GetObject 요청에 대한 헤더 값 변경
기본적으로 Lambda 함수는 사전 서명 URL 요청의 모든 헤더(Content-Length와 ETag 제외)를 GetObject 클라이언트로 전달해요. 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 Reference의 WriteGetObjectResponse를 참고하세요.
메타데이터 헤더 반환
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 Reference의 WriteGetObjectResponse를 참고하세요.
소스 객체에 Range 및 partNumber 파라미터 적용
기본적으로 CloudFormation 템플릿으로 만든 Object Lambda 접근 지점은 Range 및 partNumber 파라미터를 처리할 수 있어요. Lambda 함수는 요청된 범위나 부분 번호를 변환된 객체에 적용해요. 그러려면 함수가 전체 객체를 내려받고 변환을 실행해야 해요. 때로는 변환된 객체 범위가 소스 객체 범위와 정확히 일치할 수 있어요. 이는 소스 객체에 바이트 범위 A-B를 요청하고 변환을 실행한 것이, 전체 객체를 요청하고 변환을 실행한 다음 변환된 객체에 바이트 범위 A-B를 반환하는 것과 같은 결과를 만들 수 있다는 뜻이에요.
이런 경우 Lambda 함수 구현을 변경해 범위나 부분 번호를 소스 객체에 직접 적용할 수 있어요. 이 접근 방식은 전체 함수 지연 시간과 필요한 메모리를 줄여 줘요. 자세한 내용은 Range 및 partNumber 헤더 사용을 참고하세요.
Range 및 partNumber 처리 비활성화
기본적으로 CloudFormation 템플릿으로 만든 Object Lambda 접근 지점은 Range 및 partNumber 파라미터를 처리할 수 있어요. 이 동작이 필요 없다면 템플릿에서 다음 줄을 제거해 비활성화할 수 있어요.
AllowedFeatures:
- GetObject-Range
- GetObject-PartNumber
- HeadObject-Range
- HeadObject-PartNumber
큰 객체 변환
기본적으로 Lambda 함수는 S3 Object Lambda로 응답 스트리밍을 시작하기 전에 전체 객체를 메모리에서 처리해요. 변환을 수행하면서 응답을 스트리밍하도록 함수를 수정할 수 있어요. 이렇게 하면 변환 지연 시간과 Lambda 함수 메모리 크기를 줄이는 데 도움이 돼요. 예제 구현은 압축된 콘텐츠 스트림 예제를 참고하세요.