#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. итак, я повторил все еще раз. похоже, ваш ответ был основным исправлением. Я заметил, что ссылка на выходные данные была неправильной, и это, наконец, завершило финальную часть. итак, это сделано, спасибо за информацию.