Как проверить, существует ли определенный ресурс в CloudFormation script

Я использую cloudformation для создания стека, который включает автомасштабированный экземпляр ec2 и ведро S3. Для ведра S3 у меня DeletionPolicy установлен на Retain, который отлично работает, пока я не хочу снова запустить мою облачную среду script. Поскольку в предыдущих запусках, script создал ведро S3, он не работает при последующих запусках, говоря, что мой ведро S3 уже существует. Разумеется, ни один из других ресурсов не создается. Мой вопрос заключается в том, как проверить, существует ли мой веток S3 сначала внутри облачной среды script, и если да, то пропустите создание этих ресурсов. Я просмотрел условия в AWS, но, похоже, все параметры основаны, мне еще предстоит найти функцию, которая проверяет существующие ресурсы.

Ответы

Ответ 1

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

Если вы хотите использовать один и тот же ведро S3 для нескольких стеков (даже если только один из них существует одновременно), этот ковш действительно не принадлежит в стеке - было бы разумнее создать ведро в отдельном стек с использованием отдельного шаблона (размещение URL-адреса ведра в разделе "Выходы" ), а затем ссылка на него из исходного стека с использованием параметра.

Ответ 2

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

Ответ 3

Если вы делаете обновления (потенциально стеки в пакетах aka Nested Stacks), неизменные части не обновляются. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html?icmpid=docs_cfn_console_designer

Затем вы можете установить политики, как указано для предотвращения удаления. [запомнить "отменить обновление" для откатов] https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html

Также есть вывод Cross-Stack, добавляя Export Names к выводам стека. http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html Прохождение... http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html

Затем вам нужно использовать Fn:: ImportValue... http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html

Это означает, что можно использовать параметр имени сетевого стека.

К сожалению, у вас появляется такая ошибка, когда вы пытаетесь использовать их в Условиях.

Ошибка проверки шаблона: ошибка шаблона: нельзя использовать Fn:: ImportValue в условиях.

Или в параметрах?

Ошибка проверки шаблона: ошибка формата шаблона: каждый член по умолчанию должен быть строкой.

Также это может произойти при попытке...

Ошибка формата шаблона: вывод ExportOut неверен. Поле Имя экспорта не должны зависеть от каких-либо ресурсов, импортированных значений или Fn:: GetAZs.

Таким образом, вы не можете остановить его, сделав существующий ресурс снова из того же файла. Только при переносе в другой стек и использовании ссылки на импорт экспорта.

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

Пример:

Сначала создайте групповой шаблон

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Metadata": {
    "AWS::CloudFormation::Designer": {
      "6927bf3d-85ec-449d-8ee1-f3e1804d78f7": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -390,
          "y": 130
        },
        "z": 0,
        "embeds": []
      },
      "6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": {
        "source": {
          "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
        },
        "target": {
          "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        },
        "z": 1
      }
    }
  },
  "Resources": {
    "TestGroup": {
      "Type": "AWS::IAM::Group",
      "Properties": {},
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        }
      },
      "Condition": ""
    }
  },
  "Parameters": {},
  "Outputs": {
    "GroupNameOut": {
      "Description": "The Group Name",
      "Value": {
        "Ref": "TestGroup"
      },
      "Export": {
        "Name": "Exported-GroupName"
      }
    }
  }
}

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

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Metadata": {
    "AWS::CloudFormation::Designer": {
      "ac295134-9e38-4425-8d20-2c50ef0d51b3": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -450,
          "y": 130
        },
        "z": 0,
        "embeds": [],
        "isrelatedto": [
          "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        ]
      },
      "6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": {
        "source": {
          "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
        },
        "target": {
          "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        },
        "z": 1
      }
    }
  },
  "Resources": {
    "TestUser": {
      "Type": "AWS::IAM::User",
      "Properties": {
        "UserName": {
          "Ref": "UserNameParam"
        },
        "Groups": [
          {
            "Fn::ImportValue": "Exported-GroupName"
          }
        ]
      },
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
        }
      }
    }
  },
  "Parameters": {
    "UserNameParam": {
      "Default": "testerUser",
      "Description": "Username For Test",
      "Type": "String",
      "MinLength": "1",
      "MaxLength": "16",
      "AllowedPattern": "[a-zA-Z][a-zA-Z0-9]*",
      "ConstraintDescription": "must begin with a letter and contain only alphanumeric characters."
    }
  },
  "Outputs": {
    "UserNameOut": {
      "Description": "The User Name",
      "Value": {
        "Ref": "TestUser"
      }
    }
  }
}

Вы получите

Нет экспорта с именем Exported-GroupName. Откат, запрошенный пользователем.

если выполняется запуск пользователя без какой-либо группы. Экспортировано.

Затем вы можете использовать подход вложенного стека.

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Metadata": {
    "AWS::CloudFormation::Designer": {
      "66470873-b2bd-4a5a-af19-5d54b11f48ef": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -815,
          "y": 169
        },
        "z": 0,
        "embeds": []
      },
      "ed1de011-f1bb-4788-b63e-dcf5494d10d1": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -710,
          "y": 170
        },
        "z": 0,
        "dependson": [
          "66470873-b2bd-4a5a-af19-5d54b11f48ef"
        ]
      },
      "c978f2d9-3fb2-4420-b255-74941f10a28a": {
        "source": {
          "id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1"
        },
        "target": {
          "id": "66470873-b2bd-4a5a-af19-5d54b11f48ef"
        },
        "z": 1
      }
    }
  },
  "Resources": {
    "GroupStack": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestGroup.json"
      },
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "66470873-b2bd-4a5a-af19-5d54b11f48ef"
        }
      }
    },
    "UserStack": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestUserFindsGroup.json"
      },
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1"
        }
      },
      "DependsOn": [
        "GroupStack"
      ]
    }
  }
}

К сожалению, вы все равно можете удалить стек пользователя, даже если он был сделан MultiStack в этом примере, но с политиками удаления и другими вещами, которые он может просто помочь.

Затем вы только обновляете различные стеки, которые он создает, и вы не будете делать Multi Stack, если вы, например, повторно используете Bucket.

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