Lambda函数的内联代码属性中CloudFormation模板中的参考资源

时间:2019-04-24 18:05:09

标签: amazon-web-services aws-lambda amazon-cloudformation

我有一个// … module.exports = { // … module: { preLoaders: [ { test: /\.(js|jsx)$/, loader: 'eslint', include: paths.appSrc, } ] } // … }; 模板,该模板具有CloudFormation函数资源,该资源在注册新的Lambda时由CloudWatch事件触发。在Lambda资源块中,我在AMI属性中传递了内联代码。如果Code ID是返回事件中解析的所需ID,则该函数将触发SSM自动化文档执行。出于问题的考虑,我们在模板中将此资源称为AMI。因此,我的问题是,在模板中,我该如何在My Doc资源的Code属性的内嵌代码中引用自动化文档资源?我在下面粘贴了一个代码示例以帮助说明这一点。

模板中的资源块:

Lambda

2 个答案:

答案 0 :(得分:3)

如果我理解正确,那么为了使您的Lambda能够获取该文档,您首先必须将文档的逻辑ID传递给Lambda。您可以在Lambda Environment variables中使用!Ref MyDoc进行操作,然后可以在函数中提取该变量并使用GetDocument API call来获取文档。

答案 1 :(得分:1)

为此,您可以使用Sub内在函数代替Join。甚至组合Join和Sub功能-由您决定。

因此,结果代码如下所示:

"Code": {
                  "ZipFile": {
                      "Fn::Join": [
                          "\n",
                          [
                              "import json",
                              "import boto3",
                              "def lambda_handler(event, context):",
                              "    ssm = boto3.client('ssm')",
                              "    amiId = event['AMI-ID']",
                              "    if 'base_ami in amiId:",
                              { 
                                "Fn::Sub": [ 
                                    "         ssm.start_automation_execution(DocumentName=${MyDocumentName})", 
                                    { "MyDocumentName": {"Ref" : "MyDoc" }} 
                                ]
                              }
                              "    else:",
                              "        print("Not the base AMI id.")"
                          ]
                      ]
                  }
              }

当然,这仅适用于内联代码,否则,应使用@Deiv编写的Lambda环境变量。