问题描述
我使用 AWS 的 Parameter Store 来存储字符串参数值。 我在从 Lambda 函数获取参数时使用以下代码:
const ssm = require('aws-sdk/clients/ssm');
const getConfig = (prefix) => {
return ssm.getParameter({ Name: `/${prefix}/config`}).promise()
.then(resp => JSON.parse(resp.Parameter.Value))
.catch(err => console.error(err));
};
但我在从 AWS 控制台运行 Lambda 时不断收到以下错误:
ERROR AccessDeniedException: User: arn:aws:sts::XXX:assumed-role/lambdaExecutionRole is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:XXX:parameter/get/getValue
我尝试向角色添加管理员访问权限:lambdaExecutionRole,但现在出现此错误:
ERROR SyntaxError: Unexpected token h in JSON at position 0
at JSON.parse (<anonymous>)
at /var/task/myFile.js:2:955529
at processticksAndRejections (internal/process/task_queues.js:97:5)
at async Runtime.e.handler (/var/task/myFile.js:2:1065241)
{
"Version": "2012-10-17","Statement": [
{
"Effect": "Allow","Principal": {
"Service": "lambda.amazonaws.com"
},"Action": "sts:AssumeRole"
},{
"Sid": "GetParam1","Effect": "Allow","Principal": {
"Service": "lambda.amazonaws.com"
},"Action": "ssm:GetParameter","Resource": "*"
}
]
}
- An error occurred: AssumeRole policy may only specify STS AssumeRole actions.
- An error occurred: Has prohibited field Resource
知道我在这里可能遗漏了什么吗?提前致谢。
解决方法
ERROR SyntaxError: JSON 中的意外标记 h 在位置 0
当您添加 Administrator
时,权限告诉您从参数存储中获取并最终通过 JSON.parse
传递给 resp.Parameter.Value
的信息是不正确的。
您的政策也是错误的,您将 IAM Policy
与 Trust Policy
混在一起。它们应该单独定义。
信任政策,适用于您的 lambda IAM Role
{
"Version": "2012-10-17","Statement": [
{
"Effect": "Allow","Principal": {
"Service": "lambda.amazonaws.com"
},"Action": "sts:AssumeRole"
}
]
}
Lambda IAM 角色的 IAM 策略*,允许访问 SSM Parameter Store**
{
"Version": "2012-10-17","Statement": [
{
"Sid": "GetParam1","Effect": "Allow","Action": "ssm:GetParameter","Resource": "*"
}
]
}
这就是这些错误的原因
- 发生错误:AssumeRole 政策只能指定 STS AssumeRole 操作。
- 发生错误:已禁止字段资源