✨ 저의 Serverless 시리즈는 Typescript, yarn, AWS 기준으로 작성되므로 읽기 전 참고 바랍니다 ✨
Serverless, 이는 각 플랫폼에 맞게 코드가 구성이 되어야합니다.
그 중 제가 중점으로 다루는 aws-lambda
에서는 함수 핸들러를 제공합니다.
두가지로 크게 나눌 수 있습니다.
그리고 이를 정확히 알지 못하면, 의문의 에러를 만날수도 있습니다.
아니라고요?
괜찮아요, 제가 그랬어요
함수에서 return
을 사용하면 그 값이 반환되는 것처럼
return
되는 값을 호출자에게 반환해줍니다.
exports.handler = async function(event, context) {
console.log("EVENT: \n" + JSON.stringify(event, null, 2))
return context.logStreamName
}
그리고 이는 비동기의 상황에서도 마찬가지입니다.
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
}
또는
const AWS = require('aws-sdk')
const s3 = new AWS.S3()
exports.handler = async function(event) {
return s3.listBuckets().promise()
}
Promise
를 다루게 된다면, Promise
를 직접적으로 반환해도 괜찮습니다.
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))
})
}
다음과 같이 런타임 중에 호출자에게 반환할 값을 지정해줄 수 있습니다.
함수는 이벤트 루프가 비거나, 함수 제한시간을 초과할때까지 작동합니다.
그리고 응답은 모든 이벤트 루프, 즉 작업이 마무리 되기 전까지 반환되지않습니다.
그러기에 DB가 연동되어있을 경우, 끊어주기전까지는 계속 작동하는 것이고, 제한시간을 초과하여 502에러가 호출자에게 리턴될 것 입니다.
누가 그런 에러가 나냐고요?
바로 접니다 ㅎㅎ....
만약 callback 호출 시 즉시 호출자에게 값을 반환해주고 싶다면 다음값을 설정해보세요.
context.callbackWaitsForEmptyEventLoop
를 false
로 설정한다면, callback 호출 즉시 값이 반환됩니다.
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)
}