Почему JavaScript aws-sdk ssm getParameter требует разрешений для всех параметров, а не только для одного, который мне нужен?

#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'} все , кажется, работает нормально.

Поговорим о бессмысленном сообщении об ошибке…