ОБНОВЛЕНИЕ: iam_policy_document: Ошибка: недействительный параметр: недопустимый параметр: Ошибка политики: нулевой код статуса: 400, идентификатор запроса

#amazon-web-services #amazon-sns #terraform0.12

#amazon-web-services #amazon-sns #terraform0.12

Вопрос:

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

Вся структура всех модулей, необходимых для того, чтобы это произошло, включает в себя следующее:

 %ls

caller_identity     event_rule  event_target    iam_policy_document sns_topic_policy
  

в caller_dentity:

 ls
main.tf     output.tf   variable.tf
  

в event_rules:

 main.tf     output.tf   variable.tf
  

в event_target:

 main.tf     variable.tf  (i did not seem to need to have an output to be used somewhere else.)
  

в iam_policy_document:

 ls% main.tf     output.tf   variable.tf


data "aws_iam_policy_document" "this" {
  statement {
     actions  = [
      "SNS:GetTopicAttributes",
      "SNS:SetTopicAttributes",
      "SNS:AddPermission",
      "SNS:RemovePermission",
      "SNS:DeleteTopic",
      "SNS:Subscribe",
      "SNS:ListSubscriptionsByTopic",
      "SNS:Publish",
      "SNS:Receive"
    ]

    condition {
       test      = "StringEquals"
      variable = "AWS:SourceOwner"

      values = [
      var.account
      ]
    }

    effect = "Allow"

    principals {
       type         = "AWS"
      identifiers = ["*"]
    }

    resources = [
      var.arn
    ]

    sid = "__default_statement_ID"
  }

  statement {
     actions  = [
      "sns:Publish"
    ]

    effect = "Allow"

    principals {
       type         = "Service"
      identifiers = ["events.amazonaws.com"]
    }

    resources = [
      var.arn
    ]

    sid = "TrustCWEToPublishEventsToMyTopic"
  }
}
  

в sns_topic_policy:

 main.tf     output.tf   variable.tf

resource "aws_sns_topic_policy" "this" {
   arn = var.arn 
   policy = var.policy
}
  

Я начал переделывать их все в опубликованном порядке, чем я бы тестировал по ходу работы. когда все сказано и сделано, terraform необходимо создать 4 элемента; Я знаю это наверняка, потому что немодульная версия является моей базовой

Итак, кажется, что все работает нормально, ПОКА я не перейду к aws_sns_topic_policy.

это если я удаляю sns_topic

         }
    }

Plan: 3 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: 

  

I hit yes and it completes giving me the output I stated below.

now once I add the sns module, somewhere it goes haywire.

my outputs:

 Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

caller_identity_out = 012345678910
cloudwatch_event_rule_out = Detect-Local-User-Creations
iam_policy_document_out = {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Action": [
        "SNS:Subscribe",
        "SNS:SetTopicAttributes",
        "SNS:RemovePermission",
        "SNS:Receive",
        "SNS:Publish",
        "SNS:ListSubscriptionsByTopic",
        "SNS:GetTopicAttributes",
        "SNS:DeleteTopic",
        "SNS:AddPermission"
      ],
      "Resource": "arn:aws:sns:us-east-1:012345678910:tf-SnsTopic-EmailSNSTopic-9JJZS66CE1CW",
      "Principal": {
        "AWS": "*"
      },
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "012345678910"
        }
      }
    },
    {
      "Sid": "TrustCWEToPublishEventsToMyTopic",
      "Effect": "Allow",
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:us-east-1:012345678910:tf-SnsTopic-EmailSNSTopic-9JJZS66CE1CW",
      "Principal": {
        "Service": "events.amazonaws.com"
      }
    }
  ]
}
  

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

 iam_policy_document: Error: InvalidParameter: Invalid parameter: Policy Error: null status code: 400,

  

output.tf файл

 output "iam_policy_document_out" {
  value = data.aws_iam_policy_document.this.json
}
  

Было упомянуто, что jsonencode не нужен, если я его удалю, вот что произойдет.

Ошибка, полученная при изменении #policy = jsonencode(«module.aws_iam_policy_document.iam_policy_document_out»)

policy = «module.aws_iam_policy_document.iam_policy_document_out»

ОШИБКА::

 dLocalUsers]
module.iam_policy_document.data.aws_iam_policy_document.this: Refreshing state...

Error: "policy" contains an invalid JSON: invalid character 'm' looking for beginning of value

  on ../../../modules/cloudwatch/sns_topic_policy/main.tf line 3, in resource "aws_sns_topic_policy" "this":
   3:    policy = var.policy

  

последнее, что я делаю, — это когда я реализую «альтернативы» из ответа.
Я получаю эту ошибку, но не вижу проблемы. Я не могу понять, что это за ошибка. У меня работает вывод, он объявлен в sns_topic .. так что либо я упускаю очевидное, я не знаю…

 Error: Reference to undeclared module

  on main.tf line 43, in module "sns_topic_policy":
  43:   policy = module.aws_iam_policy_document.iam_policy_document_out.json

No module call named "aws_iam_policy_document" is declared in the root module.
  

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

1. Это трудно предположить. Что такое iam_policy_document_out ? Его форма не показана в вашем вопросе.

2. о да, позвольте мне добавить еще немного информации к исходному вопросу.. Спасибо

Ответ №1:

Ваш iam_policy_document_out уже находится в json форме:

 value = data.aws_iam_policy_document.this.json
  

Следовательно, в модуле следует использовать следующее:

 module "sns_topic_policy" {
  source = "./sns_topic_policy/"
  arn    = module.SnsTopic.arn
  policy = module.aws_iam_policy_document.iam_policy_document_out
}
  

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

Альтернативный:

 output "iam_policy_document_out" {
  value = data.aws_iam_policy_document.this
}
  
 module "sns_topic_policy" {
  source = "./sns_topic_policy/"
  arn    = module.SnsTopic.arn
  policy = module.aws_iam_policy_document.iam_policy_document_out.json
}
  

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

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

2. @Randal код jsoneencode не должен быть обязательным. Именно так это также делается в документах , и я могу подтвердить, что это работает в целом. Я предоставлю альтернативный способ в ответе.

3. это связано с отсутствием у меня навыков TF. что я делаю, так это создаю переменную в variable.tf , чем фактически помещать ссылку в main.tf которую я запускаю.. Вероятно, это совершенно неверно, но это все, что я смог выяснить.

4. @Randal Ты знаешь, откуда это invalid character 'm' взялось? Я не вижу ничего плохого в политике.

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