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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 06 марта 2019

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

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

...