Моя цель — использовать AWS Systems Manager State Manager для запуска задания cron, которое отключит экземпляр RDS в 9 вечера. Я занимаюсь созданием шаблона CloudFormation с помощью AWS CDK.
В документации AWS CDK для конструкции CfnAssociation упоминается свойство parameters
. Он имеет тип any
. Я пытаюсь найти пример того, как использовать свойство.
Пожалуйста, помогите мне понять, как правильно добавить параметр AutomationAssumeRole
, используя этот фрагмент кода. AutomationAssumeRole
ожидает ARN на роль. Например, arn:aws:iam::12345678999:role/StopStartRebootRDS
.
// Create the State Manager association that will shut down an RDS instance.
new ssm.CfnAssociation(this, 'StopRdsInstanceAssociation', {
name: 'AWS-StopRdsInstance', // The document name to use.
associationName: 'StopRdsInstance', // A user friendly name for this association.
documentVersion: '$DEFAULT', // I'm guessing this will work. Not sure yet.
instanceId: dbInstance.instanceIdentifier, // The RDS database that will be shut down.
scheduleExpression: '0 00 21 ? * * *', // Daily at 9PM.
parameters: {}, // What does this look like?
});
Ваше руководство приветствуется.
Я подумал, что могу создать параметр SSM и заполнить его ролью ARN. Но это неправильно. Я не уверен, как еще это настроить. Ошибка из этой конфигурации ниже.
const automationAssumeRole = new ssm.CfnParameter(this, 'RdsParameter', {
type: 'String',
value: role.roleArn,
});
// Create the State Manager association that will shut down an RDS instance.
new ssm.CfnAssociation(this, 'StopRdsInstanceAssociation', {
name: 'AWS-StopRdsInstance',
associationName: 'StopRdsInstance',
documentVersion: '$DEFAULT',
instanceId: dbInstance.instanceIdentifier,
scheduleExpression: '0 00 21 ? * * *',
parameters: {
automationAssumeRole,
},
});
Ошибка: Ошибка разрешения: Ошибка разрешения: Попытка разрешить () конструкцию в /Resources/${Token[InfrastructureDev.RdsStack.StopRdsInstanceAssociation.LogicalID.762]}/Properties/parameters/automationAssumeRole/node..
Передайте ARN роли напрямую. Имена ключей параметров должны быть в регистре Pascal.
new ssm.CfnAssociation(this, "StopRdsAssociation", {
name: "AWS-StopRdsInstance",
associationName: "StopRdsInstance",
scheduleExpression: "cron(0 00 2 ? * * *)",
parameters: {
InstanceId: [dbInstance.instanceIdentifier],
AutomationAssumeRole: [role.roleArn],
},
});
Согласно сообщению в блоге AWS Запланируйте остановку и запуск Amazon RDS с помощью AWS Systems Manager, достаточно идентификатора экземпляра и роли.
На Github есть выпуск issue, в котором обсуждается именно этот вопрос. Изучив предложенный обходной путь, я собираюсь использовать «аварийный люк», чтобы применить изменения. Я смог заставить это работать, используя следующее:
// Create the State Manager association that will shut down an RDS instance.
const association = new ssm.CfnAssociation(this, 'StopRdsInstanceAssociation', {
name: 'AWS-StopRdsInstance',
associationName: 'StopRdsInstance',
scheduleExpression: 'cron(0 00 2 ? * * *)',
});
// Use an escape hatch to set the parameters. https://github.com/aws/aws-cdk/issues/4057
association.addPropertyOverride('Parameters.InstanceId', [dbInstance.instanceIdentifier]);
association.addPropertyOverride('Parameters.AutomationAssumeRole', [role.roleArn]);
Я хотел бы оставить это для исторических целей, но решение @fedonev у меня работает. Аварийный люк не нужен.
Рад, что вы нашли решение! Кстати, проблема (с 2019 года) должна была быть решена. Пересмотренный код в моем ответе успешно развертывается. Аварийный люк не требуется.
Большой! Спасибо за внимание. Изначально я запутался в конструкции, и что-то еще, должно быть, маскировало настоящую проблему. Например, мой cron был в неправильном формате, я решил не использовать свойство Target и свойство InstanceId (прикрепленное непосредственно к ассоциации). Удаление их помогло добиться некоторого прогресса.
Спасибо @fedonev, это не сработало из-за ошибки в коде. Я ценю это предложение.