【发布时间】: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