AWS CDK CfnMaintenanceWindowTask/taskInvocationParameters - TypeScript

问题描述

我正在使用 AWS CDK、库@aws-cdk/aws-ssm 和 TypeScript 来创建 CfnMaintenanceWindowTask。我使用来自 AWS docs for cfn 的示例代码,例如“创建一个运行命令任务,该任务使用维护时段目标 ID 来定位实例”。我试图转换为 CDK 的 JSON cfn 代码示例。

"TaskInvocationParameters": {
                "MaintenanceWindowruncommandParameters": {
                    "Parameters": {
                        "Operation": [
                            "Install"
                        ],"RebootOption": [
                            "noreboot"
                        ]
                    }
                }

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

"TS2322: 类型 '{ maintenanceWindowruncommandParameters: { 参数: { Operation: 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) 无法从 START_OBJECT 令牌反序列化 java.lang.String 的实例 在 [来源:未知;行:-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 个变量合并为一个:

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

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

,

错误:

失败的资源:10:42:06 | CREATE_FAILED | AWS::SSM::MaintenanceWindowTask |维护任务-Windows-CDK (MaintenancetaskWindowsCDK) 无法反序列化 java.lang.String out of START_OBJECT token at [来源: UNKNOWN;线: -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
                    ]
                }
            ]
        });