2

正在考虑使用 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 中还没有顶级等待,有没有办法解决处理函数之外的变量?是否可以等待 API 调用await param.value完成,以便我可以使用存储在 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 变量映射的方法。

4

1 回答 1

3

在这种情况下,基本上没有简单的方法来执行顶级等待,但是有一些简单的解决方法。例如,这是另一个可用于初始化 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 时。

于 2020-08-27T14:54:03.593 回答