从 AWS lambda 函数访问 Parameter Store 字符串时出错

Posted

技术标签:

【中文标题】从 AWS lambda 函数访问 Parameter Store 字符串时出错【英文标题】:Error while accessing the Parameter Store strings from AWS lambda function 【发布时间】:2021-07-01 10:08:42 【问题描述】:

我正在使用 AWS 的 Parameter Store 来存储 String 参数值。 我在从 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)

我什至尝试在 doc 之后添加 ssm 权限:


  "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 

知道我在这里可能缺少什么吗?提前致谢。

【问题讨论】:

操作是ssm:GetParameter,但您的策略是ssm:GetParameters 抱歉打错了,我更正了,但又是同样的问题 【参考方案1】:

ERROR SyntaxError: JSON 中位置 0 处的意外标记 h

当您添加 Administrator 权限时,会告诉您从参数存储中获取并最终通过 resp.Parameter.Value 传递给 JSON.parse 的信息是不正确的。

您的政策也是错误的,您将IAM PolicyTrust Policy 混合在一起。它们应该单独定义。

Roles terms and concepts

信任政策为您的 lambda IAM Role


  "Version": "2012-10-17",
  "Statement": [
    
      "Effect": "Allow",
      "Principal": 
        "Service": "lambda.amazonaws.com"
      ,
      "Action": "sts:AssumeRole"
    
  ]

用于 Lambda IAM 角色的 IAM 政策* 以允许访问 SSM 参数存储**


  "Version": "2012-10-17",
  "Statement": [
    
        "Sid": "GetParam1",
        "Effect": "Allow",
         "Action": "ssm:GetParameter",
         "Resource": "*"
    
  ]

这就是这些错误的原因

发生错误:AssumeRole 政策只能指定 STS AssumeRole 操作。 发生错误:已禁止字段资源

【讨论】:

以上是关于从 AWS lambda 函数访问 Parameter Store 字符串时出错的主要内容,如果未能解决你的问题,请参考以下文章

aws 如何从生产环境中的 lambda 函数访问 ECS 服务

AWS Lambda:如何为具有 VPC 访问权限的 lambda 函数设置 NAT 网关

从 VPC 中的 Lambda 访问 AWS S3

从java lambda调用aws Step函数

从 Spring Cloud Function 访问 AWS Lambda 上下文

aws lambda函数调用内部负载均衡器