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
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