Ошибка формата шаблона Cloudformation: каждый член DeletionPolicy должен быть строкой

Привет! Я пытаюсь использовать функцию "ЕСЛИ", как упомянуто в документации по формированию облаков для RDS DeletionPolicy, но по какой-то причине он говорит, что моя функция не возвращает строку.

Документация AWS по условным заявлениям

вот условие:

 "DeletionPolicy" : {
    "Fn::If" : [
      "CreateProdResources",
      "Snapshot",
      "Delete"
    ]}

И ошибка та, что в заголовке:

Template validation error: Template format error: Every DeletionPolicy member must be a string.

Другие попытки, которые не сработали:

С картой:

 "RdsDeletionPolicyMap" :{
      "production" : {
          "policy" : "Snapshot"
      },
      "staging" : {
          "policy" : "Delete"
      }
   }

А потом:

   "DeletionPolicy" : {
      "Fn::FindInMap" : [ "RdsDeletionPolicyMap", {"Ref": "RailsEnvironment"}, "policy" ]
   }

Как и простой "Ref":... не сработал. Я очень подозреваю, что это ошибка с облачной информацией

Ответ 1

Проблема заключается в том, что DeletionPolicy должна быть установлена ​​в одну из трех строк. И хотя ваша проверка If вернет один из них, с системной точки зрения, он знает только, что он возвращает String, но не гарантируется, что он является допустимой строкой (то же, что и для вашей проверки карт и параметров), и поэтому он принимает только строковый литерал, а не то, что разрешает строку.

Я считаю, что это ограничение было поднято ранее перед командой AWS Engineering, так как это неприятно.

Ответ 2

В соответствии с intrensic-function-referece https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

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

Таким образом, вы не можете использовать их для DeletionPolicy

Однако одним из обходных путей для этого являются условные условия облачной информации: https://www.unixdaemon.net/cloud/intro-to-cloudformations-conditionals/

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

Ответ 3

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