我尝试使用CloudFormation创建了一组Lambda函数。 我希望在创建后自动触发这些Lambda函数。 我看到许多博客中都提到要创建一个S3或SNS触发器,但似乎没有选项可以在Lambda创建后立即触发它。 有什么其他的选项吗?
我尝试使用CloudFormation创建了一组Lambda函数。 我希望在创建后自动触发这些Lambda函数。 我看到许多博客中都提到要创建一个S3或SNS触发器,但似乎没有选项可以在Lambda创建后立即触发它。 有什么其他的选项吗?
是的,这是可能的。以下是几个选项:
手动创建SNS主题。将一个AWS::SNS::Subscription
添加到您的堆栈中,以lambda函数作为Endpoint
和SNS主题作为TopicArn
。在堆栈创建/更新时,配置堆栈事件通知发送到此SNS主题。
--notification-arns
。)添加引用Lambda函数的自定义资源以在创建时调用。
DependsOn
属性,引用您想要确保在调用函数之前先创建的资源。CREATE_IN_PROGRESS
时调用Lambda函数,因为自定义资源是堆栈本身的一部分。DELETE_FAILED
状态。将Lambda函数引用添加到堆栈输出中,然后编写一个简单的脚本,执行堆栈创建,然后手动调用Lambda函数。
由 yl 提供。
以下代码非常有效!
它在部署的一部分中调用了一个 Lambda:
LambdaFunction2:
Type: AWS::Lambda::Function
Properties:
FunctionName: caller
Code:
ZipFile: |
import boto3, json
import cfnresponse
def handler(event, context):
print('EVENT:[{}]'.format(event))
lambda_client = boto3.client('lambda')
test_event = '{"name":"test1"}'
lambda_client.invoke(
FunctionName='target1',
InvocationType='Event',
Payload=test_event,
)
responseValue = 120
responseData = {}
responseData['Data'] = responseValue
cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData)
Handler: index.handler
Role:
arn:aws:iam::11111111111:role/mylambda-role
Runtime: python3.7
Timeout: 60
Primerinvoke:
Type: AWS::CloudFormation::CustomResource
DependsOn: LambdaFunction2
Version: "1.0"
Properties:
ServiceToken: !GetAtt LambdaFunction2.Arn
对于寻找类似解决方案的人。
CloudWatch 可以捕获 CloudFormation 的 API 调用,包括 "CreateStack"、"UpdateStack" 和 "DeleteStack",但是堆栈状态,如 "Create_complete" 或 "Complete_Rollback" 是无法捕获的,这意味着这种状态变化不能触发 Lambda。
解决方法是使用 SNS,堆栈能够向 SNS 发送通知(在创建堆栈时的高级设置中)并且 SNS 可以选择触发 Lambda,但是你无法为特定状态进行选择。因此,Lambda 函数负责查找事件的 "Message" 内容中的状态。大家,开始编码吧。
在Kyr的答案基础上进行改进,因为它缺少两个重要的内容:
以下是修订和改进后的代码:
LambdaInvoker:
DependsOn: ## important, add stuff here you need to existe BEFORE the lambda is called
Type: AWS::Lambda::Function
Properties:
FunctionName: YourLambdaName
Description: 'Lambda invoke wrapper for Custom CFN actions'
Code:
ZipFile: !Sub |
import boto3, json
import cfnresponse
def handler(event, context):
print('EVENT:')
print(event)
if event['RequestType'] == "Create":
lambda_client = boto3.client('lambda')
cfn_event = {
"param1" : "${Param1}",
"param2" : "${Param2}"
}
lambda_client.invoke(
FunctionName='scm-custom-cfn-actions',
InvocationType='Event',
Payload=json.dumps(cfn_event)
)
responseValue = 120
responseData = {}
responseData['Data'] = responseValue
cfnresponse.send(event, context, cfnresponse.SUCCESS,
responseData, 'scm-cfn-customresource-id')
Handler: index.handler
Role: YourLambdaRoleARN
Runtime: python3.7
Timeout: 5
您可以选择通知到SNS主题,您可以构建一个监听该主题的Lambda,所以工作流程将是:Cloudformation启动 -> SNS主题 -> Lambda。
"InvokeLambda" : {
"Type": "Custom::InvokeLambda",
"Version" : "1.0",
"Properties" : {
"ServiceToken": {
"Fn::GetAtt": ["InitFunction","Arn"]
}
}
},