如何调用同样在 AWS SAM 模板中定义的另一个 lambda 函数?
How can I invoke another lambda function also defined in AWS SAM template?
我知道如何调用已命名并已作为 Lambda 函数存在的 lambda 函数,但我如何才能让 FunctionA 调用我在 AWS SAM 模板中定义的 FunctionB,并且不知道名称事先,又名动态。
有没有办法在创建 FunctionB 之前将 FunctionB 的名称作为 SAM 模板的一部分传递,以便模板在创建 FunctionA 之前知道 FunctionB 的全名?
我看到很多关于只在本地测试这个的问题
您可以将其他函数的名称或 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
SAM 不同于 CloudFormation。 SAM 有一条捷径。 SAM 资源类型 AWS::Serverless::Function 简化了这一点。
在此示例 SAM 模板中,示例资源 'CallerFunction' 具有:
- 调用函数的作用域策略'microservice'
- 具有函数名称的环境变量
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
享受无服务器带来的乐趣!
我知道如何调用已命名并已作为 Lambda 函数存在的 lambda 函数,但我如何才能让 FunctionA 调用我在 AWS SAM 模板中定义的 FunctionB,并且不知道名称事先,又名动态。
有没有办法在创建 FunctionB 之前将 FunctionB 的名称作为 SAM 模板的一部分传递,以便模板在创建 FunctionA 之前知道 FunctionB 的全名?
我看到很多关于只在本地测试这个的问题
您可以将其他函数的名称或 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
SAM 不同于 CloudFormation。 SAM 有一条捷径。 SAM 资源类型 AWS::Serverless::Function 简化了这一点。
在此示例 SAM 模板中,示例资源 'CallerFunction' 具有:
- 调用函数的作用域策略'microservice'
- 具有函数名称的环境变量
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
享受无服务器带来的乐趣!