AWS Lambda #2: 5분 만에 만드는 S3 이미지 리사이징 자동화

1단계: S3 버킷 및 폴더 준비 (저장소 만들기)

S3 버킷 과 폴더 추가

가장 먼저 이미지를 올리고 저장할 공간을 만듭니다.

  1. AWS 콘솔에서 S3를 검색해 접속한 후 [버킷 만들기]를 클릭합니다.
  2. 버킷 이름: 전 세계에서 유일한 이름을 입력합니다.
    (예: file-resizer-2026 보통 도메인 명을 많이 사용합니다. )
  3. 다른 설정은 그대로 두고 최하단 [버킷 만들기] 클릭!
  4. 만들어진 버킷 이름을 클릭해 들어간 뒤, **[폴더 만들기]**를 통해 아래 두 폴더를 만듭니다.
    • uploads/: 원본 사진을 올릴 곳
    • resized/: 결과물이 저장될 곳

2단계: 리사이징 전용 Lambda 함수 만들기

Lambda 함수 추가

Lambda 함수 생성

이제 실제로 일을 할 ‘함수’라는 몸체를 먼저 만듭니다.

  1. Lambda 콘솔에서 [함수 생성]을 클릭합니다.
  2. 설정 값:
    • 함수 이름: image-resizer-worker (자유롭게 지정)
    • 런타임: Node.js 24 권장
  3. [함수 생성] 버튼을 누릅니다. (이제 함수가 생겼으므로 트리거를 설정할 수 있습니다!)

Node.js 는 최신 것을 권장합니다. ( 20.4 했더니 지원 26년 4월 30일 지원 종료 된다는 메일이 왔어요 )


3단계: 트리거(Trigger) 연결하기

방금 만든 함수가 S3를 감시하도록 알람을 맞추는 단계입니다.

Trigger 연결

생성된 함수 상세 페이지 상단, [함수 개요] 섹션에서 [+ 트리거 추가]를 클릭합니다.

트리거 추가

소스 선택: S3를 선택합니다.

버킷: 1단계에서 만든 버킷(예:file-resizer-storage-2026 혹은 도메인 명)을 선택합니다.

접두사(Prefix) – 매우 중요 : uploads/를 입력합니다.
이 설정을 해야만 uploads/ 폴더에 올라온 파일만 처리하고, 람다가 resized/ 폴더에 파일을 생성할 때는 반응하지 않아 무한 루프(비용 폭탄)를 막을 수 있습니다.

하단 주의사항 체크 후 [추가]를 누릅니다.

트리거 추가 다이어그램

트리거가 추가 된 화면을 보실 수 있습니다.


4단계: 보안 권한(IAM) 및 실행 환경 설정

람다 함수를 만들었다고 해서 바로 S3에 접근할 수 있는 것은 아닙니다. 람다가 안전하게 파일을 가져오고 저장할 수 있도록 권한을 부여하고, 이미지 처리에 필요한 사양을 맞추는 작업이 필요합니다.

1. S3 접근 권한 부여 (IAM 역할)

역할에서 권한 정책 추가
권한 정책 추가
권한 정책 추가

기본적으로 람다는 외부 서비스에 접근할 권한이 없습니다. 람다에게 “너는 S3 버킷을 읽고 쓸 수 있어”라고 허락해 주는 과정입니다.

  1. 함수 화면 중간의 [구성(Configuration)] 탭을 클릭합니다.
  2. 왼쪽 메뉴에서 **[권한(Permissions)]**을 선택합니다.
  3. ‘실행 역할’ 항목에 있는 역할 이름 링크를 클릭합니다. (새 창으로 IAM 설정 화면이 열립니다.)
  4. [권한 추가] 버튼을 누르고 **[정책 연결]**을 선택합니다.
  5. 검색창에 AmazonS3FullAccess를 입력한 뒤, 해당 항목을 체크하고 [권한 추가] 버튼을 눌러 완료합니다.참고: IAM 설정은 AWS에서 제공하는 무료 기능이므로 추가 비용 걱정 없이 설정하셔도 됩니다.
  6. 정책이 역할에 연결되었습니다. 라고 Alert 메시지가 표시 됩니다.

2. 메모리 및 제한 시간 설정 (성능 최적화)

이미지 리사이징은 텍스트 처리보다 훨씬 많은 연산 능력을 요구합니다. 람다의 기본 설정(128MB)으로는 속도가 너무 느리거나 에러가 날 수 있으므로 사양을 높여줍니다.

메모리 및 시간 설정

다시 람다의 [구성] 탭에서 이번에는 왼쪽의 [일반 구성(General settings)]을 클릭합니다.

[편집(Edit)] 버튼을 누릅니다.

메모리 및 시간 설정

메모리: 기본값을 512MB 또는 1024MB로 늘려줍니다.

Tip: 메모리를 높이면 CPU 성능도 함께 올라가서 리사이징 속도가 훨씬 빨라집니다.

제한 시간: 기본 3초는 너무 짧을 수 있으니 1분으로 넉넉하게 수정합니다.


5단계: Node.js 리사이징 코드 작성

이제 [코드] 탭의 index.mjs 파일 내용을 모두 지우고 아래 코드를 복사해 넣으세요. 그다음 [Deploy]를 클릭해 반영합니다.

import { S3Client, GetObjectCommand, PutObjectCommand } from "@aws-sdk/client-s3";
import sharp from "sharp"; // Sharp 라이브러리 (Layer 추가 필요)

const s3 = new S3Client();

export const handler = async (event) => {
    // 1. 이벤트 데이터에서 버킷명과 파일 경로 추출
    const bucket = event.Records[0].s3.bucket.name;
    const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
    
    // 2. 저장 경로 변경 (uploads/ 폴더명을 resized/로 교체)
    const dstKey = key.replace("uploads/", "resized/");

    try {
        // 3. S3에서 이미지 가져오기
        const response = await s3.send(new GetObjectCommand({ Bucket: bucket, Key: key }));
        const chunks = [];
        for await (const chunk of response.Body) { chunks.push(chunk); }
        const buffer = Buffer.concat(chunks);

        // 4. Sharp 라이브러리로 가로 300px 리사이징
        const resizedBuffer = await sharp(buffer)
            .resize({ width: 300 })
            .toBuffer();

        // 5. 결과물을 resized/ 폴더에 저장
        await s3.send(new PutObjectCommand({
            Bucket: bucket,
            Key: dstKey,
            Body: resizedBuffer,
            ContentType: "image/jpeg"
        }));

        console.log(`성공: ${dstKey} 생성 완료`);
    } catch (err) {
        console.error("에러 발생:", err);
        throw err;
    }
};

코드에 Sharp 라이브러리 (Layer 추가 필요) 라고 작성이 되어 있지요 이제 작업을 해줍니다.

Sharp 레이어 파일 만드는 법 (Step-by-Step)

윈도우나 맥의 터미널(또는 명령 프롬프트)에서 아래 순서대로 입력하세요.

1. 폴더 구조 만들기

람다가 인식할 수 있는 전용 폴더 이름을 생성합니다.

mkdir nodejs
cd nodejs

2. Sharp 라이브러리 설치

이때 중요한 것은 AWS Lambda 환경(Linux)에 맞는 파일로 설치해야 한다는 점입니다. 내 컴퓨터가 윈도우나 맥이라도 아래 명령어를 쓰면 Lambda용 파일이 받아집니다.

npm install --arch=x64 --platform=linux sharp

설치가 끝나면 nodejs 폴더 안에 node_modules 폴더가 생기고, 그 안에 sharp 폴더가 들어있는 것을 확인할 수 있습니다.

3. 압축하기

이제 nodejs 폴더가 포함되도록 압축해야 합니다.

  • 윈도우: nodejs 폴더 위에서 마우스 우클릭 -> [압축 파일로 압축]
  • 맥: nodejs 폴더 위에서 마우스 우클릭 -> [~ 압축]
  • 최종 결과물: nodejs.zip (이 파일의 내부를 열면 바로 nodejs 폴더가 보여야 합니다.)

파일은 완성 되었으니 계층을 생성하러 갑니다.

계층 생성하기

계층

Sharp Layer 계층 을 생성합니다.

계층 구성
arn 주소

계층을 생성하면 나오는 arn 주소를 복사합니다.

코드 작성 창이 있던 창을 스크롤 하여 끝까지 내리면 계층 이라고 보이실 겁니다.

계층 연결

Add a layer 버튼 누릅니다.

arn 지정

추가 해 주면 되겠습니다.


6단계: 최종 확인

S3 버킷의 uploads/ 폴더에 사진을 하나 올립니다.

잠시 후 resized/ 폴더에 크기가 줄어든 이미지가 생겼는지 확인합니다.

성공했다면 여러분은 서버 관리 없이 돌아가는 이미지 자동화 서버를 구축하신 겁니다!

실습용 꿀팁: 1초 만에 테스트 이미지 준비하기

람다 함수가 이미지를 잘 처리하는지 확인하려면 테스트 파일이 필요하죠? 
매번 구글에서 이미지를 찾아 다운로드할 필요 없이 [Lorem Picsum] 서비스를 활용해 보세요.
참고 사이트: https://picsum.photos/
활용법: 주소 뒤에 원하는 해상도 숫자만 붙이면 즉시 랜덤 이미지가 생성됩니다.

https://picsum.photos/1920/1080 : 1920x1080 FHD 해상도 이미지 생성
https://picsum.photos/1000 : 1000x1000 사이즈의 고화질 정방형 이미지 생성

💡 다음 편 예고 (3편)

지금 코드를 보시면 300이라는 수치나 uploads/, resized/ 같은 폴더명이 코드 안에 직접 적혀 있습니다. 만약 리사이징 크기를 500px로 바꾸고 싶다면 매번 코드를 수정하고 배포해야 할까요?

3편에서는 코드 수정 없이 AWS 콘솔에서 설정값만 딸깍 바꿔서 동작을 제어하는 환경 변수(Environment Variables) 활용법을 배워보겠습니다.

참고 사이트

다른 글도 함께 읽어보세요