【问题标题】:How to create an 'AWS::SSM::Document' with DocumentType of Package using CloudFormation如何使用 CloudFormation 创建一个带有 DocumentType 包的“AWS::SSM::Document”
【发布时间】:2020-05-12 22:10:18
【问题描述】:

This AWS CloudFormation document 建议可以管理 DocumentType 为“Package”的“AWS::SSM::Document”资源。然而,实现这一目标所需的“内容”仍然是个谜。

是否可以通过 CloudFormation 创建类型为“Package”的文档,如果可以,此有效 CLI 命令的等效项是什么?编写为 CloudFormation 模板(最好使用 YAML 格式)?

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

尝试失败。使用的内容是使用 CLI 选项时提供的 manifest.json 的内联版本。使用 CloudFormation 时似乎没有指定 AttachmentSource 的选项:

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;

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation ssm


    【解决方案1】:

    是的,这是可能的!我已经使用DocumentType: Package 成功创建了一个资源,堆栈成功后,该包显示在 SSM 控制台的 Distributor Packages 下。

    您的 YAML 几乎就在那里,但您还需要包含 Attachments 属性 that is now available

    这是一个工作示例:

    AWSTemplateFormatVersion: "2010-09-09"
    Description: Sample to create a Package type Document
    
    Parameters:
      S3BucketName:
        Type: "String"
        Default: "my-sample-bucket-for-package-files"
        Description: "The name of the S3 bucket."
    
    Resources:
      CrowdStrikePackage:
        Type: AWS::SSM::Document
        Properties:
          Attachments:
            - Key: "SourceUrl"
              Values:
                - !Sub "s3://${S3BucketName}"
          Content:
            !Sub |
              {
                  "schemaVersion": "2.0",
                  "version": "1.0",
                  "packages": {
                      "windows": {
                          "_any": {
                              "_any": {
                                  "file": "YourZipFileName.zip"
                              }
                          }
                      }
                  },
                  "files": {
                      "YourZipFileName.zip": {
                          "checksums": {
                              "sha256": "7981B430E8E7C45FA1404FE6FDAB8C3A21BBCF60E8860E5668395FC427CE7070"
                          }
                      }
                  }
              }
          DocumentFormat: "JSON"
          DocumentType: "Package"
          Name: "YourPackageNameGoesHere"
          TargetType: "/AWS::EC2::Instance"
    

    注意:对于Attachments 属性,在使用DocumentType: Package 时必须使用SourceUrl 键。创建过程将在此 S3 存储桶 URL 中附加一个“/”,并将其与您在清单中列出的每个文件名连接起来,该文件名是创建包时的 Content 属性。

    【讨论】:

      【解决方案2】:

      似乎没有直接的方法可以通过 CloudFormation (CFN) 创建带有附件的 SSM 文档。您可以使用一种解决方法,如使用支持的 Lambda CFN,您将使用 Lambda 调用 API SDK 以创建 SSM 文档,然后使用 CFN 中的自定义资源来调用该 Lambda。

      关于如何实施此解决方案的一些注意事项如下:

      这个解决方案有一些缺点:

      • 为原始解决方案添加更复杂的内容,因为您必须为 Lambda 执行创建资源,例如(用于部署 Lambda 的 S3、用于 Lambda 执行并承担 SSM 执行的角色、SSM 内容文件 - 或者您必须使用“长' 内联内容)。它不再是 One-call CFN 创建堆栈。但是,您可以将所有内容放入 SAM 模板中,因为归根结底,它只是一个 CFN 模板
      • 删除 CFN 堆栈时,您必须在 RequestType == Delete 时实现 lambda 以清理您的资源。

      PS:如果您不必严格地在 CFN 上工作,那么您可以尝试使用 Terraform:https://www.terraform.io/docs/providers/aws/r/ssm_document.html

      【讨论】:

      猜你喜欢
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2019-02-17
      • 2022-08-18
      • 2012-04-23
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多