#javascript #amazon-web-services #aws-lambda #aws-parameter-store
Вопрос:
Я использую javascript в своем aws lambda, он вызывает 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 .-_
Ответ №1:
Похоже, что решением было поставить перед именем параметра префикс»/».
В своем примере я использовал {Name: 'my/parameter'}
После использования {Name: '/my/parameter'}
все , кажется, работает нормально.
Поговорим о бессмысленном сообщении об ошибке…