AWS Lambda 함수 핸들러(Node.js)
Lambda 함수의 핸들러는 이벤트를 처리하는 함수 코드의 메서드입니다. 함수가 호출되면 Lambda는 핸들러 메서드를 실행합니다. 핸들러가 존재하거나 응답을 반환할 때, 또 다른 이벤트를 처리하기 위해 사용할 수 있게 됩니다.
다음 예제 함수는 이벤트 객체의 내용을 로깅하고 로그의 위치를 반환합니다.
예 index.js
exports.handler = async function(event, context) { console.log("EVENT: \n" + JSON.stringify(event, null, 2)) return context.logStreamName }
함수를 구성할 때, 핸들러 설정의 값은 파일의 이름과 내보낸 핸들러 모듈의 이름이며 점으로 구분됩니다. 콘솔의 기본값은 예를 들어, 이 가이드에서는 index.handler
입니다. 이는 handler
파일에서 내보낸 index.js
메서드를 나타냅니다.
런타임은 3개의 인수를 핸들러 메서드에 전달합니다. 첫 번째 인수는 호출자로부터의 정보가 포함된 event
객체입니다. 이 정보는 Invoke를 호출할 때 호출자가 JSON 형식 문자열로 전달하고, 런타임은 이 졍보를 객체로 변환합니다. AWS 서비스가 함수를 호출할 때, 이벤트 구조는 서비스별로 다릅니다.
두 번째 인수는 컨텍스트 객체이며, 여기에는 호출, 함수 및 실행 환경에 대한 정보가 포함되어 있습니다. 이전 예제에서는, 함수가 컨텍스트 객체로부터 로그 스트림의 이름을 가져와서 호출자에게 반환합니다.
세 번째 인수 callback
은 응답을 전송하기 위해 비동기 이외의 핸들러에서 호출할 수 있는 함수입니다. 콜백 함수는 두 개의 인수, Error
및 응답을 사용합니다. 호출하면 Lambda는 이벤트 루프가 비워질 때까지 기다린 다음 응답이나 오류를 호출자에게 반환합니다. 응답 객체는 JSON.stringify
와 호환되어야 합니다.
비동기 함수 핸들러의 경우, callback
을 사용하는 대신 응답, 오류 또는 promise를 런타임에 반환합니다.
함수에 추가 종속성이있는 경우 npm을 사용하여 배포 패키지에 포함합니다.
비동기 핸들러
비동기 핸들러의 경우, return
및 throw
를 사용하여 응답 또는 오류를 각각 전송할 수 있습니다. 함수는 이러한 메서드를 사용하여 응답 또는 오류를 반환하려면 async
키워드를 사용해야 합니다.
해당 코드가 비동기식 작업을 수행하는 경우, 실행을 완료할 수 있도록 promise를 반환하세요. promise를 해결하거나 거부하면 Lambda가 응답 또는 오류를 호출자에 전송합니다.
예 index.js 파일 - 비동기 핸들러와 promise가 포함된 HTTP 요청
const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler =
async
function(event) { const promise = new Promise(function(resolve, reject) { https.get(url, (res) => { resolve(res.statusCode) }).on('error', (e) => { reject(Error(e)) }) }) return promise }
promise를 반환하는 라이브러리의 경우, 해당 promise를 런타임에 직접 반환할 수 있습니다.
예 index.js 파일 - 비동기 핸들러와 promise가 포함된 AWS SDK
const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = async function(event) { return s3.listBuckets().promise() }
Node.js 모듈 및 최상위 레벨 사용
함수 코드를 ES 모듈로 지정하여 함수 핸들러 범위 밖의 파일 최상위 레벨에서 await
를 사용할 수 있습니다. 이것은 핸들러 호출 전에 비동기 초기화 코드의 완료를 보장하여 콜드 스타트 대기 시간의 프로비저닝된 동시성이 가지는 효과를 극대화해 줍니다. 이 작업은 두 가지 방법으로 수행할 수 있습니다. 즉, 함수의 type
파일에서 module
을 package.json
로 지정하거나 .mjs 파일명 확장자를 사용할 수 있습니다.
첫 번째 시나리오에서는 함수 코드가 모든 .js 파일을 ES 모듈로 취급하고, 두 번째 시나리오에서는 .mjs를 사용하여 지정한 파일만 ES 모듈입니다. .mjs 파일은 항상 ES 모듈이며 .cjs 파일은 항상 CommonJS 모듈이므로 ES 모듈과 CommonJS 모듈의 이름을 각각 .mjs 및 .cjs로 지정하여 모듈을 혼합할 수 있습니다.
자세한 내용과 예제는 AWS Lambda에서 Node.js ES 모듈 및 최상위 레벨 대기
비동기 이외의 핸들러
다음 예제 함수는 URL을 확인하고 상태 코드를 호출자에게 반환합니다.
예 index.js 파일 - 콜백이 포함된 HTTP 요청
const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler = function(event, context, callback) { https.get(url, (res) => {
callback(null, res.statusCode)
}).on('error', (e) => {callback(Error(e))
}) }
비동기 이외의 핸들러의 경우, 이벤트 루프
다음 예제에서는, Amazon S3로부터의 응답이 사용 가능해지는 즉시 호출자에게 반환됩니다. 이벤트 루프에서 실행 중인 제한 시간은 동결되고 다음에 함수가 호출될 때 계속 실행됩니다.
예 index.js 파일 - callbackWaitsForEmptyEventLoop
const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = function(event, context, callback) { context.callbackWaitsForEmptyEventLoop = false s3.listBuckets(null, callback) setTimeout(function () { console.log('Timeout complete.') }, 5000) }