簡體   English   中英

如何使用 CloudFormation 創建具有 DocumentType 包的“AWS::SSM::Document”

[英]How to create an 'AWS::SSM::Document' with DocumentType of Package using CloudFormation

此 AWS CloudFormation 文檔建議可以管理 DocumentType 為“Package”的“AWS::SSM::Document”資源。 然而,實現這一目標所需的“內容”仍然是個謎。

是否可以通過 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

嘗試失敗。 使用的內容是使用 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;

是的,這是可能的! 我已經使用DocumentType: Package成功創建了一個資源,並且在堆棧成功后,該包顯示在 Distributor Packages 下的 SSM 控制台中。

您的 YAML 已准備就緒,但您還需要包含現在可用Attachments屬性。

這是一個工作示例:

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屬性。

似乎沒有直接的方法可以通過 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

暫無
暫無

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

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