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



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

我尝试为lambda函数板条模板板条,以定义该函数可以调用和调用的服务。应该使用Cognito用户池触发器运行。

为此,我在类型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"

我插入的第二个策略限制资源可以在堆栈创建期间称我的功能失败:

策略文件不应指定本金。

当我使用principal 删除该策略时,通过用户池触发器访问该功能。

我确定应将权限创建为具有AWS::Lambda::Permission类型的独立资源,该资源可以将其附加到。

的函数名称或ARN。

因此,以下逻辑成功地创建了使用权限(又称功能策略(的功能:

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

最新更新