Serverless, callback? return?

오병진·2022년 1월 4일
0
post-thumbnail
post-custom-banner

✨ 저의 Serverless 시리즈는 Typescript, yarn, AWS 기준으로 작성되므로 읽기 전 참고 바랍니다 ✨

Serverless, 이는 각 플랫폼에 맞게 코드가 구성이 되어야합니다.
그 중 제가 중점으로 다루는 aws-lambda에서는 함수 핸들러를 제공합니다.

  1. return
  2. callback

두가지로 크게 나눌 수 있습니다.
그리고 이를 정확히 알지 못하면, 의문의 에러를 만날수도 있습니다.

아니라고요?
괜찮아요, 제가 그랬어요

return

함수에서 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를 직접적으로 반환해도 괜찮습니다.

callback

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.callbackWaitsForEmptyEventLoopfalse로 설정한다면, 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)
}

끝!

profile
지나가는 사람입니다. 마저 지나갈게요 :D
post-custom-banner

0개의 댓글