Ошибка MalformedPolicyDocument при создании политики через terraform

При запуске terraform я получаю следующую ошибку:

* aws_iam_role_policy.rds_policy: Error putting IAM role policy my-rds-policy: MalformedPolicyDocument: The policy failed legacy parsing

Вот мое определение ресурса:

resource "aws_iam_role_policy" "rds_policy" {
  name = "my-rds-policy"
  role = "${aws_iam_role.rds_role.id}"
  policy = <<EOF
  {
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket",
              "s3:GetBucketLocation"
          ],
          "Resource": [
              "arn:aws:s3:::my-bucket"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObjectMetaData",
              "s3:GetObject",
              "s3:PutObject",
              "s3:ListMultipartUploadParts",
              "s3:AbortMultipartUpload"
          ],
          "Resource": [
              "arn:aws:s3:::my-bucket/backups/*"
          ]
      }
  ]
}
EOF
}

Документ политики JSON хорошо сформирован, и я не вижу ничего очевидного.


person Robin Salih    schedule 07.03.2017    source источник
comment
Эта первая левая скобка после EOF выглядит так, как будто она имеет отступ, хотя этого быть не должно. Что произойдет, если вы отмените это? Материал heredoc иногда может быть довольно специфичным.   -  person ydaetskcoR    schedule 08.03.2017
comment
@ydaetskcoR Вау, как ни странно, это сработало. Отправьте это как ответ, и я отмечу его как правильное решение.   -  person Robin Salih    schedule 08.03.2017


Ответы (2)


Убедитесь, что у вас нет отступов в начале heredoc, поскольку ваша политика JSON не должна начинаться с фигурной скобки с отступом.

Итак, вас должно устроить это небольшое изменение:

resource "aws_iam_role_policy" "rds_policy" {
  name = "my-rds-policy"
  role = "${aws_iam_role.rds_role.id}"
  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket",
              "s3:GetBucketLocation"
          ],
          "Resource": [
              "arn:aws:s3:::my-bucket"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObjectMetaData",
              "s3:GetObject",
              "s3:PutObject",
              "s3:ListMultipartUploadParts",
              "s3:AbortMultipartUpload"
          ],
          "Resource": [
              "arn:aws:s3:::my-bucket/backups/*"
          ]
      }
  ]
}
EOF
}
person ydaetskcoR    schedule 08.03.2017

Или измените <<EOF на <<-EOF, чтобы разрешить отступ. Затем он удалит количество отступов, соответствующее строке с наименьшим количеством отступов при применении.

person Martin Verner    schedule 03.02.2020
comment
Однако будьте осторожны, чтобы не использовать директивы с обрезкой начальных пробелов% {~ ...} в heredoc, поскольку это нарушает отступы и является настоящей проблемой для тренировки, почему он жалуется, что ваш первый символ не '{' - person JamesP; 29.03.2021