퍼블릭 클라우드

AWS Lambda에서 Layer를 사용하여 Node.js로 샘플 코드를 구현하는 방법

변군이글루 2024. 11. 27. 16:35
반응형

AWS Lambda에서 Layer를 사용하여 Node.js로 샘플 코드를 구현하는 방법

Layer를 활용하면 라이브러리(예: axios)를 Lambda 코드와 분리하여 관리할 수 있어 효율적입니다.

1. Layer 생성 및 설정

작업 디렉토리 생성 및 이동

mkdir ~/lambda-slack-layer
cd ~/lambda-slack-layer

Layer 디렉토리 구조 생성

  • Layer는 Lambda 런타임에서 요구하는 구조로 만들어야 합니다.
mkdir -p layer/nodejs
cd layer/nodejs

종속성 설치

  • Slack Webhook 요청에 필요한 axios 라이브러리를 설치합니다.
npm init -y
npm install axios

Layer 압축

  • Layer 파일을 .zip 형식으로 압축합니다.
cd ..
zip -r ../slack-layer.zip .
cd ..

2. Layer 업로드

AWS Lambda Console을 사용

Lambda 서비스 > 계층 > 계층 생성

  • 계층 이름 : slack-layer
  • 압축 파일 : slack-layer.zip
  • 호환 가능한 런타임: Node.js 22.x

계층 생성 합니다.

AWS CLI를 사용

Lambda의 목록 조회

aws lambda list-functions \
    --query 'Functions[].FunctionName' \
    --output json | jq -r 'to_entries | .[] | "\(.key + 1). \(.value)"'
더보기

---

aws lambda list-functions
aws lambda list-functions \
	--region us-east-1 \
    --query 'Functions[].FunctionName' \
    --output json | jq -r '.[]'

---

Lambda Layers(레이어)의 목록 조회

aws lambda list-layers \
    --region us-east-1 \
    --query 'Layers[].LayerName' \
    --output text

Lambda Layers를 업로드

aws lambda publish-layer-version \
	--region us-east-1 \
    --layer-name slack-layer \
    --compatible-runtimes nodejs22.x \
    --zip-file fileb://slack-layer.zip
{
    "Content": {
        "Location": "https://layers.s3.us-east-1.amazonaws.com/snapshots/121234567890/slack-layer",
        "CodeSha256": "2hg8w0CV7Mvj0DmNCIeYsh7Pw8N37qRZ09uEkdZOLRU=",
        "CodeSize": 688538
    },
    "LayerArn": "arn:aws:lambda:us-east-1:121234567890:layer:slack-layer",
    "LayerVersionArn": "arn:aws:lambda:us-east-1:121234567890:layer:slack-layer:1",
    "Description": "",
    "CreatedDate": "2024-11-27T06:40:18.566+0000",
    "Version": 1,
    "CompatibleRuntimes": [
        "nodejs22.x"
    ]
}
  • 생성된 Layer의 ARN을 기록합니다. (예: arn:aws:lambda:region:account-id:layer:slack-layer:1)

Lambda Layers(레이어)의 목록 조회

aws lambda list-layers \
    --region us-east-1 \
    --query 'Layers[].LayerName' \
    --output text
slack-layer

3. Lambda 함수 구현

cd ~/lambda-slack-layer

Lambda 핸들러 파일 생성

  • index.mjs 파일을 생성하고 Slack 메시지를 보내는 코드를 작성합니다.
vim index.mjs
import axios from 'axios'; // Layer에서 제공되는 axios 사용

export const handler = async (event) => {
    // 환경 변수로 관리된 Slack Webhook URL
    const webhookUrl = process.env.SLACK_WEBHOOK;

    // 전송할 메시지 페이로드
    const payload = {
        text: "Hello! This message is from AWS Lambda using Layers!",
        channel: process.env.SLACK_CHANNEL || "#your-channel", // 환경 변수로 관리
        username: "Lambda Bot"
    };

    try {
        // Slack Webhook으로 메시지 전송
        const response = await axios.post(webhookUrl, payload);

        // Slack 응답 상태 코드 확인
        if (response.status === 200) {
            console.log("Slack response:", response.data);
            return {
                statusCode: 200,
                body: JSON.stringify({
                    message: "Message sent to Slack successfully",
                    slackResponse: response.data
                }),
            };
        } else {
            throw new Error(`Slack responded with status: ${response.status}`);
        }
    } catch (error) {
        console.error("Error sending message to Slack:", error.message);
        return {
            statusCode: 500,
            body: JSON.stringify({
                message: "Failed to send message to Slack",
                error: error.message
            }),
        };
    }
};

Lambda 함수 압축

  • 코드 파일을 압축합니다.
zip function.zip index.mjs

4. Lambda 함수 배포 및 Layer 연결

AWS Lambda 콘솔 사용

AWS Lambda 콘솔에서 "함수 생성" 클릭

  • Lambda > 함수
  • 함수 이름 : sendSlackMessage
  • 런타임 : Node.js 22.x

Lambda

함수 생성 후 function.zip 파일을 업로드합니다.

  • 코드
  • 코드 업로드 : function.zip

Lambda

함수 생성 후 계층에 slack-layer를 추가합니다.

  • 코드 > 계층
  • "Add a layer" 버튼 클릭 후 slack-layer 선택

Lambda

  • 계층 소스 : 사용자 지정 계층
  • 사용자 지정 계층 : slack-layer
  • 버전 : 2

Lambda

환경 변수 설정

  • 구성 > 환경 변수
  • SLACK_WEBHOOK : Slack Webhook URL
SLACK_WEBHOOK: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
  • SLACK_CHANNEL : Slack 채널 이름 (예: #general)
SLACK_CHANNEL: #alerts

AWS CLI 사용

aws lambda create-function \
    --function-name send-slack-message \
    --runtime nodejs22.x \
    --role <execution-role-arn> \
    --handler index.handler \
    --code S3Bucket=<s3-bucket>,S3Key=function.zip \
    --layers <layer-arn>

5. 함수 테스트

AWS Lambda 콘솔에서 테스트 이벤트를 생성합니다.

  • 테스트
  • 이벤트 이름 : TestSlack)
  • 기본 템플릿으로 생성

테스트 실행

  • Slack 채널에 메시지가 전송됩니다.

Slack

 

AWS Lambda Layer와 Node.js를 사용하여 Slack Webhook 메시지를 성공적으로 구현했습니다.

 

728x90
반응형