为什么 JavaScript aws-sdk ssm getParameter 需要所有参数的权限,而不是我需要的那个?

Why does JavaScript aws-sdk ssm getParameter require permissions for all parameters instead of just the one I need?

我在我的 aws lambda 中使用 javascript,它调用 SSM getParameter 并且 lambda 的执行角色对我要获取其值的密钥具有适当的权限。

最初,我遇到了这个特定错误:

ERROR   AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/my-role/my-lambda is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:123456789:parameter/my/parameter

具体的错误是有道理的,所以我更正了我的策略,因为我不小心将 GetParameters 而不是 GetParameter。但是现在,我收到了这个可疑的错误(注意末尾的 *):

ERROR   AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/my-role/my-lambda is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:us-east-1:123456789:*

这个错误对我来说没有任何意义。为什么我需要访问每个参数?我只需要我要的那个。

相关代码如下:

const data = await ssm.getParameter({Name: 'my/parameter', WithDecryption: true}).promise();

和权限策略(在 CloudFormation 模板中创建)

MyLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: my-role
      Description: my-role description
      Policies:
        - PolicyName: cloudwatch-access
          ...
        - PolicyName: parameter-store-access
          PolicyDocument:
            Statement:
              - Effect: Allow
                Action:
                  - "ssm:GetParameter"
                Resource:
                  - !Sub "arn:aws:ssm:*:${AWS::AccountId}:parameter/my/parameter"
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'

编辑:

更改权限策略以匹配错误消息后,我现在遇到这个奇怪的错误:

ERROR   ValidationException: Parameter name: can't be prefixed with "ssm" (case-insensitive). If formed as a path, it can consist of sub-paths divided by slash symbol; each sub-path can be formed as a mix of letters, numbers and the following 3 symbols .-_

看起来解决方案是在参数名称前加上“/”前缀。

在我的示例中,我使用了 {Name: 'my/parameter'}
使用 {Name: '/my/parameter'} 后,一切似乎都很好。

谈论一个毫无意义的错误信息...