AWS CloudFormation & Service Catalog - Могу ли я потребовать теги с пользовательскими значениями?

Наша проблема кажется очень простой, и я бы ожидал, что она станет общей

У нас есть теги, которые всегда должны применяться (для выставления счетов). Однако значения тегов известны только во время развертывания стека... Мы не знаем, какими будут значения тегов при разработке стека или при создании продукта в каталоге услуг...

Мы не хотим ждать, пока ПОСЛЕ того, как ресурс будет развернут, чтобы обнаружить, что тег отсутствует, так что, как бы ни была хороша конфигурация AWS, мы не хотим полагаться на ее правила, если в этом нет необходимости.

Таким образом, такие вещи, как параметры тега, не работают, потому что кажется, что они ожидают, что мы знаем значение тега за месяцы до некоторого развертывания (что не так).

Есть ли способ использовать теги для шаблона облачной информации при его развертывании? Еще лучше, можем ли мы иметь запрос каталога услуг для значения тега при развертывании? Например, такие теги, как "система" или "проект", приходят и уходят с течением времени и не известны заранее для многих типов шаблонов облачной информации, которые мы разрабатываем.

Разве это не распространенный сценарий?

Я беспокоюсь, что мне не хватает чего-то очень, очень простого и базового, который требует использования тегов заранее, но я не могу понять, что именно. Заранее спасибо. Я действительно много работал с Google, прежде чем спрашивать, не находя удовлетворительного ответа.

1 ответ

Я ничего не знаю о каталоге услуг, но вы можете создать Условия, а затем использовать их для условного создания (или даже сбоя) создания ресурса. Условное создание ресурса, например

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. Напишите некоторый код для чтения и проверки ввода (например, чтение из каталога услуг) и вызовите createStack API. Я делаю то же самое из 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. Проверьте наличие тегов в этом разделе и верните ошибку, если она не удовлетворяет ограничениям. Заставьте все остальные создания ресурса зависеть от этого ресурса (чтобы они все создавались, если ваши проверки пройдены). Ссылка также содержит пример. Вы также должны будете добавить обработку для обновления и удаления стека (как успех по умолчанию). Я думаю, что это ваша лучшая ставка на данный момент.

Другие вопросы по тегам