이 자습서에서는 Amazon Simple Storage Service(Amazon S3) 버킷에 추가된 이미지의 크기를 조정하는 Lambda 함수를 생성하고 구성합니다. 버킷에 이미지 파일을 추가하면 Amazon S3가 Lambda 함수를 간접적으로 간접 호출합니다. 그런 다음 함수는 이미지의 썸네일 버전을 생성하고 이를 다른 Amazon S3 버킷으로 출력합니다.

이 자습서를 완료하려면 다음 단계를 수행하세요.
-
원본 및 대상 Amazon S3 버킷을 생성하고 샘플 이미지를 업로드합니다.
-
이미지 크기를 조정하고 Amazon S3 버킷에 썸네일을 출력하는 Lambda 함수를 생성합니다.
-
객체가 원본 버킷에 업로드될 때 함수를 간접적으로 간접 호출하는 Lambda 트리거를 구성합니다.
-
먼저 더미 이벤트를 사용한 다음 원본 버킷에 이미지를 업로드하여 함수를 테스트하세요.
이 단계를 완료하면 Lambda를 사용하여 Amazon S3 버킷에 추가된 객체에 대한 파일 처리 작업을 수행하는 방법을 배우게 됩니다. AWS Command Line Interface 또는 AWS CLI(AWS Management Console)를 사용하여 이 자습서를 완료할 수 있습니다.
Lambda를 위한 Amazon S3 트리거를 구성하는 방법을 배울 수 있는 더 간단한 예제를 찾고 있다면 자습서: Amazon S3 트리거를 사용하여 Lambda 함수 간접 호출을 살펴보세요.
주제
사전 조건
AWS CLI를 사용하여 튜토리얼을 완료하려면 AWS Command Line Interface의 최신 버전을 설치하세요.
Lambda 함수 코드의 경우 Python 또는 Node.js를 사용할 수 있습니다. 사용하려는 언어의 언어 지원 도구 및 패키지 관리자를 설치합니다.
아직 AWS Command Line Interface를 설치하지 않은 경우 AWS CLI의 최신 버전 설치 또는 업데이트에서 설명하는 단계에 따라 설치하세요.
이 자습서에서는 명령을 실행할 셸 또는 명령줄 터미널이 필요합니다. Linux 및 macOS에서는 선호하는 셸과 패키지 관리자를 사용합니다.
참고
Windows에서는 Lambda와 함께 일반적으로 사용하는 일부 Bash CLI 명령(예:zip
)은 운영 체제의 기본 제공 터미널에서 지원되지 않습니다. Ubuntu와 Bash의 Windows 통합 버전을 가져오려면 Linux용 Windows Subsystem을 설치
두 개의 Amazon S3 버킷 생성

먼저 두 개의 Amazon S3 버킷을 생성합니다. 첫 번째 버킷은 이미지를 업로드할 원본 버킷입니다. 두 번째 버킷은 Lambda에서 함수를 간접적으로 간접 호출할 때 크기 조정된 의 썸네일을 저장하는 데 사용됩니다.
Amazon S3 버킷을 생성하려면(콘솔)
-
Amazon S3 콘솔
을 열고 범용 버킷 페이지를 선택합니다. -
지리적 위치와 가장 가까운 AWS 리전을 선택합니다. 화면 상단의 드롭다운 목록을 사용하여 리전을 변경할 수 있습니다. 자습서 뒷부분에서 동일한 리전에 Lambda 함수를 생성해야 합니다.
-
버킷 생성을 선택합니다.
-
[일반 구성(General configuration)]에서 다음을 수행합니다.
-
버킷 유형에서 범용을 선택했는지 확인합니다.
-
버킷 이름에 Amazon S3 버킷 이름 지정 규칙을 충족하는 전역적으로 고유한 이름을 입력합니다. 버킷 이름은 소문자, 숫자, 점(.) 및 하이픈(-)만 포함할 수 있습니다.
-
-
다른 모든 옵션을 기본값으로 두고 버킷 생성을 선택합니다.
-
1~5단계를 반복하여 대상 버킷을 생성합니다. 버킷 이름에
를 입력합니다. 여기서amzn-s3-demo-source-bucket-resized
은 방금 생성한 원본 버킷의 이름입니다.amzn-s3-demo-source-bucket
원본 버킷에 테스트 이미지 업로드

자습서의 뒷부분에서 AWS CLI 또는 Lambda 콘솔을 사용해 Lambda 함수를 호출하여 테스트합니다. 함수가 올바르게 작동하는지 확인하려면 원본 버킷에 테스트 이미지가 포함되어 있어야 합니다. 이 이미지는 선택한 JPG 또는 PNG 파일일 수 있습니다.
원본 버킷에 테스트 이미지를 업로드하려면(콘솔)
-
Amazon S3 콘솔의 버킷
페이지를 엽니다. -
이전 단계에서 생성한 소스 버킷을 선택합니다.
-
업로드를 선택합니다.
-
파일 추가를 선택하고 파일 선택기를 사용하여 업로드할 객체를 선택합니다.
-
열기를 선택한 후 업로드를 선택합니다.
권한 정책 생성

Lambda 함수를 생성하는 첫 번째 단계는 권한 정책의 생성입니다. 이 정책은 함수에 다른 AWS 리소스에 액세스하는 데 필요한 권한을 부여합니다. 이 자습서에서 정책을 통해 Amazon S3 버킷에 대한 읽기 및 쓰기 권한을 Lambda에 부여하고 Amazon CloudWatch Logs에 쓸 수 있습니다.
정책을 생성하려면(콘솔)
-
AWS Identity and Access Management(IAM) 콘솔의 정책 페이지
를 엽니다. -
정책 생성을 선택합니다.
-
JSON 탭에서 다음과 같은 사용자 지정 정책을 JSON 편집기에 붙여 넣습니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogGroup", "logs:CreateLogStream" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::*/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::*/*" } ] }
-
Next(다음)를 선택합니다.
-
정책 세부 정보의 정책 이름에
를 입력합니다.LambdaS3Policy
-
정책 생성을 선택합니다.
실행 역할 만들기

실행 역할은 AWS 서비스 및 리소스에 액세스할 수 있는 권한을 Lambda 함수에 부여하는 IAM 역할입니다. 함수에 Amazon S3 버킷에 대한 읽기 및 쓰기 액세스 권한을 부여하려면 이전 단계에서 생성한 권한 정책을 연결합니다.
실행 역할을 생성하고 권한 정책을 연결하려면(콘솔)
-
(IAM) 콘솔의 역할
페이지를 엽니다. -
역할 생성을 선택합니다.
-
신뢰할 수 있는 엔터티 유형으로 AWS 서비스를 선택하고 사용 사례로 Lambda를 선택합니다.
-
Next(다음)를 선택합니다.
-
다음을 수행하여 이전 단계에서 생성한 권한 정책을 추가합니다.
-
정책 검색 상자에
를 입력합니다.LambdaS3Policy
-
검색 결과에서
LambdaS3Policy
에 대한 확인란을 선택합니다. -
Next(다음)를 선택합니다.
-
-
역할 세부 정보의 역할 이름에
을 입력합니다.LambdaS3Role
-
역할 생성을 선택합니다.
함수 배포 패키지 생성

함수를 생성하려면 함수 코드와 해당 종속 항목을 포함하는 배포 패키지를 생성합니다. 이 CreateThumbnail
함수의 경우 함수 코드는 이미지 크기 조정을 위해 별도의 라이브러리를 사용합니다. 선택한 언어의 지침에 따라 필요한 라이브러리가 포함된 배포 패키지를 생성합니다.
배포 패키지를 생성하려면(Node.js)
-
함수 코드 및 종속 항목에 대해
lambda-s3
라는 디렉터리를 생성하고 해당 디렉터리로 이동합니다.mkdir lambda-s3 cd lambda-s3
-
npm
을 사용하여 새 Node.js 프로젝트를 생성합니다. 대화형 환경에서 제공되는 기본 옵션을 수락하려면Enter
을 누릅니다.npm init
-
다음 함수 코드를
index.mjs
라는 파일에 저장합니다.us-east-1
를 소스 및 대상 버킷을 직접 만든 AWS 리전으로 바꿔야 합니다.// dependencies import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3'; import { Readable } from 'stream'; import sharp from 'sharp'; import util from 'util'; // create S3 client const s3 = new S3Client({region:
'us-east-1'
}); // define the handler function export const handler = async (event, context) => { // Read options from the event parameter and get the source bucket console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); const srcBucket = event.Records[0].s3.bucket.name; // Object key may have spaces or unicode non-ASCII characters const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); const dstBucket = srcBucket + "-resized"; const dstKey = "resized-" + srcKey; // Infer the image type from the file suffix const typeMatch = srcKey.match(/\.([^.]*)$/); if (!typeMatch) { console.log("Could not determine the image type."); return; } // Check that the image type is supported const imageType = typeMatch[1].toLowerCase(); if (imageType != "jpg" && imageType != "png") { console.log(`Unsupported image type: ${imageType}`); return; } // Get the image from the source bucket. GetObjectCommand returns a stream. try { const params = { Bucket: srcBucket, Key: srcKey }; var response = await s3.send(new GetObjectCommand(params)); var stream = response.Body; // Convert stream to buffer to pass to sharp resize function. if (stream instanceof Readable) { var content_buffer = Buffer.concat(await stream.toArray()); } else { throw new Error('Unknown object stream type'); } } catch (error) { console.log(error); return; } // set thumbnail width. Resize will set the height automatically to maintain aspect ratio. const width = 200; // Use the sharp module to resize the image and save in a buffer. try { var output_buffer = await sharp(content_buffer).resize(width).toBuffer(); } catch (error) { console.log(error); return; } // Upload the thumbnail image to the destination bucket try { const destparams = { Bucket: dstBucket, Key: dstKey, Body: output_buffer, ContentType: "image" }; const putResult = await s3.send(new PutObjectCommand(destparams)); } catch (error) { console.log(error); return; } console.log('Successfully resized ' + srcBucket + '/' + srcKey + ' and uploaded to ' + dstBucket + '/' + dstKey); }; -
lambda-s3
디렉터리에서 npm을 사용하여 sharp 라이브러리를 설치합니다. 최신 버전의 sharp(0.33)는 Lambda와 호환되지 않습니다. 이 자습서를 완료하려면 버전 0.32.6을 설치합니다.npm install sharp@0.32.6
npm
install
명령은 모듈을 위한node_modules
디렉터리를 생성합니다. 이 단계 후에 디렉터리 구조는 다음과 같아야 합니다.lambda-s3 |- index.mjs |- node_modules | |- base64js | |- bl | |- buffer ... |- package-lock.json |- package.json
-
함수 코드와 해당 종속 항목을 포함하는 .zip 배포 패키지를 생성합니다. MacOS 및 Linux에서 다음 명령을 실행합니다.
zip -r function.zip .
Windows에서 선호하는 zip 유틸리티를 사용하여 .zip 파일을 생성합니다.
index.mjs
,package.json
,package-lock.json
파일과node_modules
디렉터리가 모두 .zip 파일의 루트에 있는지 확인합니다.
Lambda 함수 생성

AWS CLI 또는 Lambda 콘솔을 사용하여 Lambda 함수를 생성할 수 있습니다. 선택한 언어의 지침에 따라 함수를 생성합니다.
Lambda 함수 생성(콘솔)
콘솔을 사용하여 Lambda 함수를 생성하려면 먼저 일부 ‘Hello world’ 코드가 포함된 기본 함수를 생성합니다. 그런 다음 이전 단계에서 만든 .zip 또는 JAR 파일을 업로드하여 이 코드를 고유한 함수 코드로 바꿉니다.
-
Lambda 콘솔의 함수 페이지
를 엽니다. -
Amazon S3 버킷을 생성한 동일한 AWS 리전에서 작업 중인지 확인합니다. 화면 상단의 드롭다운 목록을 사용하여 리전을 변경할 수 있습니다.
-
함수 생성을 선택합니다.
-
새로 작성을 선택합니다.
-
기본 정보에서 다음과 같이 합니다.
-
[함수 이름(Function name)]에
을 입력합니다.CreateThumbnail
-
런타임에서 선택한 함수 언어에 따라 Node.js 22.x 또는 Python 3.12를 선택하세요.
-
아키텍처에서는 x86_64를 선택합니다.
-
-
기본 실행 역할 변경 탭에서 다음을 수행합니다.
-
탭을 확장한 다음 기존 역할 사용을 선택합니다.
-
이전에 생성한
LambdaS3Role
을 선택합니다.
-
-
함수 생성(Create function)을 선택합니다.
함수 코드를 업로드하려면(콘솔)
-
코드 소스 창에서 에서 업로드를 선택합니다.
-
.zip 파일을 선택합니다.
-
업로드를 선택합니다.
-
파일 선택기에서 .zip 파일을 선택하고 열기를 선택합니다.
-
Save(저장)를 선택합니다.
함수를 간접적으로 간접 호출하도록 Amazon S3 구성

원본 버킷에 이미지를 업로드할 때 Lambda 함수를 실행하려면 함수에 대한 트리거를 구성해야 합니다. 콘솔 또는 AWS CLI를 사용하여 Amazon S3 트리거를 구성할 수 있습니다.
중요
이 절차는 버킷에서 객체가 생성될 때마다 함수를 간접적으로 간접 호출하도록 Amazon S3 버킷을 구성합니다. 원본 버킷에서만 이를 구성해야 합니다. Lambda 함수가 함수를 간접적으로 간접 호출하는 동일한 버킷에 객체를 생성하는 경우 함수를 루프에서 연속적으로 간접 호출
Amazon S3 트리거를 구성하려면(콘솔)
-
Lambda 콘솔의 함수 페이지
를 열고 함수( CreateThumbnail
)를 선택합니다. -
트리거 추가를 선택합니다.
-
S3를 선택합니다.
-
버킷에서 원본 버킷을 선택합니다.
-
이벤트 유형에서 모든 객체 생성 이벤트를 선택합니다.
-
재귀 호출에서 확인란을 선택하여 입력 및 출력에 동일한 Amazon S3 버킷 사용이 권장되지 않음을 확인합니다. Serverless Land의 Recursive patterns that cause run-away Lambda functions
를 읽고 Lambda의 재귀 호출 패턴에 대해 자세히 알아볼 수 있습니다. -
추가를 선택합니다.
Lambda 콘솔을 사용하여 트리거를 생성하면 Lambda는 선택한 서비스에 함수 간접 호출 권한을 부여하는 리소스 기반 정책을 자동으로 생성합니다.
더미 이벤트로 Lambda 함수 테스트

Amazon S3 원본 버킷에 이미지 파일을 추가하여 전체 설정을 테스트하기 전에 더미 이벤트로 호출하여 Lambda 함수가 올바르게 작동하는지 테스트합니다. Lambda의 이벤트는 함수가 처리할 데이터가 포함된 JSON 형식의 문서입니다. 함수가 Amazon S3에 의해 간접적으로 간접 호출되면 함수로 전송된 이벤트에는 버킷 이름, 버킷 ARN, 객체 키와 같은 정보가 포함됩니다.
더미 이벤트로 Lambda 함수를 테스트하려면(콘솔)
-
Lambda 콘솔의 함수 페이지
를 열고 함수( CreateThumbnail
)를 선택합니다. -
테스트 탭을 선택합니다.
-
테스트 이벤트를 생성하려면 테스트 이벤트 창에서 다음을 수행합니다.
-
테스트 이벤트 작업에서 새 이벤트 생성을 선택합니다.
-
이벤트 이름에
myTestEvent
를 입력합니다. -
템플릿에서 S3 Put을 선택합니다.
-
다음 파라미터의 값을 사용자 고유의 값으로 바꿉니다.
-
awsRegion
의 경우us-east-1
을 Amazon S3 버킷을 생성한 AWS 리전으로 바꿉니다. -
name
의 경우amzn-s3-demo-bucket
을 사용자 고유의 Amazon S3 원본 버킷 이름으로 바꿉니다. -
key
의 경우test%2Fkey
를 원본 버킷에 테스트 이미지 업로드 단계에서 원본 버킷에 업로드한 테스트 객체의 파일 이름으로 바꿉니다.
{ "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion":
"us-east-1"
, "eventTime": "1970-01-01T00:00:00.000Z", "eventName": "ObjectCreated:Put", "userIdentity": { "principalId": "EXAMPLE" }, "requestParameters": { "sourceIPAddress": "127.0.0.1" }, "responseElements": { "x-amz-request-id": "EXAMPLE123456789", "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH" }, "s3": { "s3SchemaVersion": "1.0", "configurationId": "testConfigRule", "bucket": { "name":"amzn-s3-demo-bucket"
, "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::amzn-s3-demo-bucket" }, "object": { "key":"test%2Fkey"
, "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] } -
-
Save(저장)를 선택합니다.
-
-
테스트 이벤트 창에서 테스트를 선택합니다.
-
함수가 이미지의 크기 조정된 버전을 생성하여 대상 Amazon S3 버킷에 저장했는지 확인하려면 다음을 수행합니다.
-
Amazon S3 콘솔의 버킷 페이지
를 엽니다. -
대상 버킷을 선택하고 크기 조정된 파일이 객체 창에 나열되는지 확인합니다.
-
Amazon S3 트리거를 사용하여 함수 테스트

Lambda 함수가 올바르게 작동하는지 확인했으니 Amazon S3 원본 버킷에 이미지 파일을 추가하여 전체 설정을 테스트할 준비가 되었습니다. 원본 버킷에 이미지를 추가하면 Lambda 함수가 자동으로 간접적으로 간접 호출됩니다. 함수는 파일의 크기 조정된 버전을 생성하여 대상 버킷에 저장합니다.
Amazon S3 트리거를 사용하여 Lambda 함수를 테스트하려면(콘솔)
-
Amazon S3 버킷에 이미지를 업로드하려면 다음을 수행합니다.
-
Amazon S3 콘솔의 버킷
페이지를 열고 원본 버킷을 선택합니다. -
업로드를 선택합니다.
-
파일 추가를 선택하고 파일 선택기를 사용하여 업로드하려는 이미지 파일을 선택합니다. 이미지 객체는 .jpg 또는 .png 파일일 수 있습니다.
-
열기를 선택한 후 업로드를 선택합니다.
-
-
다음을 수행하여 Lambda가 이미지 파일의 크기 조정된 버전을 대상 버킷에 저장했는지 확인합니다.
-
Amazon S3 콘솔의 버킷
페이지로 돌아가서 대상 버킷을 선택합니다. -
이제 객체 창에 크기 조정된 이미지 파일 두 개가 표시됩니다. 이는 Lambda 함수의 각 테스트에서 가져온 것입니다. 크기 조정된 이미지를 다운로드하려면 파일을 선택한 다음 다운로드를 선택합니다.
-
리소스 정리
이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.
Lambda 함수를 삭제하려면
-
Lambda 콘솔의 함수 페이지
를 엽니다. -
생성한 함수를 선택합니다.
-
작업, 삭제를 선택합니다.
-
텍스트 입력 필드에
confirm
를 입력하고 Delete(삭제)를 선택합니다.
생성한 정책을 삭제하려면
-
IAM 콘솔에서 정책 페이지
를 엽니다. -
생성한 정책(AWSLambdaS3Policy)을 선택합니다.
-
[정책 작업(Policy actions)], [삭제(Delete)]를 선택합니다.
-
Delete(삭제)를 선택합니다.
실행 역할을 삭제하려면
-
IAM 콘솔에서 역할 페이지
를 엽니다. -
생성한 실행 역할을 선택합니다.
-
Delete(삭제)를 선택합니다.
-
텍스트 입력 필드에 역할의 이름을 입력하고 Delete(삭제)를 선택합니다.
S3 버킷을 삭제하려면
-
Amazon S3 콘솔
을 엽니다. -
생성한 버킷을 선택합니다.
-
Delete(삭제)를 선택합니다.
-
텍스트 입력 필드에 버킷 이름을 입력합니다.
-
버킷 삭제(Delete bucket)를 선택합니다.