【问题标题】:How to get Express app config asynchronously?如何异步获取 Express 应用配置?
【发布时间】:2021-05-14 17:41:53
【问题描述】:

我有一个使用无服务器框架开发的 Express 应用程序,将通过 AWS API Gateway 和 AWS Lambda 提供服务。它使用 Okta 进行身份验证,我想将各种秘密存储在 SSM 中。现在我必须在部署 Lambda 之前从 SSM 检索秘密并将它们存储在环境变量中,但如果可能的话,我想在调用 Lambda 时从 SSM 检索它们。这可能吗?

这里有一些类似于我的代码(这是一个工作项目,所以我不能随意分享实际代码)。注意这里的main设置为Lambda处理程序。

import { APIGatewayProxyHandler } from 'aws-lambda'
import 'source-map-support/register'
import serverless from 'serverless-http'
import express from 'express'
import bodyParser from 'body-parser'
import { ExpressOIDC } from '@okta/oidc-middleware'
import session from 'express-session'

const jsonParser = bodyParser.json()
const app = express()
app.engine('pug', require('pug').__express)
app.use(express.static('static'))

const oidc = new ExpressOIDC({
  issuer: process.env.ISSUER, // `https://${oktaDomain}/oauth2/default`
  client_id: process.env.CLIENT_ID, // Stored in SSM
  client_secret: process.env.CLIENT_SECRET, // Stored in SSM
  appBaseUrl: process.env.APP_BASE_URL, // `https://${apiGatewayId}.execute-api.${AWS::Region}.amazonaws.com/prod`
  scope: 'openid profile'
})

app.use(session({
  secret: process.env.SESSION_SECRET!, // Stored in SSM
  resave: true,
  saveUninitialized: false
}))
app.use(oidc.router)

app.set('view engine', 'pug')
app.set('views', './views')

app.get('/', oidc.ensureAuthenticated(), async (_req, res) => res.render('index'))

app.get('/status/:taskId', oidc.ensureAuthenticated(), async (req, res) => { ... })

app.post('/doPost', oidc.ensureAuthenticated(), jsonParser, async (req, res) => { ... })

export const main: APIGatewayProxyHandler = serverless(
  app
) as APIGatewayProxyHandle

【问题讨论】:

  • 或许SSM API?
  • 嗯,是的,但是异步调用 SSM API。这就是症结所在 - 如何在初始化应用程序之前等待 SSM 调用。
  • 由于我的处理程序可以是异步方法,我想我可以做一些事情,等待 SSM 调用,初始化应用程序,然后返回 serverless(app)。但是,我需要在弄乱它之前让它工作,而且我还没有让它工作。 :D
  • 如果您展示了您正在使用的 SSM 调用的代码,那么我们可以向您展示如何在初始化应用程序之前调用它。无法为您提供我们看不到的代码。
  • 这可能会有所帮助。我会将其发布为答案,但我尚未对其进行测试。基本上我会这样做: export const main = async (event, context) => { ssmConfig = await getSsmConfig(); // 这将处理从 SSM 检索内容 const app = buildApp(ssmConfig); // 使用 ssm 的配置构建应用程序 const handle = serverless(app);返回句柄(事件,上下文); } 来源:github.com/serverless-components/express/commit/…

标签: node.js typescript express async-await


【解决方案1】:

这个看起来它会起作用,但我还没有测试它来确认。灵感来自 this Serverless Express PR

import { APIGatewayProxyHandler } from 'aws-lambda'
import 'source-map-support/register'
import serverless from 'serverless-http'
import express from 'express'
import bodyParser from 'body-parser'
import { ExpressOIDC } from '@okta/oidc-middleware'
import session from 'express-session'

const jsonParser = bodyParser.json()

// Retrieve stuff from SSM
const ssmConfig = async() => { ... }

const buildApp(ssmConfig) = (ssmConfig: Record<string, string>) => {
  const app = express()
  app.engine('pug', require('pug').__express)
  app.use(express.static('static'))

  const oidc = new ExpressOIDC({
    issuer: ssmConfig.ISSUER, // `https://${oktaDomain}/oauth2/default`
    client_id: process.env.CLIENT_ID, // Stored in SSM
    client_secret: process.env.CLIENT_SECRET, // Stored in SSM
    appBaseUrl: process.env.APP_BASE_URL, // `https://${apiGatewayId}.execute-api.${AWS::Region}.amazonaws.com/prod`
    scope: 'openid profile'
  })

  app.use(session({
    secret: process.env.SESSION_SECRET!, // Stored in SSM
    resave: true,
    saveUninitialized: false
  }))

  app.use(oidc.router)

  app.set('view engine', 'pug')
  app.set('views', './views')

  app.get('/', oidc.ensureAuthenticated(), async (_req, res) => res.render('index'))

  app.get('/status/:taskId', oidc.ensureAuthenticated(), async (req, res) => { ... })

  app.post('/doPost', oidc.ensureAuthenticated(), jsonParser, async (req, res) => { ... }) 

  return app
}

export const main: APIGatewayProxyHandler = async (event, context) => { 
    ssmConfig = await getSsmConfig(); // this would handle retrieving stuff from SSM
    const app = buildApp(ssmConfig); // build the app w/ config from ssm
    const handle = serverless(app);
    return handle(event, context); // I might need to add an "as <something or other>" to make TypeScript happy
}

【讨论】:

    猜你喜欢
    • 2011-08-25
    • 2021-03-15
    • 1970-01-01
    • 2021-02-07
    • 2019-07-02
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多