amazon-web-services - 在 AWS Lambda 执行处理程序之外缓存异步 API 结果

标签 amazon-web-services aws-lambda async-await aws-sdk-nodejs aws-ssm

正在考虑使用 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/

相关文章:

amazon-web-services - 如何在本地服务器上配置 AWS 角色?

amazon-web-services - 如何使 AWS API 网关指向 "understand"尾部斜杠?

javascript - 在 AWS Lambda Javascript 文件中包含 Javascript 引用

javascript - 使用 Javascript Fetch API 对异步获取的数据进行排序

c# - 异步无效方法如何报告 ASP.NET Core 应用程序中的进度

amazon-web-services - 使用单个构建规范文件在 CodeBuild 中运行批量构建

amazon-web-services - Amazon Lightsail 上的 CodeDeploy 本地注册失败并出现 AccessDeniedException

c# - 使用 log4net 记录时“等待”不返回 UI 线程

amazon-web-services - AWS CloudFormation 与 VPC 和子网相关的问题

mysql - 在 AWS 上的 Lambda 中重用 Mysql 连接