如何调用同样在 AWS SAM 模板中定义的另一个 lambda 函数?

How can I invoke another lambda function also defined in AWS SAM template?

我知道如何调用已命名并已作为 Lambda 函数存在的 lambda 函数,但我如何才能让 FunctionA 调用我在 AWS SAM 模板中定义的 FunctionB,并且不知道名称事先,又名动态。

有没有办法在创建 FunctionB 之前将 FunctionB 的名称作为 SAM 模板的一部分传递,以便模板在创建 FunctionA 之前知道 FunctionB 的全名?

我看到很多关于只在本地测试这个的问题

您可以将其他函数的名称或 ARN 作为环境变量传递。例如:

Resources:
  FunctionA:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.6
      Role: !Sub ${FunctionRole.Arn}
      Environment:
        Variables:
          # pass FunctionB ARN as environment variable
          FUNCTION_B_ARN: !Sub ${FunctionB.Arn}
      Code:
        ZipFile: |
          import os
          def handler(event, context):
            # use environment variable
            print(os.getenv("FUNCTION_B_ARN"))
  FunctionB:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.6
      Role: !Sub ${FunctionRole.Arn}
      Code:
        ZipFile: |
          def handler(event, context):
            print("hello world")
  FunctionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - sts:AssumeRole
            Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
        Version: '2012-10-17'
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

SAM 不同于 CloudFormation。 SAM 有一条捷径。 SAM 资源类型 AWS::Serverless::Function 简化了这一点。

在此示例 SAM 模板中,示例资源 'CallerFunction' 具有:

  1. 调用函数的作用域策略'microservice'
  2. 具有函数名称的环境变量
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  A SAM template where lambda function caller invokes lambda function microservice.

Resources:
  CallerFunction:
    Type: AWS::Serverless::Function 
    Properties:
      Description: 'A lambda that invokes the function microservice'
      CodeUri: caller/
      Handler: app.handler
      Runtime: nodejs10.x
      Policies: 
        - LambdaInvokePolicy:
            FunctionName:
              !Ref MicroserviceFunction
      Environment:
        Variables:
          MICROSERVICE_FUNCTION: !Ref MicroserviceFunction
  MicroserviceFunction:
    Type: AWS::Serverless::Function 
    Properties:
      Description: 'A microservice lambda'
      CodeUri: microservice/
      Handler: index.handler
      Runtime: nodejs10.x
      Policies: CloudWatchLogsFullAccess

享受无服务器带来的乐趣!