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

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

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

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

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

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

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

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


person Paul Fowler    schedule 06.03.2019    source источник


Ответы (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 будет создан только в том случае, если тег не пуст. Но облачная формация все равно вернет успех.

В качестве альтернативы вы можете попробовать и не создать ресурс.

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

person asr9    schedule 06.03.2019
comment
Это кажется несколько запутанным (кстати, мне нравится ваш вариант «попытаться и потерпеть неудачу»). Это кажется запутанным, поскольку я не хочу, чтобы ресурсы создавались, если самому стеку не были переданы правильные теги. Я все же считаю, что это должно быть проще. Если в организации есть стандарт тегов, мы должны иметь возможность разрабатывать шаблоны CloudFormation, для которых требуются теги (особенно из каталога сервисов AWS ...). Что-то кажется странным, учитывая, насколько важны теги для групп ресурсов AWS, обслуживания, управления, контроля и т. Д. выставление счетов и т. д. Я что-то упускаю. - person Paul Fowler; 07.03.2019
comment
К ответу добавлен еще один вариант Cloudformation Custom Resource. - person asr9; 07.03.2019
comment
Если я не получу лучшего ответа, я соглашусь с вами и буду использовать настраиваемый ресурс AWS, поддерживаемый Lambda. Я могу подождать день и посмотреть, есть ли у кого-нибудь ответ. Это похоже на наказание того, кто пытается развернуть стек, но забыл ввести теги, которые мы только просили в документации. Если CloudFormation / Service Catalog никогда не запрашивали теги, то это похоже на ловушку из-за того, что они сделали что-то неправильно, вместо того, чтобы позволить им делать это правильно ... Я знаю, что все еще не так сложно проверить и провалить развертывание, пока теги не будут добавил, но в этом суть вопроса. - person Paul Fowler; 07.03.2019