퍼블릭 클라우드
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
함수 생성 후 function.zip 파일을 업로드합니다.
- 코드
- 코드 업로드 : function.zip
함수 생성 후 계층에 slack-layer를 추가합니다.
- 코드 > 계층
- "Add a layer" 버튼 클릭 후 slack-layer 선택
- 계층 소스 : 사용자 지정 계층
- 사용자 지정 계층 : slack-layer
- 버전 : 2
환경 변수 설정
- 구성 > 환경 변수
- 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 채널에 메시지가 전송됩니다.
AWS Lambda Layer와 Node.js를 사용하여 Slack Webhook 메시지를 성공적으로 구현했습니다.
728x90
반응형