简体   繁体   中英

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

I know how to invoke lambda functions that I've named and already exist as Lambda Functions but how can I have a FunctionA invoke FunctionB that I'm defining in AWS SAM template together, and won't know the name beforehand, aka dynamically.

Is there a way to pass the name of FunctionB as part of the SAM template before it gets created so the template would know the name of the full name of FunctionB, before creating FunctionA?

I see a lot of questions about testing this locally only

SAM is different than CloudFormation. SAM has a shortcut. The SAM resource type AWS::Serverless::Function simplifies this.

In this example SAM template, the example resource 'CallerFunction' has:

  1. A scoped policy to invoke the function 'microservice'
  2. An environment variable with the function name
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

Have fun with serverless!

You can pass the other function's name or ARN as an environment variable. For example:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM