在其AWS SAM函数模板中指定允许调用函数的资源

时间:2019-05-23 20:19:49

标签: aws-lambda amazon-iam aws-sam

TL; DR:我应该如何编辑下面的模板,以便可以由用户池触发器触发?

我尝试为Lambda函数创建CloudFormation模板,以定义该函数可以调用和可以从中调用的服务。它应与Cognito用户池触发器一起运行。

为此,我在Front类型的模板中简要定义了一个资源,如下所示。请注意AWS::Serverless::Function部分:

Policies

我插入的用于限制资源的第二个策略可以在堆栈创建期间调用我的函数失败:

  

策略文档不应指定主体。 (服务:AmazonIdentityManagement;状态代码:400;错误代码:MalformedPolicyDocument;请求ID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxx)

当我删除带有主体的策略时,将拒绝通过用户池触发器访问该功能。

1 个答案:

答案 0 :(得分:0)

我发现,应该将权限创建为类型为AWS::Lambda::Permission的单独资源,该资源可以采用函数名称,也可以附加到该函数名称。

因此,以下逻辑成功创建了具有权限(也称为功能策略)的功能:

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/*"