Ich versuche, eine Schleife über Zeichenfolgenwerte in einem IAM-Richtlinienressourcenblock zu erhalten, um die RDS-IAM-Authentifizierung zu ermöglichen. Meine Ressourcendefinition lautet:
resource "aws_iam_policy" "rds_iam_authentication"{
name = "${title(var.environment)}RdsIamAuthentication"
policy = templatefile(
"${path.module}/iam_policy.json",
{
aws_account_id = data.aws_caller_identity.current.account_id
region = var.region
environment = var.environment
iam_rds_pg_role_name = var.iam_rds_pg_role_name
}
)
}
Die Variablendefinition von iam_rds_pg_role_name
in terraform.tfvars
lautet wie folgt:
region = "eu-west-3"
environment = "env_name"
iam_rds_pg_role_name = ["read_only_role", "full_role"]
aws_account_id = "1234567890"
Und die Vorlagendatei für die IAM-Richtlinie lautet:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
%{ for rds_role in iam_rds_pg_role_name ~}
"arn:aws:rds-db:${region}:${aws_account_id}:dbuser:*/${rds_role}"
%{ endfor ~}
]
}
]
}
Ich erhalte die Fehlermeldung
Fehler: „policy“ enthält ein ungültiges JSON: ungültiges Zeichen „“ nach Array-Element
Ich bin ziemlich sicher, dass das Problem mit der JSON-Kodierung zusammenhängt. Beim Versuch, jsonencode
die ARN-Definition in JSON wie folgt einzugeben, tritt der Fehler jedoch weiterhin auf:
%{ for rds_role in iam_rds_pg_role_name ~}
jsonencode("arn:aws:rds-db:${region}:${aws_account_id}:dbuser:*/${rds_role}")}
%{ endfor ~}
Ich wäre dankbar, wenn mir jemand erklären würde, was ich übersehe, oder mir den richtigen Weg weisen würde.
Dank im Voraus
Antwort1
In Ihrer IAM-Richtlinienvorlagendatei fehlt ein abschließendes Komma für Elemente in Resource
:
...
"Resource": [
%{ for rds_role in iam_rds_pg_role_name ~}
"arn:aws:rds-db:${region}:${aws_account_id}:dbuser:*/${rds_role}",
there should be a comma here ^
%{ endfor ~}
]
...
Sie können sowohl den Index als auch das Element in durchlaufen iam_rds_pg_role_name
und ein Komma hinzufügen, wenn der Index kleiner ist als length(iam_rds_pg_role_name) - 1
:
...
"Resource": [
%{ for index, rds_role in iam_rds_pg_role_name ~}
"arn:aws:rds-db:${region}:${aws_account_id}:dbuser:*/${rds_role}"%{ if idx < length(iam_rds_pg_role_name) - 1 },%{ endif }
%{ endfor ~}
]
...
Ergebnis:
Terraform will perform the following actions:
# aws_iam_policy.rds_iam_authentication will be created
+ resource "aws_iam_policy" "rds_iam_authentication" {
+ arn = (known after apply)
+ id = (known after apply)
+ name = "Env_nameRdsIamAuthentication"
+ name_prefix = (known after apply)
+ path = "/"
+ policy = jsonencode(
{
+ Statement = [
+ {
+ Action = [
+ "rds-db:connect",
]
+ Effect = "Allow"
+ Resource = [
+ "arn:aws:rds-db:eu-west-3:1234567890:dbuser:*/read_only_role",
+ "arn:aws:rds-db:eu-west-3:1234567890:dbuser:*/full_role",
]
},
]
+ Version = "2012-10-17"
}
)
+ policy_id = (known after apply)
+ tags_all = (known after apply)
}