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

时间:2020-03-25 05:04:52

标签: amazon-web-services aws-lambda amazon-cloudformation boto3 aws-sam-cli

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

是否可以在创建SAM模板之前将FunctionB的名称作为SAM模板的一部分进行传递,以便模板在创建FunctionA之前知道FunctionB的全名?

我看到了很多有关仅在本地进行测试的问题

2 个答案:

答案 0 :(得分:3)

您可以将另一个函数的名称或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

答案 1 :(得分:3)

SAM与CloudFormation不同。 SAM有一个快捷方式。 SAM资源类型AWS::Serverless::Function简化了这一过程。

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

  1. 用于调用功能“微服务”的作用域策略
  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

享受无服务器的乐趣!