Укажите ресурсы, разрешенные для вызова функции, в ее шаблоне функции AWS SAM. - PullRequest
0 голосов
/ 23 мая 2019

TL; DR: Как мне отредактировать шаблон ниже, чтобы он мог запускаться триггером пула пользователей?

Я пытаюсь создать шаблон CloudFormation для лямбда-функции, определяющей обе службы, из которых функция может вызываться и вызываться. Он должен быть запущен с помощью триггера Cognito User Pool.

Для этого я определил ресурс в шаблоне типа AWS::Serverless::Function кратко следующим образом. Следите за разделом Policies:

Resources:
  MyFunctionResource:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: MyFunctionName
      CodeUri: ./
      Handler: "lambda_function.lambda_handler"
      MemorySize: 128
      Runtime: python3.7
      Timeout: 3
      Policies:
        - Version: "2012-10-17"
          Statement:
            - Effect: Allow
              Action:
                - "cognito-idp:*"
                - "logs:*"
                ...
              Resource: "*"
        - Version: "2012-10-17"
          Statement:
            - Effect: Allow
              Action: "lambda:InvokeFunction"
              Principal:
                Service: cognito-idp.amazonaws.com
              Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:MyFunctionName"

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

В документе политики не должен указываться принципал. (Сервис: AmazonIdentityManagement; Код состояния: 400; Код ошибки: MalformedPolicyDocument; Идентификатор запроса: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

Когда я удаляю эту политику с принципалом , доступ к функции через триггер пула пользователей запрещается.

1 Ответ

0 голосов
/ 24 мая 2019

Я понял, что разрешения должны быть созданы как отдельный ресурс с типом AWS::Lambda::Permission, который может принимать имя функции или арн, к которому она будет присоединена.

Таким образом,Следующая логика успешно создает функцию с разрешениями (она же Function Policy):

Resources:
  MyFunctionResource:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: MyFunctionName
      CodeUri: ./
      Handler: "lambda_function.lambda_handler"
      MemorySize: 128
      Runtime: python3.7
      Timeout: 3
      Policies:
        - Version: "2012-10-17"
          Statement:
            - Effect: Allow
              Action:
                - "cognito-idp:*"
                - "logs:*"
                ...
              Resource: "*"
## Remove this section
#       - Version: "2012-10-17"
#         Statement:
#           - Effect: Allow
#             Action: "lambda:InvokeFunction"
#             Principal:
#               Service: cognito-idp.amazonaws.com
#             Resource: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:MyFunctionName"

## Add this instead
  MyFunctionPermissions:
    Type: AWS::Lambda::Permission
    Properties:
      Action: "lambda:InvokeFunction"
      FunctionName: !GetAtt MyFunctionResource.Arn
      Principal: "cognito-idp.amazonaws.com"
      SourceArn: !Sub "arn:aws:cognito-idp:${AWS::Region}:${AWS::AccountId}:userpool/*"
...