我知道如何调用已经命名为Lambda函数且已经存在的lambda函数,但是我如何让FunctionA一起调用我在AWS SAM模板中定义的FunctionB,并且不会事先知道其名称,又名动态。
是否可以在创建SAM模板之前将FunctionB的名称作为SAM模板的一部分进行传递,以便模板在创建FunctionA之前知道FunctionB的全名?
我看到了很多有关仅在本地进行测试的问题
答案 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'具有:
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
享受无服务器的乐趣!