#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, и у меня нет ответа, каковы были основания для этого.