正在考虑使用 SSM 参数存储 SDK 来获取 lambda 函数的 secret 。我也在使用epsagon包装异步处理函数。 Epsagon需要使用一些 secret 进行初始化,然后用于包装处理函数:
import * as epsagon from 'epsagon'
epsagon.init({
token: EPSAGON_ACCOUNT_TOKEN,
})
export const lambdaHandler = epsagon.lambdaWrapper(async (event) => {
// do stuff
})
开始使用aws-parameter-cache
从 SSM Param Store 获取配置值,但由于它们是通过 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 Param Store 中的值初始化 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 参数存储中存储所有 secret 并减少 cf 模板 ENV 变量映射的方法。
最佳答案
基本上,在这种情况下没有简单的方法来执行顶级等待,但有一些简单的解决方法。例如,下面是另一个包装器的实现,您可以使用它来初始化 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 时都会浪费时间。
关于amazon-web-services - 在 AWS Lambda 执行处理程序之外缓存异步 API 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63543219/