튜토리얼: Amazon S3 트리거를 사용해 썸네일 이미지 만들기

튜토리얼: Amazon S3 트리거를 사용해 썸네일 이미지 만들기

이 튜토리얼에서는 Amazon Simple Storage Service(Amazon S3) 버킷에 추가된 이미지의 크기를 조정하는 Lambda 함수를 만들고 구성해요. 버킷에 이미지 파일을 추가하면 Amazon S3가 Lambda 함수를 호출해요. 그러면 함수가 이미지의 썸네일 버전을 만들어 다른 Amazon 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 Lambda 개발자 안내서

본문

사전 요구 사항

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

Lambda 함수 코드에는 Python 또는 Node.js를 사용할 수 있어요. 사용하려는 언어용 언어 지원 도구와 패키지 관리자를 설치하세요.

AWS Command Line Interface 설치

AWS Command Line Interface를 아직 설치하지 않았다면 최신 버전의 AWS CLI 설치 또는 업데이트의 단계를 따라 설치하세요.

튜토리얼에는 명령을 실행할 명령줄 터미널 또는 셸이 필요해요. Linux와 macOS에서는 선호하는 셸과 패키지 관리자를 사용하세요.

참고 Windows에서는 Lambda에서 일반적으로 사용하는 일부 Bash CLI 명령(예: zip)이 운영 체제의 기본 제공 터미널에서 지원되지 않아요. Windows 통합 버전의 Ubuntu와 Bash를 사용하려면 Windows Subsystem for Linux를 설치하세요.

두 개의 Amazon S3 버킷 만들기

먼저 두 개의 Amazon S3 버킷을 만들어요. 첫 번째 버킷은 이미지를 업로드하는 소스 버킷이에요. 두 번째 버킷은 함수를 호출할 때 Lambda가 크기가 조정된 썸네일을 저장하는 데 사용해요.

AWS Management Console

Amazon S3 버킷을 만들려면(콘솔)

  1. Amazon S3 콘솔을 열고 범용 버킷(General purpose buckets) 페이지를 선택합니다.

  2. 지리적 위치에 가장 가까운 AWS 리전을 선택합니다. 화면 상단의 드롭다운 목록을 사용해서 리전을 변경할 수 있어요. 튜토리얼 후반에 동일한 리전에 Lambda 함수를 만들어야 해요.

  3. 버킷 만들기(Create bucket)를 선택합니다.

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

    1. 버킷 유형(Bucket type)에서 범용(General purpose)이 선택되었는지 확인합니다.

    2. 버킷 이름(Bucket name)에 Amazon S3 버킷 명명 규칙을 충족하는 전역적으로 고유한 이름을 입력합니다. 버킷 이름에는 소문자, 숫자, 점(.), 하이픈(-)만 포함할 수 있어요.

  5. 다른 모든 옵션은 기본값으로 두고 버킷 만들기(Create bucket)를 선택합니다.

  6. 1~5단계를 반복해서 대상 버킷을 만듭니다. 버킷 이름(Bucket name)에 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}}
    

    나중에 튜토리얼에서 Lambda 함수를 소스 버킷과 동일한 AWS 리전에 만들어야 하므로 선택한 리전을 기록해 두세요.

  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. 업로드(Upload)를 선택합니다.

  4. 파일 추가(Add files)를 선택하고 파일 선택기를 사용해 업로드할 객체를 선택합니다.

  5. 열기(Open)를 선택한 다음 업로드(Upload)를 선택합니다.

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 리소스에 액세스하는 데 필요한 권한을 부여해요. 이 튜토리얼의 경우 정책은 Lambda에 Amazon S3 버킷에 대한 읽기·쓰기 권한을 부여하고 Amazon CloudWatch Logs에 쓸 수 있게 해줘요.

AWS Management Console

정책을 만들려면(콘솔)

  1. AWS Identity and Access Management(IAM) 콘솔의 정책 페이지를 엽니다.

  2. 정책 만들기(Create policy)를 선택합니다.

  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. 정책 세부 정보(Policy details)에서 정책 이름(Policy name)에 LambdaS3Policy를 입력합니다.

  6. 정책 만들기(Create policy)를 선택합니다.

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
    

실행 역할 만들기

실행 역할은 Lambda 함수에 AWS 서비스와 리소스에 액세스할 권한을 부여하는 IAM 역할이에요. 함수에 Amazon S3 버킷에 대한 읽기·쓰기 액세스 권한을 부여하려면 이전 단계에서 만든 권한 정책을 연결해요.

AWS Management Console

실행 역할을 만들고 권한 정책을 연결하려면(콘솔)

  1. (IAM) 콘솔의 역할 페이지를 엽니다.

  2. 역할 만들기(Create role)를 선택합니다.

  3. 신뢰할 수 있는 엔터티 유형(Trusted entity type)에서 AWS 서비스(AWS service)를 선택하고 사용 사례(Use case)에서 Lambda를 선택합니다.

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

  5. 다음을 수행해서 이전 단계에서 만든 권한 정책을 추가합니다.

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

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

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

  6. 역할 세부 정보(Role details)의 역할 이름(Role name)에 LambdaS3Role을 입력합니다.

  7. 역할 만들기(Create role)를 선택합니다.

AWS CLI

실행 역할을 만들고 권한 정책을 연결하려면(AWS CLI)

  1. 다음 JSON을 trust-policy.json이라는 파일에 저장합니다. 이 신뢰 정책은 서비스 보안 주체 lambda.amazonaws.com에 AWS Security Token Service(AWS STS) AssumeRole 작업 호출 권한을 부여함으로써 Lambda가 역할의 권한을 사용할 수 있게 해줘요.

    {
      "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 [email protected]
    

    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.mjs, package.json, package-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++ 코드가 포함돼 있어요. --platform manylinux_2014_x86_64와 --only-binary=:all: 옵션을 사용하면 pip가 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 함수를 만들려면 먼저 'Hello world' 코드가 포함된 기본 함수를 만든 다음, 이전 단계에서 만든 .zip 또는 JAR 파일을 업로드해서 이 코드를 자신의 함수 코드로 대체해요.

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

  2. Amazon S3 버킷을 만든 것과 동일한 AWS 리전에서 작업하고 있는지 확인합니다. 화면 상단의 드롭다운 목록을 사용해서 리전을 변경할 수 있어요.

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

  4. 처음부터 작성(Author from scratch)을 선택합니다.

  5. 기본 정보(Basic information)에서 다음을 수행합니다.

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

    2. 런타임(Runtime)에서 함수용으로 선택한 언어에 따라 Node.js 22.x 또는 Python 3.12를 선택합니다.

    3. 아키텍처(Architecture)에서 x86_64를 선택합니다.

  6. 기본 실행 역할 변경(Change default execution role) 탭에서 다음을 수행합니다.

    1. 탭을 펼친 다음 기존 역할 사용(Use an existing role)을 선택합니다.

    2. 앞서 만든 LambdaS3Role을 선택합니다.

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

함수 코드를 업로드하려면(콘솔)

  1. 코드 소스(Code source) 창에서 업로드 위치(Upload from)를 선택합니다.

  2. .zip 파일(.zip file)을 선택합니다.

  3. 업로드(Upload)를 선택합니다.

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

  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 nodejs24.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.14 --timeout 10 --memory-size 1024 \
      --role arn:aws:iam::{{123456789012}}:role/LambdaS3Role --region {{us-east-1}}
      

Amazon S3가 함수를 호출하도록 구성

소스 버킷에 이미지를 업로드할 때 Lambda 함수가 실행되려면 함수에 대한 트리거를 구성해야 해요. 콘솔이나 AWS CLI를 사용해서 Amazon S3 트리거를 구성할 수 있어요.

중요 이 절차는 Amazon S3 버킷에서 객체가 생성될 때마다 함수를 호출하도록 버킷을 구성해요. 소스 버킷에만 구성하세요. Lambda 함수가 자신을 호출하는 동일한 버킷에 객체를 만들면 함수는 연속적으로 반복 호출될 수 있어요. 이로 인해 AWS 계정에 예상치 못한 비용이 청구될 수 있어요.

AWS Management Console

Amazon S3 트리거를 구성하려면(콘솔)

  1. Lambda 콘솔의 함수 페이지를 열고 함수(CreateThumbnail)를 선택합니다.

  2. 트리거 추가(Add trigger)를 선택합니다.

  3. S3를 선택합니다.

  4. 버킷(Bucket)에서 소스 버킷을 선택합니다.

  5. 이벤트 유형(Event types)에서 모든 객체 생성 이벤트(All object create events)를 선택합니다.

  6. 재귀 호출(Recursive invocation)에서 입력과 출력에 동일한 Amazon S3 버킷을 사용하는 것을 권장하지 않는다는 점을 확인하는 확인란을 선택합니다. Serverless Land의 런어웨이 Lambda 함수를 일으키는 재귀 패턴에서 Lambda의 재귀 호출 패턴에 대해 자세히 알아볼 수 있어요.

  7. 추가(Add)를 선택합니다.

    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을 소스 버킷에 적용하면 새 객체가 추가될 때마다 버킷이 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. 테스트(Test) 탭을 선택합니다.

  3. 테스트 이벤트를 만들려면 테스트 이벤트(Test event) 창에서 다음을 수행합니다.

    1. 테스트 이벤트 작업(Test event action)에서 새 이벤트 생성(Create new event)을 선택합니다.

    2. 이벤트 이름(Event name)에 myTestEvent를 입력합니다.

    3. 템플릿(Template)에서 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. 테스트 이벤트(Test event) 창에서 테스트(Test)를 선택합니다.

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

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

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

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 명령을 실행해서 함수를 호출합니다. 이 명령은 invocation-type 매개변수의 값으로 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
    

    cli-binary-format 옵션은 AWS CLI 버전 2를 사용하는 경우 필요해요. 기본 설정으로 만들려면 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. 업로드(Upload)를 선택합니다.

    3. 파일 추가(Add files)를 선택하고 파일 선택기를 사용해 업로드할 이미지 파일을 선택합니다. 이미지 객체는 .jpg 또는 .png 파일이면 됩니다.

    4. 열기(Open)를 선택한 다음 업로드(Upload)를 선택합니다.

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

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

    2. 객체(Objects) 창에서 이제 함수의 각 테스트에서 만든 두 개의 크기가 조정된 이미지 파일이 보일 것입니다. 크기가 조정된 이미지를 다운로드하려면 파일을 선택한 다음 다운로드(Download)를 선택합니다.

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. 작업(Actions), 삭제(Delete)를 선택합니다.

  4. 텍스트 입력 필드에 confirm을 입력하고 삭제(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)를 선택합니다.

더 알아보기 (Learn more)

이 튜토리얼은 Amazon S3 트리거를 사용해 썸네일 이미지를 만드는 방법을 설명해요. Amazon S3 통합에 대한 자세한 내용은 Lambda 개발자 안내서의 Lambda로 Amazon S3 이벤트 알림 처리을 참고하세요.