簡體   English   中英

Lambda函數的內聯代碼屬性中CloudFormation模板中的參考資源

[英]Reference resource in CloudFormation template in inline code property of a Lambda function

我有一個CloudFormation模板,該模板具有Lambda函數資源,該資源在注冊新AMI時由CloudWatch事件觸發。 在Lambda資源塊中,我在Code屬性中傳遞內聯代碼。 如果AMI id是返回事件中解析的所需id,則該函數觸發SSM自動化文檔執行。 出於問題的考慮,讓我們在模板中將此資源稱為“ My Doc ”。 因此,我的問題是,在我的模板中,如何在Lambda資源的Code屬性中的內嵌代碼中引用自動化文檔資源? 我在下面粘貼了一個代碼示例以幫助說明這一點。

模板中的資源塊:

"MyDoc": {
    {
      "Type" : "AWS::SSM::Document",
      "Properties" : {
        "Content" : JSON object,
        "DocumentType" : Automation,
        "Tags" : [ Resource Tag, ... ]
      }
}

"MyLambdaFunction": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
                  "Role": {
                      "Fn::GetAtt": [
                          "SomeRole",
                          "Arn"
                      ]
                  },
                  "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:",
                                  "         ssm.start_automation_execution(DocumentName=THIS IS WHERE I NEED TO REFERENCE THE DOCUMENT RESOURCE)",
                                  "    else:",
                                  "        print("Not the base AMI id.")"
                              ]
                          ]
                      }
                  },
                  "Runtime": "python3.6",
                  "Timeout": 300,
                  "Handler": "index.lambda_handler",
                  "MemorySize": 512
              }
          },
          ...

如果我理解正確,那么為了讓您的Lambda獲得該文檔,您首先必須將文檔的邏輯ID傳遞給Lambda。 您可以使用Lambda Environment變量中的!Ref MyDoc來執行此操作,然后可以將該變量拉入函數並使用GetDocument API調用來獲取文檔。

為此,可以使用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.")"
                          ]
                      ]
                  }
              }

當然,這僅適用於內聯代碼,否則,應使用Lambda環境變量,如@Deiv所寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM