Как динамически генерировать имена ключей в шаблоне Cloudformation?

#amazon-web-services #amazon-cloudformation

#amazon-веб-сервисы #aws-cloudformation

Вопрос:

Я хотел бы динамически задавать путь к файлу sql в приведенном ниже коде, используя параметры.

 files: 
  /tmp/setup.mysql: 
    content: !Sub |
      CREATE DATABASE ${DBName};
      CREATE USER '${DBUsername}'@'localhost' IDENTIFIED BY '${DBPassword}';
      GRANT ALL ON ${DBName}.* TO '${DBUsername}'@'localhost';
      FLUSH PRIVILEGES;
    mode: "000644"
    owner: "root"
    group: "root"
  

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

 Template contains errors.: Template format error: [/Resources/MyLaunchConfig/Metadata/AWS::CloudFormation::Init/config/files] map keys must be strings; received a map instead
  

Как я могу переместить такой путь в параметры шаблона?

Редактировать:

В примечании к документации CloudFormation о встроенных функциях говорится следующее:

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

Похоже, это указывает на то, что функции должны быть доступны в свойствах ресурсов и атрибутах метаданных. Он специально не ограничивает его значениями в этих объектах, а не ключами (хотя это можно предположить из-за присущей им природы ключей и значений).

Комментарии:

1. Где вы задаете путь динамически?

2. Я бы /tmp/setup.mysql заменил !Ref sqlFilePath , например. Я бы предпочел заменить /tmp только часть, но это приводит к более сложному варианту использования. Мне просто нужно знать, есть ли способ использовать параметр или функцию в имени ключа (в отличие от использования его в значении ключа).

3. К сожалению, вы не можете этого сделать. Но вы могли бы, если бы вы использовали UserData для создания файла вместо инициализации cfn.

4. Спасибо @Marcin. Мне не удалось выполнить эту работу, поэтому кажется, что вы правы. У вас есть ссылка, которая документирует это ограничение?

5. Рад слышать, что это сработало. Я думаю, это связано с более общей спецификацией того, как работает синтаксис CFN. Если вы не возражаете, я предоставлю ответ для дальнейшего использования.

Ответ №1:

На основе комментариев.

Проблема в том, что в соответствии со спецификацией формата CFN a map может быть только строкой:

Карта представляет собой набор пар ключ-значение, где ключи всегда являются строками.

Поэтому предлагаемым решением было использовать UserData для определения динамически генерируемого файла вместо использования метаданных CFN.

Комментарии:

1. Понял, что ключи всегда являются строками. Однако я не понимаю, почему это не означает, что я могу использовать ссылку на параметр типа string . Ref Функция вернет строку и, следовательно, удовлетворит требованию, чтобы ключ был строкой. Я полагаю, можно утверждать, что Ref это предоставляет типы переменных на основе конкретного параметра / ссылки, но если это так, мы могли бы переключить функцию Sub , которая всегда должна возвращать строку.

2. @RichC Я знаю, что вы имеете в виду, но, к сожалению, так оно и работает. AWS приняла такое дизайнерское решение при разработке CloudFormation, и у меня нет ответа, каковы были основания для этого.