Как создать 'AWS :: SSM :: Document' с DocumentType пакета, используя CloudFormation - PullRequest
0 голосов
/ 27 января 2020

В этом AWS документе CloudFormation предполагается, что можно администрировать ресурс 'AWS :: SSM :: Document' с DocumentType типа 'Package'. Однако «содержимое», необходимое для достижения этого, остается загадкой.

Возможно ли создать документ типа «Пакет» с помощью CloudFormation, и если да, то каков эквивалент этой действительной команды CLI, записанной в виде Шаблон CloudFormation (желательно с форматированием YAML)?

ssm create-document --name my-package --content "file://manifest.json" --attachments Key="SourceUrl",Values="s3://my-s3-bucket" --document-type Package

Неудачная попытка. Используемое содержимое является встроенной версией манифеста. json, предоставленной при использовании параметра CLI. Кажется, что нет возможности указать AttachmentSource при использовании CloudFormation:

AWSTemplateFormatVersion: 2010-09-09

Resources:
  Document:
    Type: AWS::SSM::Document
    Properties:
      Name: 'my-package'
      Content: !Sub |
        {
          "schemaVersion": "2.0",
          "version": "Auto-Generated-1579701261956",
          "packages": {
            "windows": {
              "_any": {
                "x86_64": {
                  "file": "my-file.zip"
                }
              }
            }
          },
          "files": {
            "my-file.zip": {
              "checksums": {
                "sha256": "sha...."
              }
            }
          }
        }
      DocumentType: Package

Ошибка CloudFormation

AttachmentSource not provided in the input request. (Service: AmazonSSM; Status Code: 400; Error Code: InvalidParameterValueException;

1 Ответ

1 голос
/ 08 апреля 2020

Кажется, что нет прямого способа создать документ SSM с вложением через CloudFormation (CFN). Вы можете использовать обходной путь, как использование лямбда-CFN с резервной копией, где вы будете использовать Lambda для вызова API SDK для создания документа SSM, а затем использовать настраиваемый ресурс в CFN для вызова этой лямбды.

Есть некоторые примечания о том, как реализовать это решение, как показано ниже:

  • Как вызвать лямбду из CFN: Возможно ли запустить лямбда при создании из шаблона CloudFormation
  • Образец лямбды формат ответа на отправку (при использовании настраиваемого ресурса в CFN): https://github.com/stelligent/cloudformation-custom-resources
  • Для развертывания Lambda с лучшими практиками и простой загрузки вложения, содержимого документа из локальной сети, вы должны использовать sam deploy вместо CFN create stack.
  • Вы можете получить информацию о вновь созданном ресурсе из лямбды в CFN, добавив информацию о ресурсе в data json в ответном лямбда-ответе, и CFN может использовать его с! GetAtt CustomResr c. Атрибут, вы можете найти более подробную информацию здесь .

У этого решения есть некоторые недостатки:

  • Добавить более сложный оригинал решение, поскольку вы должны создать ресурсы для выполнения Lambda, такие как (S3 для развертывания Lambda, Role for Lambda для выполнения и предположения выполнения SSM, файл содержимого SSM - или вы должны использовать «длинный» встроенный контент). Это больше не будет стеком создания одного вызова CFN. Тем не менее, вы можете поместить все в шаблон SAM, потому что в конце концов это всего лишь шаблон CFN
  • Когда вы удаляете стек CFN, вы должны использовать лямбду, когда RequestType == Delete, чтобы очистить ваш ресурс.

PS: Если вам не нужно строго работать с CFN, то вы можете попробовать с Terraform: https://www.terraform.io/docs/providers/aws/r/ssm_document.html

...