자습서: Amazon S3 트리거를 사용하여 썸네일 이미지 생성 - AWS Lambda

자습서: Amazon S3 트리거를 사용하여 썸네일 이미지 생성

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

S3 버킷, Lambda 함수 및 또 다른 S3 버킷 간의 데이터 흐름

이 자습서를 완료하려면 다음 단계를 수행하세요.

  1. 원본 및 대상 Amazon S3 버킷을 생성하고 샘플 이미지를 업로드합니다.

  2. 이미지 크기를 조정하고 Amazon S3 버킷에 썸네일을 출력하는 Lambda 함수를 생성합니다.

  3. 객체가 원본 버킷에 업로드될 때 함수를 간접적으로 호출하는 Lambda 트리거를 구성합니다.

  4. 먼저 더미 이벤트를 사용한 다음 원본 버킷에 이미지를 업로드하여 함수를 테스트하세요.

이 단계를 완료하면 Lambda를 사용하여 Amazon S3 버킷에 추가된 객체에 대한 파일 처리 작업을 수행하는 방법을 배우게 됩니다. AWS Command Line Interface 또는 AWS CLI(AWS Management Console)를 사용하여 이 자습서를 완료할 수 있습니다.

Lambda를 위한 Amazon S3 트리거를 구성하는 방법을 배울 수 있는 더 간단한 예제를 찾고 있다면 자습서: Amazon S3 트리거를 사용하여 Lambda 함수 호출을 살펴보세요.

사전 조건

AWS 계정이 없는 경우 다음 절차에 따라 계정을 생성합니다.

AWS 계정에 가입
  1. https://portal.aws.amazon.com/billing/signup을 엽니다.

  2. 온라인 지시 사항을 따릅니다.

    등록 절차 중 전화를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

    AWS 계정 루트 사용자에 가입하면 AWS 계정 루트 사용자가 생성됩니다. 루트 사용자에게는 계정의 모든 AWS 서비스 및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 루트 사용자 액세스 권한이 필요한 작업을 수행하는 것입니다.

AWS는 가입 절차 완료된 후 사용자에게 확인 이메일을 전송합니다. 언제든지 https://aws.amazon.com/으로 이동하고 내 계정을 선택하여 현재 계정 활동을 보고 계정을 관리할 수 있습니다.

AWS 계정에 가입하고 AWS 계정 루트 사용자에 보안 조치를 한 다음, AWS IAM Identity Center를 활성화하고 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 생성합니다.

귀하의 AWS 계정 루트 사용자 보호
  1. 루트 사용자를 선택하고 AWS 계정이메일 주소를 입력하여 AWS Management Console에 계정 소유자로 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

    루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 AWS 로그인 User Guide루트 사용자로 로그인을 참조하십시오.

  2. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

    지침은 IAM 사용 설명서AWS 계정 루트 사용자용 가상 MFA 디바이스 활성화(콘솔)를 참조하십시오.

관리자 액세스 권한이 있는 사용자 생성
  1. IAM Identity Center를 활성화합니다.

    지침은 AWS IAM Identity Center 사용 설명서AWS IAM Identity Center 설정을 참조하세요.

  2. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

    IAM Identity Center 디렉터리를 ID 소스로 사용하는 방법에 대한 자습서는 AWS IAM Identity Center 사용 설명서기본 IAM Identity Center 디렉터리로 사용자 액세스 구성을 참조하세요.

관리 액세스 권한이 있는 사용자로 로그인
  • IAM IDentity Center 사용자로 로그인하려면 IAM IDentity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

    IAM Identity Center 사용자로 로그인하는 데 도움이 필요한 경우 AWS 로그인 사용 설명서AWS 액세스 포털에 로그인을 참조하십시오.

추가 사용자에게 액세스 권한 할당
  1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

    지침은 AWS IAM Identity Center 사용 설명서의 Create a permission set를 참조하세요.

  2. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

    지침은 AWS IAM Identity Center 사용 설명서의 Add groups를 참조하세요.

AWS CLI를 사용하여 튜토리얼을 완료하려면 AWS Command Line Interface의 최신 버전을 설치하세요.

Lambda 함수 코드의 경우 Python 또는 Node.js를 사용할 수 있습니다. 사용하려는 언어의 언어 지원 도구 및 패키지 관리자를 설치합니다.

두 개의 Amazon S3 버킷 생성

첫 단계: S3 버킷 생성

먼저 두 개의 Amazon S3 버킷을 생성합니다. 첫 번째 버킷은 이미지를 업로드할 원본 버킷입니다. 두 번째 버킷은 Lambda에서 함수를 간접적으로 호출할 때 크기 조정된 의 썸네일을 저장하는 데 사용됩니다.

AWS Management Console
Amazon S3 버킷을 생성하려면(콘솔)
  1. Amazon S3 콘솔의 버킷 페이지를 엽니다.

  2. 버킷 생성을 선택합니다.

  3. [일반 구성(General configuration)]에서 다음을 수행합니다.

    1. 버킷 이름에 Amazon S3 버킷 이름 지정 규칙을 충족하는 전역적으로 고유한 이름을 입력합니다. 버킷 이름은 소문자, 숫자, 점(.) 및 하이픈(-)만 포함할 수 있습니다.

    2. AWS 리전의 경우 지리적 위치와 가장 가까운 AWS 리전을 선택하세요. 자습서의 뒷부분에서 동일한 AWS 리전에 Lambda 함수를 생성해야 하므로 선택한 리전을 기록해 둡니다.

  4. 다른 모든 옵션을 기본값으로 두고 버킷 생성을 선택합니다.

  5. 1~4단계를 반복하여 대상 버킷을 생성합니다. 버킷 이름에 amzn-s3-demo-source-bucket-resized를 입력합니다. 여기서 amzn-s3-demo-source-bucket은 방금 생성한 원본 버킷의 이름입니다.

AWS CLI
Amazon S3 버킷을 생성하려면(AWS CLI)
  1. 다음 CLI 명령을 실행하여 원본 버킷을 생성합니다. 버킷에 대해 선택하는 이름은 전역적으로 고유해야 하며 Amazon S3 버킷 이름 지정 규칙을 따라야 합니다. 이름에는 소문자, 숫자, 점(.), 하이픈(-)만 사용할 수 있습니다. region 및 LocationConstraint의 경우 지리적 위치와 가장 가까운 AWS 리전을 선택하세요.

    aws s3api create-bucket --bucket amzn-s3-demo-source-bucket --region us-east-1 \ --create-bucket-configuration LocationConstraint=us-east-1

    자습서의 뒷부분에서 원본 버킷과 동일한 AWS 리전에 Lambda 함수를 생성해야 하므로 선택한 리전을 기록해 둡니다.

  2. 다음 명령을 실행하여 대상 버킷을 생성합니다. 버킷 이름에는 amzn-s3-demo-source-bucket-resized를 사용해야 합니다. 여기서 amzn-s3-demo-source-bucket은 1단계에서 생성한 원본 버킷의 이름입니다. region 및 LocationConstraint의 경우 원본 버킷을 만들 때 사용한 것과 동일한 AWS 리전을 선택합니다.

    aws s3api create-bucket --bucket amzn-s3-demo-source-bucket-resized --region us-east-1 \ --create-bucket-configuration LocationConstraint=us-east-1

원본 버킷에 테스트 이미지 업로드

다음 단계: 테스트 객체 업로드

자습서의 뒷부분에서 AWS CLI 또는 Lambda 콘솔을 사용해 Lambda 함수를 호출하여 테스트합니다. 함수가 올바르게 작동하는지 확인하려면 원본 버킷에 테스트 이미지가 포함되어 있어야 합니다. 이 이미지는 선택한 JPG 또는 PNG 파일일 수 있습니다.

AWS Management Console
원본 버킷에 테스트 이미지를 업로드하려면(콘솔)
  1. Amazon S3 콘솔의 버킷 페이지를 엽니다.

  2. 이전 단계에서 생성한 소스 버킷을 선택합니다.

  3. 업로드를 선택합니다.

  4. 파일 추가를 선택하고 파일 선택기를 사용하여 업로드할 객체를 선택합니다.

  5. 열기를 선택한 후 업로드를 선택합니다.

AWS CLI
원본 버킷에 테스트 이미지를 업로드하려면(AWS CLI)
  • 업로드하려는 이미지가 포함된 디렉터리에서 다음 CLI 명령을 실행합니다. --bucket 파라미터를 원본 버킷의 이름으로 바꿉니다. --key--body 파라미터에는 테스트 이미지의 파일 이름을 사용합니다.

    aws s3api put-object --bucket amzn-s3-demo-source-bucket --key HappyFace.jpg --body ./HappyFace.jpg

권한 정책 생성

다음 단계: 권한 정책 생성

Lambda 함수를 생성하는 첫 번째 단계는 권한 정책의 생성입니다. 이 정책은 함수에 다른 AWS 리소스에 액세스하는 데 필요한 권한을 부여합니다. 이 자습서에서 정책을 통해 Amazon S3 버킷에 대한 읽기 및 쓰기 권한을 Lambda에 부여하고 Amazon CloudWatch Logs에 쓸 수 있습니다.

AWS Management Console
정책을 생성하려면(콘솔)
  1. AWS Identity and Access Management(IAM) 콘솔의 정책 페이지를 엽니다.

  2. 정책 생성을 선택합니다.

  3. 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:::*/*" } ] }
  4. Next(다음)를 선택합니다.

  5. 정책 세부 정보정책 이름LambdaS3Policy를 입력합니다.

  6. 정책 생성을 선택합니다.

AWS CLI
정책을 생성하려면(AWS CLI)
  1. 다음 JSON을 policy.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:::*/*" } ] }
  2. JSON 정책 문서를 저장한 디렉터리에서 다음 CLI 명령을 실행합니다.

    aws iam create-policy --policy-name LambdaS3Policy --policy-document file://policy.json

실행 역할 만들기

다음 단계: 실행 역할 만들기

실행 역할은 AWS 서비스 및 리소스에 액세스할 수 있는 권한을 Lambda 함수에 부여하는 IAM 역할입니다. 함수에 Amazon S3 버킷에 대한 읽기 및 쓰기 액세스 권한을 부여하려면 이전 단계에서 생성한 권한 정책을 연결합니다.

AWS Management Console
실행 역할을 생성하고 권한 정책을 연결하려면(콘솔)
  1. (IAM) 콘솔의 역할 페이지를 엽니다.

  2. 역할 생성을 선택합니다.

  3. 신뢰할 수 있는 엔터티 유형으로 AWS 서비스를 선택하고 사용 사례로 Lambda를 선택합니다.

  4. Next(다음)를 선택합니다.

  5. 다음을 수행하여 이전 단계에서 생성한 권한 정책을 추가합니다.

    1. 정책 검색 상자에 LambdaS3Policy를 입력합니다.

    2. 검색 결과에서 LambdaS3Policy에 대한 확인란을 선택합니다.

    3. Next(다음)를 선택합니다.

  6. 역할 세부 정보역할 이름LambdaS3Role을 입력합니다.

  7. 역할 생성을 선택합니다.

AWS CLI
실행 역할을 생성하고 권한 정책을 연결하려면(AWS CLI)
  1. 다음 JSON을 trust-policy.json이라는 파일로 저장합니다. 이 신뢰 정책을 통해 Lambda는 서비스 보안 주체에 lambda.amazonaws.com 권한을 제공하여 AWS Security Token Service(AWS STS) AssumeRole 작업을 호출하기 위해 역할의 권한을 사용할 수 있습니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. JSON 신뢰 정책 문서를 저장한 디렉터리에서 다음 CLI 명령을 실행하여 실행 역할을 생성합니다.

    aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
  3. 이전 단계에서 생성한 권한 정책을 연결하려면 다음 CLI 명령을 실행합니다. 정책의 ARN에 있는 AWS 계정 번호를 자신의 계정 번호로 바꿉니다.

    aws iam attach-role-policy --role-name LambdaS3Role --policy-arn arn:aws:iam::123456789012:policy/LambdaS3Policy

함수 배포 패키지 생성

다음 단계: 배포 패키지 생성

함수를 생성하려면 함수 코드와 해당 종속 항목을 포함하는 배포 패키지를 생성합니다. 이 CreateThumbnail 함수의 경우 함수 코드는 이미지 크기 조정을 위해 별도의 라이브러리를 사용합니다. 선택한 언어의 지침에 따라 필요한 라이브러리가 포함된 배포 패키지를 생성합니다.

Node.js
배포 패키지를 생성하려면(Node.js)
  1. 함수 코드 및 종속 항목에 대해 lambda-s3라는 디렉터리를 생성하고 해당 디렉터리로 이동합니다.

    mkdir lambda-s3 cd lambda-s3
  2. npm을 사용하여 새 Node.js 프로젝트를 생성합니다. 대화형 환경에서 제공되는 기본 옵션을 수락하려면 Enter을 누릅니다.

    npm init
  3. 다음 함수 코드를 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); };
  4. 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
  5. 함수 코드와 해당 종속 항목을 포함하는 .zip 배포 패키지를 생성합니다. MacOS 및 Linux에서 다음 명령을 실행합니다.

    zip -r function.zip .

    Windows에서 선호하는 zip 유틸리티를 사용하여 .zip 파일을 생성합니다. index.mjspackage.jsonpackage-lock.json 파일과 node_modules 디렉터리가 모두 .zip 파일의 루트에 있는지 확인합니다.

Python
배포 패키지를 생성하려면(Python)
  1. 예제 코드를 lambda_function.py라는 파일로 저장합니다.

    import boto3 import os import sys import uuid from urllib.parse import unquote_plus from PIL import Image import PIL.Image s3_client = boto3.client('s3') def resize_image(image_path, resized_path): with Image.open(image_path) as image: image.thumbnail(tuple(x / 2 for x in image.size)) image.save(resized_path) def lambda_handler(event, context): for record in event['Records']: bucket = record['s3']['bucket']['name'] key = unquote_plus(record['s3']['object']['key']) tmpkey = key.replace('/', '') download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey) upload_path = '/tmp/resized-{}'.format(tmpkey) s3_client.download_file(bucket, key, download_path) resize_image(download_path, upload_path) s3_client.upload_file(upload_path, '{}-resized'.format(bucket), 'resized-{}'.format(key))
  2. lambda_function.py 파일을 생성한 디렉터리에서 package라는 새 디렉터리를 생성하고 Pillow(PIL) 라이브러리와 AWS SDK for Python (Boto3)을 설치합니다. Lambda Python 런타임에는 Boto3 SDK 버전이 포함되어 있지만 런타임에 포함된 경우에도 함수의 모든 종속 항목을 배포 패키지에 추가하는 것이 좋습니다. 자세한 내용은 Python의 런타임 종속 항목을 참조하세요.

    mkdir package pip install \ --platform manylinux2014_x86_64 \ --target=package \ --implementation cp \ --python-version 3.12 \ --only-binary=:all: --upgrade \ pillow boto3

    Pillow 라이브러리에는 C/C++ 코드가 포함되어 있습니다. pip는 --platform manylinux_2014_x86_64 및 --only-binary=:all: 옵션을 사용하여 Amazon Linux 2 운영 체제와 호환되는 미리 컴파일된 바이너리가 포함된 Pillow 버전을 다운로드하고 설치합니다. 이렇게 하면 로컬 빌드 시스템의 운영 체제 및 아키텍처에 관계없이 배포 패키지가 Lambda 실행 환경에서 작동합니다.

  3. 애플리케이션 코드와 Pillow 및 Boto3 라이브러리가 포함된 .zip 파일을 생성합니다. Linux 또는 MacOS에서 명령줄 인터페이스에서 다음 명령을 실행합니다.

    cd package zip -r ../lambda_function.zip . cd .. zip lambda_function.zip lambda_function.py

    Windows에서는 선호하는 zip 도구를 사용하여 lambda_function.zip 파일을 생성합니다. lambda_function.py 파일과 종속 항목이 포함된 폴더가 모두 .zip 파일의 루트에 있는지 확인합니다.

Python 가상 환경을 사용하여 배포 패키지를 생성할 수도 있습니다. Python Lambda 함수에 대한 .zip 파일 아카이브 작업 섹션 참조

Lambda 함수 생성

다음 단계: 함수 생성

AWS CLI 또는 Lambda 콘솔을 사용하여 Lambda 함수를 생성할 수 있습니다. 선택한 언어의 지침에 따라 함수를 생성합니다.

AWS Management Console
Lambda 함수 생성(콘솔)

콘솔을 사용하여 Lambda 함수를 생성하려면 먼저 일부 ‘Hello world’ 코드가 포함된 기본 함수를 생성합니다. 그런 다음 이전 단계에서 만든 .zip 또는 JAR 파일을 업로드하여 이 코드를 고유한 함수 코드로 바꿉니다.

  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. Amazon S3 버킷을 생성한 동일한 AWS 리전에서 작업 중인지 확인합니다. 화면 상단의 드롭다운 목록을 사용하여 리전을 변경할 수 있습니다.

    Lambda 콘솔의 드롭다운 리전 메뉴를 보여주는 이미지
  3. 함수 생성을 선택합니다.

  4. 새로 작성을 선택합니다.

  5. 기본 정보에서 다음과 같이 합니다.

    1. [함수 이름(Function name)]에 CreateThumbnail을 입력합니다.

    2. 런타임에서 선택한 함수 언어에 따라 Node.js 20.x 또는 Python 3.12를 선택합니다.

    3. 아키텍처에서는 x86_64를 선택합니다.

  6. 기본 실행 역할 변경 탭에서 다음을 수행합니다.

    1. 탭을 확장한 다음 기존 역할 사용을 선택합니다.

    2. 이전에 생성한 LambdaS3Role을 선택합니다.

  7. 함수 생성(Create function)을 선택합니다.

함수 코드를 업로드하려면(콘솔)
  1. 코드 소스 창에서 에서 업로드를 선택합니다.

  2. .zip 파일을 선택합니다.

  3. 업로드를 선택합니다.

  4. 파일 선택기에서 .zip 파일을 선택하고 열기를 선택합니다.

  5. Save(저장)를 선택합니다.

AWS CLI
함수를 생성하려면(AWS CLI)
  • 선택한 언어의 CLI 명령을 실행합니다. role 파라미터의 경우 123456789012를 자신의 AWS 계정 ID로 바꿉니다. region 파라미터의 경우 us-east-1를 Amazon S3 버킷을 생성한 리전으로 바꿉니다.

    • Node.js의 경우 function.zip 파일이 포함된 디렉터리에서 다음 명령을 실행합니다.

      aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs20.x \ --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-1
    • Python의 경우 lambda_function.zip 파일이 포함된 디렉터리에서 다음 명령을 실행합니다.

      aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://lambda_function.zip --handler lambda_function.lambda_handler \ --runtime python3.12 --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-1

함수를 간접적으로 호출하도록 Amazon S3 구성

다음 단계: Amazon S3 트리거 생성

원본 버킷에 이미지를 업로드할 때 Lambda 함수를 실행하려면 함수에 대한 트리거를 구성해야 합니다. 콘솔 또는 AWS CLI를 사용하여 Amazon S3 트리거를 구성할 수 있습니다.

중요

이 절차는 버킷에서 객체가 생성될 때마다 함수를 간접적으로 호출하도록 Amazon S3 버킷을 구성합니다. 원본 버킷에서만 이를 구성해야 합니다. Lambda 함수가 함수를 간접적으로 호출하는 동일한 버킷에 객체를 생성하는 경우 함수를 루프에서 연속적으로 간접 호출할 수 있습니다. 이로 인해 예상치 못한 요금이 AWS 계정에 청구될 수 있습니다.

AWS Management Console
Amazon S3 트리거를 구성하려면(콘솔)
  1. Lambda 콘솔의 함수 페이지를 열고 함수(CreateThumbnail)를 선택합니다.

  2. 트리거 추가를 선택합니다.

  3. S3를 선택합니다.

  4. 버킷에서 원본 버킷을 선택합니다.

  5. 이벤트 유형에서 모든 객체 생성 이벤트를 선택합니다.

  6. 재귀 호출에서 확인란을 선택하여 입력 및 출력에 동일한 Amazon S3 버킷 사용이 권장되지 않음을 확인합니다. Serverless Land의 Recursive patterns that cause run-away Lambda functions를 읽고 Lambda의 재귀 호출 패턴에 대해 자세히 알아볼 수 있습니다.

  7. 추가를 선택합니다.

    Lambda 콘솔을 사용하여 트리거를 생성하면 Lambda는 선택한 서비스에 함수 간접 호출 권한을 부여하는 리소스 기반 정책을 자동으로 생성합니다.

AWS CLI
Amazon S3 트리거를 구성하려면(AWS CLI)
  1. 이미지 파일을 추가할 때 Amazon S3 소스 버킷이 함수를 간접적으로 호출하려면 먼저 리소스 기반 정책을 사용하여 함수에 대한 권한을 구성해야 합니다. 리소스 기반 정책 설명은 함수를 간접적으로 호출할 수 있는 다른 AWS 서비스 권한을 부여합니다. Amazon S3에 함수 간접 호출 권한을 부여하려면 다음 CLI 명령을 실행합니다. source-account 파라미터를 자신의 AWS 계정 ID로 바꾸고 고유한 원본 버킷 이름을 사용해야 합니다.

    aws lambda add-permission --function-name CreateThumbnail \ --principal s3.amazonaws.com --statement-id s3invoke --action "lambda:InvokeFunction" \ --source-arn arn:aws:s3:::amzn-s3-demo-source-bucket \ --source-account 123456789012

    이 명령으로 정의하는 정책은 원본 버킷에서 작업이 발생할 때만 Amazon S3가 함수를 간접적으로 호출하도록 허용합니다.

    참고

    Amazon S3 버킷 이름은 전역적으로 고유하지만 리소스 기반 정책을 사용할 때는 버킷이 반드시 계정에 속하도록 지정하는 것이 가장 좋습니다. 버킷을 삭제하면 다른 AWS 계정가 동일한 Amazon 리소스 이름(ARN)으로 버킷을 생성할 수 있기 때문입니다.

  2. 다음 JSON을 notification.json이라는 파일로 저장합니다. 이 JSON을 원본 버킷에 적용하면 JSON이 새 객체가 추가될 때마다 Lambda 함수에 알림을 보내도록 버킷을 구성합니다. Lambda 함수 ARN의 AWS 계정 번호와 AWS 리전을 자신의 계정 번호와 리전으로 바꿉니다.

    { "LambdaFunctionConfigurations": [ { "Id": "CreateThumbnailEventConfiguration", "LambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:CreateThumbnail", "Events": [ "s3:ObjectCreated:Put" ] } ] }
  3. 다음 CLI 명령을 실행하여 원본 버킷에 생성한 JSON 파일의 알림 설정을 적용합니다. amzn-s3-demo-source-bucket을 원본 버킷의 이름으로 바꿉니다.

    aws s3api put-bucket-notification-configuration --bucket amzn-s3-demo-source-bucket \ --notification-configuration file://notification.json

    put-bucket-notification-configuration 명령 및 notification-configuration 옵션에 대한 자세한 내용은 AWS CLI 명령 참조put-bucket-notification-configuration을 참조하세요.

더미 이벤트로 Lambda 함수 테스트

다음 단계: 더미 이벤트 생성

Amazon S3 원본 버킷에 이미지 파일을 추가하여 전체 설정을 테스트하기 전에 더미 이벤트로 호출하여 Lambda 함수가 올바르게 작동하는지 테스트합니다. Lambda의 이벤트는 함수가 처리할 데이터가 포함된 JSON 형식의 문서입니다. 함수가 Amazon S3에 의해 간접적으로 호출되면 함수로 전송된 이벤트에는 버킷 이름, 버킷 ARN, 객체 키와 같은 정보가 포함됩니다.

AWS Management Console
더미 이벤트로 Lambda 함수를 테스트하려면(콘솔)
  1. Lambda 콘솔의 함수 페이지를 열고 함수(CreateThumbnail)를 선택합니다.

  2. 테스트 탭을 선택합니다.

  3. 테스트 이벤트를 생성하려면 테스트 이벤트 창에서 다음을 수행합니다.

    1. 테스트 이벤트 작업에서 새 이벤트 생성을 선택합니다.

    2. 이벤트 이름myTestEvent를 입력합니다.

    3. 템플릿에서 S3 Put을 선택합니다.

    4. 다음 파라미터의 값을 사용자 고유의 값으로 바꿉니다.

      • 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" } } } ] }
    5. Save(저장)를 선택합니다.

  4. 테스트 이벤트 창에서 테스트를 선택합니다.

  5. 함수가 이미지의 크기 조정된 버전을 생성하여 대상 Amazon S3 버킷에 저장했는지 확인하려면 다음을 수행합니다.

    1. Amazon S3 콘솔의 버킷 페이지를 엽니다.

    2. 대상 버킷을 선택하고 크기 조정된 파일이 객체 창에 나열되는지 확인합니다.

AWS CLI
더미 이벤트로 Lambda 함수를 테스트하려면(AWS CLI)
  1. 다음 JSON을 dummyS3Event.json이라는 파일로 저장합니다. 다음 파라미터의 값을 고유한 값으로 바꿉니다.

    • 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" } } } ] }
  2. dummyS3Event.json 파일을 저장한 디렉터리에서 다음 CLI 명령을 실행하여 함수를 간접적으로 호출합니다. 이 명령은 간접 호출 유형 파라미터의 값으로 RequestResponse를 지정하여 Lambda 함수를 동기식으로 간접 호출합니다. 동기 및 비동기 호출에 대한 자세한 내용은 Lambda 함수 호출을 참조하세요.

    aws lambda invoke --function-name CreateThumbnail \ --invocation-type RequestResponse --cli-binary-format raw-in-base64-out \ --payload file://dummyS3Event.json outputfile.txt

    AWS CLI의 버전 2를 사용하는 경우 cli-binary-format 옵션이 필요합니다. 이 설정을 기본 설정으로 지정하려면 aws configure set cli-binary-format raw-in-base64-out을(를) 실행하세요. 자세한 내용은 AWS CLI 지원 대상 전역적 명령줄 옵션을 참조하세요.

  3. 함수가 이미지의 썸네일 버전을 생성하여 대상 Amazon S3 버킷에 저장했는지 확인합니다. 다음 CLI 명령을 실행하여 amzn-s3-demo-source-bucket-resized를 대상 버킷 이름으로 바꿉니다.

    aws s3api list-objects-v2 --bucket amzn-s3-demo-source-bucket-resized

    다음과 유사한 출력 화면이 표시되어야 합니다. Key 파라미터는 크기 조정된 이미지의 파일 이름을 보여줍니다.

    { "Contents": [ { "Key": "resized-HappyFace.jpg", "LastModified": "2023-06-06T21:40:07+00:00", "ETag": "\"d8ca652ffe83ba6b721ffc20d9d7174a\"", "Size": 2633, "StorageClass": "STANDARD" } ] }

Amazon S3 트리거를 사용하여 함수 테스트

다음 단계: 함수 테스트

Lambda 함수가 올바르게 작동하는지 확인했으니 Amazon S3 원본 버킷에 이미지 파일을 추가하여 전체 설정을 테스트할 준비가 되었습니다. 원본 버킷에 이미지를 추가하면 Lambda 함수가 자동으로 간접적으로 호출됩니다. 함수는 파일의 크기 조정된 버전을 생성하여 대상 버킷에 저장합니다.

AWS Management Console
Amazon S3 트리거를 사용하여 Lambda 함수를 테스트하려면(콘솔)
  1. Amazon S3 버킷에 이미지를 업로드하려면 다음을 수행합니다.

    1. Amazon S3 콘솔의 버킷 페이지를 열고 원본 버킷을 선택합니다.

    2. 업로드를 선택합니다.

    3. 파일 추가를 선택하고 파일 선택기를 사용하여 업로드하려는 이미지 파일을 선택합니다. 이미지 객체는 .jpg 또는 .png 파일일 수 있습니다.

    4. 열기를 선택한 후 업로드를 선택합니다.

  2. 다음을 수행하여 Lambda가 이미지 파일의 크기 조정된 버전을 대상 버킷에 저장했는지 확인합니다.

    1. Amazon S3 콘솔의 버킷 페이지로 돌아가서 대상 버킷을 선택합니다.

    2. 이제 객체 창에 크기 조정된 이미지 파일 두 개가 표시됩니다. 이는 Lambda 함수의 각 테스트에서 가져온 것입니다. 크기 조정된 이미지를 다운로드하려면 파일을 선택한 다음 다운로드를 선택합니다.

AWS CLI
Amazon S3 트리거를 사용하여 Lambda 함수를 테스트하려면(AWS CLI)
  1. 업로드하려는 이미지가 포함된 디렉터리에서 다음 CLI 명령을 실행합니다. --bucket 파라미터를 원본 버킷의 이름으로 바꿉니다. --key 및 --body 파라미터에는 테스트 이미지의 파일 이름을 사용합니다. 테스트 이미지는 .jpg 또는 .png 파일일 수 있습니다.

    aws s3api put-object --bucket amzn-s3-demo-source-bucket --key SmileyFace.jpg --body ./SmileyFace.jpg
  2. 함수가 이미지의 썸네일 버전을 생성하여 대상 Amazon S3 버킷에 저장했는지 확인합니다. 다음 CLI 명령을 실행하여 amzn-s3-demo-source-bucket-resized를 대상 버킷 이름으로 바꿉니다.

    aws s3api list-objects-v2 --bucket amzn-s3-demo-source-bucket-resized

    함수가 성공적으로 실행되면 다음과 유사한 출력이 표시됩니다. 이제 대상 버킷에는 크기 조정된 파일 두 개가 포함됩니다.

    { "Contents": [ { "Key": "resized-HappyFace.jpg", "LastModified": "2023-06-07T00:15:50+00:00", "ETag": "\"7781a43e765a8301713f533d70968a1e\"", "Size": 2763, "StorageClass": "STANDARD" }, { "Key": "resized-SmileyFace.jpg", "LastModified": "2023-06-07T00:13:18+00:00", "ETag": "\"ca536e5a1b9e32b22cd549e18792cdbc\"", "Size": 1245, "StorageClass": "STANDARD" } ] }

리소스 정리

이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

Lambda 함수를 삭제하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 생성한 함수를 선택합니다.

  3. 작업, 삭제를 선택합니다.

  4. 텍스트 입력 필드에 delete를 입력하고 Delete(삭제)를 선택합니다.

생성한 정책을 삭제하려면
  1. IAM 콘솔에서 정책 페이지를 엽니다.

  2. 생성한 정책(AWSLambdaS3Policy)을 선택합니다.

  3. [정책 작업(Policy actions)], [삭제(Delete)]를 선택합니다.

  4. Delete(삭제)를 선택합니다.

실행 역할을 삭제하려면
  1. IAM 콘솔에서 역할 페이지를 엽니다.

  2. 생성한 실행 역할을 선택합니다.

  3. Delete(삭제)를 선택합니다.

  4. 텍스트 입력 필드에 역할의 이름을 입력하고 Delete(삭제)를 선택합니다.

S3 버킷을 삭제하려면
  1. Amazon S3 콘솔을 엽니다.

  2. 생성한 버킷을 선택합니다.

  3. Delete(삭제)를 선택합니다.

  4. 텍스트 입력 필드에 버킷 이름을 입력합니다.

  5. 버킷 삭제(Delete bucket)를 선택합니다.