我正在使用 Middy 从 NodeJS AWS Lambda 中的 Secret Manager 获取机密。我确实为 Lambda 创建了一个角色来访问参数路径,但由于某些未知原因,该值没有设置上下文对象或环境变量。
process.env.SSM_PATH
的值为LAMBDA。
这是我正在使用的代码。
'use strict';
const middy = require('middy');
const { ssm } = require('middy/middlewares');
const handler = async (event, context) => {
console.log(context);
console.log(process.env)
console.log(event);
};
exports.handler = middy(handler).use(ssm({
setToContext: true,
paths: {
'PARAMETER': `/${process.env.SSM_PATH}/PARAMETER`
}
}));
这是 IAM 中 Lambda 策略的一部分。
{
"permissionsBoundary": {},
"roleName": "monitor_lambda_role",
"policies": [
{
"document": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Action": "sqs:sendMessage",
"Resource": "arn:aws:sqs:us-east-1::signed-resources-sqs"
},
{
"Sid": "",
"Effect": "Allow",
"Action": "ssm:GetParametersByPath",
"Resource": "arn:aws:ssm:us-east-1::parameter/LAMBDA/*"
},
{
"Sid": "",
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "arn:aws:ssm:us-east-1::alias/aws/ssm"
}
]
},
"name": "InlinePolicy",
"arn": "arn:aws:iam:::policy/InlinePolicy"
}
}
可能是由于 lambda 以异步方式运行,它不会等待 ssm 中间件来获取机密?
我解决了我的问题。
有两个选项用于指定您要读取的秘密:
paths(对象)(可选*):从中获取参数的 SSM 路径映射, 其中键是目标名称的前缀,值是 SSM 路径。示例:{路径:{DB_:'/dev/service/db'}}
names(对象)(可选*):从 SSM 获取的参数映射,其中 键是目的地,值是SSM中的参数名称。例子: {名称:{DB_URL:'/dev/service/db_url'}}
在我的特殊情况下,我应该使用
names
选项。
秘密管理器和参数存储是两个不同的主题。 您还可以尝试使用 middy 的秘密管理器插件 https://middy.js.org/docs/middlewares/secrets-manager/ 而不是 ssm 从秘密管理器获取秘密。