Search code examples
amazon-web-servicesaws-lambdaaws-cloudformationboto3aws-sam-cli

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


Solution

  • 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