Ссылочный ресурс в шаблоне CloudFormation в свойстве встроенного кода функции Lambda - PullRequest
1 голос
/ 24 апреля 2019

У меня есть шаблон CloudFormation с ресурсом функции Lambda, который запускается событием CloudWatch при регистрации нового AMI.В блоке ресурсов Lambda я передаю свой встроенный код в свойстве Code.Функция запускает выполнение документа автоматизации SSM, если идентификатор AMI - это требуемый идентификатор, проанализированный в событии возврата.Ради вопроса, давайте назовем этот ресурс My Doc в шаблоне.Итак, мой вопрос в том, как в моем шаблоне я должен ссылаться на ресурс документа автоматизации в моем встроенном коде в свойстве Code ресурса Lambda?Я вставил пример кода ниже, чтобы проиллюстрировать это.

Ресурсные блоки из шаблона:

"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
              }
          },
          ...

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

Если я правильно понимаю, для того, чтобы ваша лямбда могла получить этот документ, вы должны сначала передать логический идентификатор документа в лямбду. Вы можете сделать это, используя !Ref MyDoc в переменных Lambda Environment , а затем вы можете извлечь эту переменную из функции и использовать вызов API GetDocument для получения документа.

1 голос
/ 25 апреля 2019

Вы можете использовать для этой цели встроенную функцию 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.

...