问题描述
我正在使用 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"],},};
-
maintenanceWindowRunCommandParameters
接受一个对象;你向它传递了一个数组,在该数组中你传递了对象。 - 那个对象有一个
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
]
}
]
});