【问题标题】:Cache async API result outside of AWS Lambda execution handler在 AWS Lambda 执行处理程序之外缓存异步 API 结果
【发布时间】:2020-12-12 01:00:25
【问题描述】:

正在考虑使用 SSM Parameter Store SDK 来获取 lambda 函数的秘密。我还使用epsagon 来包装异步处理函数。 Epsagon 需要用一些秘密进行初始化,然后用于包装处理函数:

import * as epsagon from 'epsagon'

epsagon.init({
  token: EPSAGON_ACCOUNT_TOKEN,
})

export const lambdaHandler = epsagon.lambdaWrapper(async (event) => {
  // do stuff
  
})

开始使用 aws-parameter-cache 从 SSM 参数存储中获取配置值,但由于它们是通过 API 调用解析的,因此需要 await 才能完全解析这些值。

import { ssmParameter } from 'aws-parameter-cache'

const param = ssmParameter({ name: 'foo' })
const value = await param.value; // <-- can only be done inside an async function (nodejs12)

由于我们在 nodejs12 中还没有顶级 await,有没有办法在处理函数之外解析变量?是否可以等待await param.value 的 API 调用完成,以便我可以使用存储在 SSM 参数存储中的值初始化 epsagon?

import * as epsagon from 'epsagon'
import { ssmParameter } from 'aws-parameter-cache'
const ssmParam = ssmParameter({ name: 'epsagonToken' })

const epsagonToken = await ssmParam.value // fails since outside of async func

epsagon.init({
  token: epsagonToken,
})

export const lambdaHandler = epsagon.lambdaWrapper(async (event) => {
  const epsagonToken = await ssmParam.value // works here but too late
})

这在 nodejs 14.3.0 中是否可以“正常工作”并带有顶级等待?自定义运行时?

或者可能是某种形式的永不拒绝的顶级异步函数,例如对此的最佳答案:how-can-i-use-async-await-at-the-top-level?

需要处理程序作为顶级异步函数的回调——据我所读,这基本上是顶级异步在 14.3 中的工作方式。寻找将所有秘密存储在 SSM 参数存储中并减少 cf 模板 ENV 变量映射的方法。

【问题讨论】:

    标签: amazon-web-services aws-lambda async-await aws-sdk-nodejs aws-systems-manager


    【解决方案1】:

    在这种情况下,基本上没有简单的方法来执行顶级等待,但有一些简单的解决方法。例如,这里是另一个包装器的实现,您可以使用它来初始化 Epsagon:

    import * as epsagon from 'epsagon'
    import { ssmParameter } from 'aws-parameter-cache'
    const ssmParam = ssmParameter({ name: 'epsagonToken' })
    
    const withEpsagon = (wrapped) => {
      let epsagonInited = false
      const epsagonizedFunction = epsagon.lambdaWrapper(wrapped)
      return async (event, context, callback) => {
        if (!epsagonInited) {
          const epsagonToken = await ssmParam.value
          epsagon.init({
            token: epsagonToken,
          })
          epsagonInited = true
        }
        return epsagonizedFunction(event, context, callback)
      }
    }
    
    export const lambdaHandler = withEpsagon(async (event) => {
        // your code here
    })
    

    此代码将在第一次执行时解析 SSM 参数(在冷启动之后,无论如何您都必须在冷启动上花费时间),并记住它已经初始化了 Epsagon,因此您没有每次调用 Lambda 都浪费时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-09
      • 2016-05-01
      • 2019-01-28
      • 2018-12-29
      • 2017-09-29
      • 1970-01-01
      • 2014-01-15
      • 2019-04-04
      相关资源
      最近更新 更多