Управляемая политика AWS SAM для параметра получения SSM

Есть ли какая-либо управляемая политика, аналогичная DynamoDBReadPolicy для разрешения ssm:GetParameter* для лямбда-функции? Я использую aws-sam-cli и пытаюсь следовать this, но когда я пытаюсь получить параметры при использовании sam local start-api, я получаю следующую ошибку:

InvalidAction: The action or operation requested is invalid. Verify that the action is typed correctly.

Вот фрагмент, в котором я пытаюсь получить параметр:

const ssm = new AWS.SSM();
const param = {
    Name: "param1",
    WithDecryption: true
};
const secret = await ssm.getParameter(param).promise();

Соответствующие разделы шаблона приведены ниже. Спасибо!

KeyAlias:
    Type: AWS::KMS::Alias
    Properties:
      AliasName: 'param1Key'
      TargetKeyId: !Ref Key
Key:
    Type: AWS::KMS::Key
    Properties:
      KeyPolicy:
        Id: default
        Statement:
        - Effect: Allow
          Principal:
            AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
          Action:
          - 'kms:Create*'
          - 'kms:Encrypt'
          - 'kms:Describe*'
          - 'kms:Enable*'
          - 'kms:List*'
          - 'kms:Put*'
          - 'kms:Update*'
          - 'kms:Revoke*'
          - 'kms:Disable*'
          - 'kms:Get*'
          - 'kms:Delete*'
          - 'kms:ScheduleKeyDeletion'
          - 'kms:CancelKeyDeletion'
          Resource: '*'
          Sid: Allow root account all permissions except to decrypt the key
        Version: 2012-10-17

LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ../
      Handler: app.lambda
      Runtime: nodejs8.10
      Policies:
      - DynamoDBReadPolicy:
          TableName: !Ref Table
      - KMSDecryptPolicy:
          KeyId: !Ref Key
      # I think I need the ssm policy here



Ответы (1)


Доступные шаблоны политик SAM перечислены в их Github. репозиторий. Ни один из этих шаблонов политики не предоставляет разрешения для какой-либо операции SSM, поэтому на данный момент вы не можете использовать шаблон политики SAM для предоставления вашей функции AWS Lambda доступа к параметрам SSM.

Что вы можете сделать в качестве обходного пути, так это вручную добавить требуемый оператор политики в свои политики. Это будет выглядеть так:

LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ../
      Handler: app.lambda
      Runtime: nodejs8.10
      Policies:
      - DynamoDBReadPolicy:
          TableName: !Ref Table
      - KMSDecryptPolicy:
          KeyId: !Ref Key
      - Statement:
        - Action:
            - ssm:GetParameter
          Effect: Allow
          Resource: arn:aws:ssm:region:account-id:parameter/parameter_name

Вам также следует рассмотреть возможность открытия пул-реквеста для добавления шаблона политики для доступа к параметрам SSM в SAM, поскольку такой шаблон, конечно, был бы более удобным способом выражения таких разрешений. По моему опыту, разработчики очень дружелюбны и всегда приветствуют такие дополнения.

Обновление. В AWS SAM теперь есть SSMParameterReadPolicy, поэтому вместо обходного пути вы можете просто сделать следующее:

LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ../
      Handler: app.lambda
      Runtime: nodejs8.10
      Policies:
      - DynamoDBReadPolicy:
          TableName: !Ref Table
      - KMSDecryptPolicy:
          KeyId: !Ref Key
      - SSMParameterReadPolicy:
          ParameterName: parameter_name
person Dunedan    schedule 18.11.2018
comment
Спасибо! Это помогает получить параметр при развертывании, но при локальном тестировании я все равно получаю ошибку Invalid Action. Возможно, SSM не существует при локальном запуске? - person holtc; 19.11.2018
comment
Верно. При использовании AWS SAM CLI для локального запуска приложений хранилище параметров SSM также недоступно локально. По совпадению, недавно я открыл вопрос по этому поводу: github.com/awslabs/aws -sam-cli / issues / 616 - person Dunedan; 19.11.2018
comment
SSMParameterReadPolicy сейчас существует - person DylanReile; 13.02.2019