Sé cómo invocar funciones lambda que he nombrado y que ya existen como funciones Lambda, pero ¿cómo puedo hacer que una función A invoque una función B que estoy definiendo en la plantilla AWS SAM juntas y no conoceré el nombre de antemano, también conocido como dinámicamente?
¿Hay alguna manera de pasar el nombre de FunctionB como parte de la plantilla SAM antes de que se cree para que la plantilla conozca el nombre completo de FunctionB, antes de crear FunctionA?
Veo muchas preguntas sobre probar esto solo localmente
SAM es diferente a CloudFormation. SAM tiene un atajo. El tipo de recurso SAM AWS::Serverless::Function simplifica esto.
En esta plantilla SAM de ejemplo, el recurso de ejemplo 'CallerFunction' tiene:
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¡Diviértete con serverless!
Puede pasar el nombre o el ARN de la otra función como una variable de entorno. Por ejemplo:
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