Я ничего не знаю о каталоге услуг, но вы можете создать Условия , а затем использовать его для условного создания (или даже сбоя) создания ресурса. Условное создание ресурса например,
Parameters:
ResourceTag:
Type: String
Default: ''
Conditions:
isTagEmpty:
!Equals [!Ref ResourceTag, '']
Resources:
DBInstance:
Type: AWS::RDS::DBInstance
Condition: isTagEmpty
Properties:
DBInstanceClass: <DB Instance Type>
Здесь экземпляр RDS DB будет создан только в том случае, если тег не пуст.Но облачная информация все равно вернет успех.
В качестве альтернативы, вы можете попробовать и потерпеть неудачу при создании ресурса.
Resources:
DBInstance:
Type: AWS::RDS::DBInstance
Properties:
DBInstanceClass: !If [isTagEmpty, !Ref "AWS::NoValue", <DB instance type>]
Я не пробовал этого, но он должен потерпеть неудачу, так как тип экземпляра БД будет недействительнымесли тег равен нулю.
Редактировать: Вы также можете создать свой стек, используя createStack
CFN API.Напишите некоторый код для чтения и проверки ввода (например, чтение из каталога услуг) и вызовите API createStack
.Я делаю то же самое из Lambda
(nodejs), читая некоторые данные из Parameter Store
.Пример кода -
module.exports.create = async (event, context, callback) => {
let request = JSON.parse(event.body);
let subnetids = await ssm.getParameter({
Name: '/vpc/public-subnets'
}).promise();
let securitygroups = await ssm.getParameter({
Name: '/vpc/lambda-security-group'
}).promise();
let params = {
StackName: request.customerName, /* required */
Capabilities: [
'CAPABILITY_IAM',
'CAPABILITY_NAMED_IAM',
'CAPABILITY_AUTO_EXPAND',
/* more items */
],
ClientRequestToken: 'qwdfghjk3912',
EnableTerminationProtection: false,
OnFailure: request.onfailure,
Parameters: [
{
ParameterKey: "SubnetIds",
ParameterValue: subnetids.Parameter.Value,
},
{
ParameterKey: 'SecurityGroupIds',
ParameterValue: securitygroups.Parameter.Value,
},
{
ParameterKey: 'OpsPoolArnList',
ParameterValue: request.userPoolList,
},
/* more items */
],
TemplateURL: request.templateUrl,
};
cfn.config.region = request.region;
let result = await cfn.createStack(params).promise();
console.log(result);
}
Другой вариант : добавить пользовательский ресурс AWS при поддержке Lambda.Проверьте наличие тегов в этом разделе и верните ошибку, если она не удовлетворяет ограничениям.Сделайте все остальные создания ресурса зависимыми от этого ресурса (чтобы они все создавались, если ваши проверки пройдены).Ссылка также содержит пример.Вы также должны будете добавить обработку для обновления и удаления стека (как успех по умолчанию).Я думаю, что это ваша лучшая ставка на данный момент.