1

我正在使用 AWS CDK、库 @aws-cdk/aws-ssm 和 TypeScript 来创建 CfnMaintenanceWindowTask。我正在使用来自AWS 文档的 cfn示例代码,例如“使用维护窗口目标 ID 创建以实例为目标的运行命令任务”。我尝试转换为 CDK 的 JSON cfn 代码示例。

"TaskInvocationParameters": {
                "MaintenanceWindowRunCommandParameters": {
                    "Parameters": {
                        "Operation": [
                            "Install"
                        ],
                        "RebootOption": [
                            "NoReboot"
                        ]
                    }
                }

在 CfnMaintenanceWindowTask 对象中,我想使用下面的 TypeScript 代码 定义属性taskInvocationParameters 。问题是我不允许这样做,因为属性 taskInvocationParameters 出现以下错误:

" TS2322: 类型 '{ maintenanceWindowRunCommandParameters: { 参数: { 操作: string[]; BaselineTags: { key: string; values: string[]; }[]; RebootOption: string[]; }[]; }[]; } ' 不可分配给类型 'IResolvable | TaskInvocationParametersProperty | undefined'。

我的实现可能是错误的,但我无法看到问题可能出在哪里。

const maintenanceWindowRunCommandParametersWindowsParametersBaselineTags = {
            key: 'PatchBaseline',
            values: [
                'Windows-Server-CritImp-7app-CDK'
            ]
        };    

const maintenanceWindowRunCommandParametersWindowsParameters = {
            Operation: [
                'Install'
            ],
            BaselineTags:[
                maintenanceWindowRunCommandParametersWindowsParametersBaselineTags
            ],
            RebootOption: [
                'NoReboot'
            ]
        };

const maintenanceWindowRunCommandParametersWindows = {
            Parameters: [
                maintenanceWindowRunCommandParametersWindowsParameters
            ],
        };    

const taskInvocationParametersRunPatchBaselineAssociationWindows = {
                maintenanceWindowRunCommandParameters: [
                    maintenanceWindowRunCommandParametersWindows
                ]
            };
    
    const maintenanceWindowTaskWindowsServer = new ssm.CfnMaintenanceWindowTask(this, 'Maintenance-task-Windows-CDK',{
                name: 'Maintenance-task-Windows-CDK',
                priority: 0,
                maxConcurrency: '2',
                maxErrors: '2',
                taskType: 'RUN_COMMAND',
                taskArn: 'AWS-RunPatchBaselineAssociation',
                taskInvocationParameters: taskInvocationParametersRunPatchBaselineAssociationWindows,
                windowId: maintenanceWindowEveryDayScanOnly.ref,
                targets: [
                    maintenanceWindowTaskWindowsServersTargets
                ]
            });

更新

我已经实现了来自@Hcaertnit 的代码。部署后,我收到以下错误。

失败的资源:10:42:06 | CREATE_FAILED | AWS::SSM::MaintenanceWindowTask | Maintenance-task-Windows-CDK (MaintenancetaskWindowsCDK) 无法java.lang.String在 [Source: UNKNOWN; 处反序列化超出 START_OBJECT 令牌的实例;行:-1,列:-1](通过引用链:com.amazonaws.services.ssm.model.RegisterTaskWithMaintenanceWindowRequest["TaskInvocationParameters"]->com.amazonaws.services.ssm.model.MaintenanceWindowTaskInvoc ationParameters["MaintenanceWindowRunCommandParameters"] ->com.amazonaws.services.ssm.model.MaintenanceWindowRunCommandParameters["Parameters"]->java.util.LinkedHashMap["BaselineTags"]->java.util.ArrayList[0])

4

2 回答 2

0

错误:

失败的资源:10:42:06 | CREATE_FAILED | AWS::SSM::MaintenanceWindowTask | Maintenance-task-Windows-CDK (MaintenancetaskWindowsCDK) 无法从 [Source: UNKNOWN; 的 START_OBJECT 令牌中反序列化 java.lang.String 的实例;行:-1,列:-1]

是由于BaselineTags参数实现不准确造成的。此参数是AWS-RunPatchBaselineAssociation运行命令的一部分。该参数有以下定义。

"BaselineTags": {
      "type": "String",
      "description": "(Optional) The baseline tags to use during the patching operation.",
      "allowedPattern": "(^$)|^Key=(.){1,256},Values=(.){0,256}[^,]$",
      "default": ""
    },

知道了这一点,正确的代码格式是这样的:

const maintenanceWindowTaskWindowsServer = new ssm.CfnMaintenanceWindowTask(this, 'Maintenance-task-Windows-CDK',{
            name: 'Maintenance-task-Windows-CDK',
            description: 'Maintenance windows task used for Windows Servers.',
            priority: 0,
            maxConcurrency: '2',
            maxErrors: '2',
            taskType: 'RUN_COMMAND',
            taskArn: 'AWS-RunPatchBaselineAssociation',
            taskInvocationParameters: {
                maintenanceWindowRunCommandParameters: {
                    parameters: {
                        Operation: ["Install"],
                        BaselineTags: ["Key=PatchBaseline,Values=Windows-Server-CritImp-7app-CDK"],
                        RebootOption: ["NoReboot"]
                    }
                }
            },
            windowId: maintenanceWindowEveryDayScanOnly.ref,
            targets: [
                {
                    key: 'WindowTargetIds',
                    values: [
                        maintenanceWindowTargetWindowsServer.ref
                    ]
                }
            ]
        });
于 2021-08-10T09:45:01.193 回答
0

将您的前 4 个变量合并为一个,如下所示:

const taskInvocationParametersRunPatchBaselineAssociationWindows = {
    maintenanceWindowRunCommandParameters: {
        parameters: {
            Operation: ["Install"],
            BaselineTags: [
                {
                    key: "PatchBaseline",
                    values: ["Windows-Server-CritImp-7app-CDK"],
                }
            ],
            RebootOption: ["NoReboot"],
        },
    },
};
  1. maintenanceWindowRunCommandParameters接受一个对象;你传递给它一个数组,在那个数组中你传递对象。
  2. 该对象有一个parameters(实际上不是Parameters)属性,它是一个对象;再次将数组传递给该属性,其中包含正确的对象。

我将变量组合成一个像上面一样的变量,因为所有长变量名都变得非常难以管理。

于 2021-07-27T13:55:56.087 回答