ресурсы terraform 0.13.5 перезаписывают друг друга при последовательных вызовах

#terraform #terraform-provider-aws

#terraform #terraform-provider-aws

Вопрос:

  • Я использую terraform 0.13.5 для создания ресурсов aws_iam
  • У меня есть 2 ресурса terraform следующим образом
     module "calls_aws_iam_policy_attachment" {
      # This calls an external module to 
      # which among other things creates a policy attachment 
      # resource attaching the roles to the policy
      source   = ""
      name = "xoyo"
      roles = ["rolex", "roley"]
      policy_arn = "POLICY_NAME"
    }
    
    resource "aws_iam_policy_attachment" "policies_attached" {
      # This creates a policy attachment resource attaching the roles to the policy
      # The roles here are a superset of the roles in the above module
      roles = ["role1", "role2", "rolex", "roley"]
      policy_arn = "POLICY_NAME"
      name = "NAME"
      # I was hoping that adding the depends on block here would mean this 
      # resource is always created after the above module
      depends_on = [ module.calls_aws_iam_policy_attachment ]
    }
     
  • Первый модуль создает политику и присоединяет некоторые роли. Я не могу редактировать этот модуль
  • Второй ресурс присоединяет больше ролей к той же политике вместе с другими политиками
  • второй ресурс зависит от первого ресурса, поэтому я бы ожидал, что вложения политики второго ресурса всегда перезаписывают вложения первого ресурса
  • На самом деле вложения политики в каждом ресурсе перезаписывают друг друга при каждой последовательной сборке. Так что при первой сборке применяются вторые вложения ресурсов, а при второй сборке применяются первые вложения ресурсов и так далее и тому подобное.
  • Может кто-нибудь сказать мне, почему это происходит? Разве depends_on не работает для ресурсов, которые перезаписывают друг друга?
  • Есть ли простое решение без объединения обоих моих ресурсов в один и тот же ресурс?

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

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

2. Спасибо @luk2302 Ну, один из них является надмножеством другого. Поэтому я хотел, чтобы надмножество всегда переопределяло подмножество. Это массовое нет-нет? Я довольно новичок в terraform, поэтому все еще знакомлюсь с лучшими практиками

3. Чтобы было понятно, подмножество создает другие ресурсы, отличные от просто привязки политики. Таким образом, решение не так просто, как просто удалить все это вместе. Иначе меня бы здесь не было 🙂

Ответ №1:

Почему это происходит:

  • во время первого запуска terraform развертывает первые ресурсы, затем вторые — этот порядок обусловлен depends_on отношением (следующие шаги работают независимо от любого depends_on ). Вторые перезаписывают первые
  • во время второго развертывания terraform рассматривает, что нужно сделать:
    • первые отсутствуют (были перезаписаны), их необходимо создать
    • вторые в порядке, terraform игнорирует их для этого обновления
    • теперь будут созданы только первые, и они будут перезаписывать вторые
  • во время третьего запуска происходит то же самое, но с точностью до наоборот, секунды отсутствуют, первые игнорируются, вторые перезаписываются первыми
  • повторяйте это так часто, как захотите, и вы никогда не получите стабильного развертывания.

Решение: не указывайте конфликтующие вещи в terraform. Предполагается, что Terraform представляет собой описание того, как должна выглядеть инфраструктура, и утверждение «этот ресурс должен иметь только свойство A» и «этот ресурс должен иметь только свойство B» противоречиво, terraform не сможет справиться с этим изящно.

Что вам следует сделать конкретно: не используйте aws_iam_policy_attachment , практически никогда, посмотрите на большое красное поле в документах. aws_iam_role_policy_attachment Вместо этого используйте несколько, они аддитивны, они не будут перезаписывать друг друга.