为什么 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'}
后,一切似乎都很好。
谈论一个毫无意义的错误信息...
我在我的 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'}
后,一切似乎都很好。
谈论一个毫无意义的错误信息...