AWS Lambda #3: 코드 수정은 이제 그만! ‘환경 변수’로 스마트하게 관리하기

지난 2편에서 우리는 이미지가 업로드되면 자동으로 리사이징되는 멋진 시스템을 만들었습니다.
하지만 한 가지 아쉬운 점이 있습니다.

“리사이징 가로 크기를 300px에서 500px로 바꾸고 싶다면?”
“결과물이 저장되는 폴더 이름을 바꾸고 싶다면?”

지금까지는 매번 코드를 수정하고 [Deploy] 버튼을 눌러야 했습니다.
하지만 실무에서는 이런 가변적인 값들을 코드에 직접 적지 않습니다.
이때 사용하는 것이 바로 환경 변수입니다.

1. 환경 변수(Environment Variables)란?

환경 변수는 코드 외부에서 전달되는 설정값입니다. 코드는 ‘틀’만 유지하고, 실제 데이터는 외부에서 주입받는 방식이죠. 이렇게 하면 소스 코드를 건드리지 않고도 함수의 동작을 제어할 수 있어 매우 안전하고 편리합니다.

2. [따라하기] Lambda 환경 변수 설정하기

Lambda 환경 변수 추가
  1. 사용 중인 Lambda 함수 화면에서 [구성(Configuration)] 탭을 클릭합니다.
  2. 왼쪽 메뉴에서 [환경 변수(Environment variables)]를 선택합니다.
  3. [편집(Edit)] 버튼을 누르고, 아래 두 가지 값을 추가합니다.
    • 키(Key): RESIZE_WIDTH / 값(Value): 500
    • 키(Key): DEST_FOLDER / 값(Value): resized
  4. [저장]을 누릅니다.

3. 코드를 ‘유연하게’ 수정하기

이제 코드에서 300이나 resized/라고 적힌 부분을 환경 변수를 읽어오도록 변경해 보겠습니다. Node.js에서는 process.env.변수명으로 간단히 가져올 수 있습니다.

JavaScript

import { S3Client, GetObjectCommand, PutObjectCommand } from "@aws-sdk/client-s3";
import sharp from "sharp";

const s3 = new S3Client();

export const handler = async (event) => {
    const bucket = event.Records[0].s3.bucket.name;
    const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
    
    // 환경 변수에서 설정값 읽어오기 (없으면 기본값 사용)
    const resizeWidth = parseInt(process.env.RESIZE_WIDTH) || 300;
    const destFolder = process.env.DEST_FOLDER || "resized";

    const dstKey = key.replace("uploads/", `${destFolder}/`);

    try {
        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);

        // 환경 변수로 받은 너비값 적용
        const resizedBuffer = await sharp(buffer)
            .resize({ width: resizeWidth })
            .toBuffer();

        await s3.send(new PutObjectCommand({
            Bucket: bucket,
            Key: dstKey,
            Body: resizedBuffer,
            ContentType: "image/jpeg"
        }));

        console.log(`성공: 가로 ${resizeWidth}px로 리사이징 완료!`);
    } catch (err) {
        console.error(err);
    }
};

4. 왜 환경 변수를 써야 할까?

  • 보안: API 키나 DB 비밀번호 같은 민감한 정보를 코드에 노출하지 않고 안전하게 보관할 수 있습니다.
  • 유지보수: 설정 하나 바꾸려고 코드를 다시 빌드하고 배포할 필요가 없습니다.
  • 확장성: 테스트 환경(Dev)과 실제 서비스 환경(Prod)에서 서로 다른 버킷이나 설정을 사용할 때 코드 한 줄 안 바꾸고 대응이 가능합니다.

마치며

이제 여러분의 람다 함수는 훨씬 똑똑해졌습니다. 콘솔에서 숫자만 바꾸면 이미지 크기가 즉시 변하는 걸 확인해 보세요!

다음 4편에서는 이 모든 과정을 더 체계적으로 모니터링하고, 에러가 났을 때 나에게 알려주는 ‘CloudWatch 알람 설정’에 대해 알아보겠습니다.

참고 사이트

다른 글도 함께 읽어보세요