是否可以从CloudFormation模板触发创建lambda

时间:2016-12-27 18:41:04

标签: aws-lambda amazon-cloudformation

我尝试使用cloudformation创建一组lambdas。我希望lambdas一旦被创建就会被触发。我在各个博客中看到了为s3sns创建触发器,但似乎没有一个选项可以在创建后触发lambda。有什么选择吗?

5 个答案:

答案 0 :(得分:21)

是的,有可能。以下是一些选项:

  1. 手动create an SNS Topic。使用lambda函数作为AWS::SNS::Subscription并将SNS主题添加为Endpoint,将TopicArn添加到堆栈。在堆栈创建/更新时,配置要发送到此SNS主题的堆栈事件通知。

    • (有关如何在使用AWS控制台创建堆栈时执行此操作的文档,请参阅Setting AWS CloudFormation Stack Options,或者如果使用{{3}创建/更新堆栈,请使用等效选项--notification-arns或其他AWS开发工具包。)
  2. 添加AWS CLI引用要在创建时调用的Lambda函数。

    • 如果在创建某些特定资源之后需要在中调用Lambda函数,请在自定义资源上添加Custom Resource,引用要确保先创建资源的资源。函数被调用。
    • 为了使自定义资源成功创建(并且不会导致堆栈中出现故障/回滚),您需要调整Lambda函数以支持CloudFormation请求/响应格式(请参阅DependsOn attribute)。
    • 此选项将在Custom Resource Reference仍为CREATE_IN_PROGRESS时调用Lambda函数,因为自定义资源是堆栈本身的一部分。
    • 删除堆栈(及相关的自定义资源)时,也会再次调用Lambda函数。这需要由您的Lambda函数正确处理,否则您的堆栈可能会陷入DELETE_FAILED状态。
  3. 将Lambda函数引用添加到stack status,然后编写一个执行堆栈创建的简单脚本,然后手动调用Lambda函数。

答案 1 :(得分:1)

对于那些寻找类似解决方法的人。

CloudWatch能够捕获CloudFormation的API调用,即#34; CreateStack"," UpdateStack"和" DeleteStack",堆叠状态,如" Create_complete"或" Complete_Rollback"是不可赎回的,这意味着这种状态变化无法触发lambda。

解决方法是SNS,堆栈能够向SNS发送通知(在创建堆栈时提前设置)并且SNS可以选择触发lambda,但是,您无法选择特定状态。因此,lambda函数需要找到" Message"中的状态。事件的内容。每个人,只是编码。

答案 2 :(得分:1)

以下内容效果很好!

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

答案 3 :(得分:0)

您可以选择通知SNS主题,并且您可以构建一个侦听该主题的lambda,因此工作流程将是:Cloudformation launch - > SNS主题 - > LAMBDA。

答案 4 :(得分:0)

以下模板应调用lambda:

“ InvokeLambda”:{     “ Type”:“ Custom :: InvokeLambda”,     “版本”:“ 1.0”,     “属性”:{     “ ServiceToken”:{           “ Fn :: GetAtt”:[“ InitFunction”,“ Arn”]         }       } }