AWS CDK中如何配置SSM CfnAssociation的parameters属性?
解决AWS CDK配置SSM State Manager定时关闭RDS实例的参数问题
核心问题分析
你遇到的解析错误,是因为直接将Construct对象(而非解析后的ARN字符串)传入parameters属性,CDK无法正确解析这种嵌套的Construct引用。
正确配置步骤及代码示例
1. 准备具备权限的IAM角色
确保StopStartRebootRDS角色拥有SSM自动化执行所需权限(如rds:StopDBInstance、ssm:StartAutomationExecution),且信任关系允许SSM服务(ssm.amazonaws.com)扮演该角色。如果是新建角色,可通过CDK直接定义;如果是已有角色,用Role.fromRoleArn引用。
2. 配置CfnAssociation参数
无需通过SSM参数中转,直接将角色ARN传入parameters的automationAssumeRole字段,注意参数值需为数组类型:
import { Stack, StackProps, CfnAssociation } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { Role, ServicePrincipal, ManagedPolicy } from 'aws-cdk-lib/aws-iam'; export class RdsStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // 方式1:新建IAM角色 const ssmAutomationRole = new Role(this, 'StopStartRebootRDS', { assumedBy: new ServicePrincipal('ssm.amazonaws.com'), managedPolicies: [ ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMAutomationRole'), // 按需添加RDS停止权限的自定义策略或托管策略 ], }); // 方式2:引用已有角色(替换为你的角色ARN) // const ssmAutomationRole = Role.fromRoleArn(this, 'ExistingStopStartRole', // 'arn:aws:iam::12345678999:role/StopStartRebootRDS'); // 创建SSM State Manager关联 new CfnAssociation(this, 'StopRdsInstanceAssociation', { name: 'AWS-StopRDSInstance', // 使用AWS官方自动化文档 scheduleExpression: 'cron(0 21 * * ? *)', // 每天UTC时间21:00执行,注意时区转换 parameters: { automationAssumeRole: [ssmAutomationRole.roleArn], // 直接传入ARN数组 DBInstanceIdentifier: ['your-target-rds-instance-id'], // 指定要停止的RDS实例ID }, }); } }
3. 关键注意事项
parameters的每个参数值必须是数组类型,即使单个值也要用数组包裹,这是SSM Association参数的要求。- 时区转换:
scheduleExpression采用UTC时间,若需北京时间21:00执行,要转换为UTC时间13:00,对应表达式为cron(0 13 * * ? *)。 - 权限验证:确认角色权限覆盖RDS实例停止操作及SSM自动化执行的必要权限,避免执行失败。
错误原因复盘
之前尝试用SSM参数传递角色ARN时,错误地将Construct对象而非解析后的ARN字符串传入参数,导致CDK在Token解析阶段失败。直接使用角色的roleArn属性,CDK会自动生成正确的CloudFormation ARN引用,避免解析错误。
内容的提问来源于stack exchange,提问作者Gregg
相关产品推荐
相关产品推荐

