Пользователь terraform не обладает правами на выполнение: dynamodb:PutItem

Вопрос или проблема

сообщество!
Мне нужен ваш совет и помощь с моей ситуацией в Terraform.
Я настроил свою среду:
Terraform v1.9.8 на linux_amd64 и Ubuntu 22.04 в WSL2.0 для Win10.
Сейчас я развертываю окружение в AWS и у меня есть предварительные требования по хранению файла tfstate в S3 и его блокировке через DynamoDB.
Когда я запускаю terraform apply, я вижу следующее сообщение об ошибке:

# terraform apply
Получение блокировки состояния. Это может занять несколько минут...
╷
│ Ошибка: Ошибка при получении блокировки состояния
│
│ Сообщение об ошибке: операция ошиблась DynamoDB: PutItem, ошибка ответа https СтатусКод: 400, RequestID: 675BRV1T9IUNPI, ошибка api AccessDeniedException: Пользователь: arn:aws:iam::***:user/terraform не уполномочен выполнять: dynamodb:PutItem на ресурсе:
│ arn:aws:dynamodb:us-east-1:***:table/terraform-asav-lock-table, поскольку ни одна политика, основанная на личности, не позволяет действие dynamodb:PutItem
│ Невозможно получить элемент из таблицы DynamoDB "terraform-asav-lock-table": операция ошибка DynamoDB: GetItem, ошибка ответа https СтатусКод: 400, RequestID: 0N2J50TQTG2AKQIM, ошибка api AccessDeniedException: Пользователь: arn:aws:iam::***:user/terraform не уполномочен выполнять: dynamodb:GetItem на
│ ресурсе: arn:aws:dynamodb:us-east-1:***:table/terraform-asav-lock-table, поскольку ни одна политика, основанная на личности, не позволяет действие dynamodb:GetItem
│
│ Terraform получает блокировку состояния, чтобы защитить состояние от записи
│ несколькими пользователями одновременно. Пожалуйста, решите вышеуказанную проблему и попробуйте снова.
│ Для большинства команд вы можете отключить блокировку с помощью флага "-lock=false",
│ но это не рекомендуется.

И мой provider.tf:

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "5.50.0"

    }
  }

  backend "s3" {
    bucket         = "asavbacket"
    encrypt        = true
    key            = "terraform.tfstate/state"
    region         = "us-east-1"
    access_key     = "***"
    secret_key     = "***"
    dynamodb_table = "terraform-asav-lock-table"
  }
}

Пожалуйста, помогите мне понять, почему возникает эта ошибка?
Я пытался добавить политику IAM для пользователя IAM terraform, чтобы предоставить соответствующий доступ к S3 и таблице DynamoDB.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EnableIAMUserPermissions",
            "Effect": "Allow",
            "Action": "kms:*",
            "Resource": "arn:aws:kms:us-east-1:***:key/d6c67"
        },
        {
            "Sid": "StateBucketObjectAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:DeleteItem",
                "dynamodb:GetItem"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:***:table/terraform-asav-lock-table"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::asavbacket"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::asavbacket/terraform.tfstate/state"
        }
    ]
}

Обновление. Я нашел решение для этой ошибки. Я создал группу администраторов в своем аккаунте AWS и прикрепил пользователя terraform к этой группе.

Но теперь у меня появилась следующая ошибка:

Сообщение об ошибке: операция ошибка DynamoDB: PutItem, ошибка ответа https СтатусКод: 400, RequestID: H3QGJJHIOBPHFUAPNDE26HS82JVV4KQNSO5AEMVJF66Q9ASUAAJG, ошибка api ValidationException: Одно или несколько значений параметра были недействительны: отсутствует ключ terraform.tfstate в элементе
│ Невозможно получить элемент из таблицы DynamoDB "terraform-asav-lock-table": операция ошибка DynamoDB: GetItem, ошибка ответа https СтатусКод: 400, RequestID: 2Q9SQ7M20CT913K5RU3NHUPUIRVV4KQNSO5AEMVJF66Q9ASUAAJG, ошибка api ValidationException: Предоставленный элемент ключа не соответствует схеме

Можете помочь мне это исправить?

Ответ или решение

Проблема, с которой вы столкнулись, заключается в недостаточных разрешениях для пользователя Terraform на выполнение операций с DynamoDB. Давайте детально разберем ваши ошибки и предложим пути их устранения.

Ошибка 1: Недостаточные разрешения

Первое сообщение об ошибке указывает на то, что пользователь с IAM-идентификатором arn:aws:iam::***:user/terraform не имеет прав на выполнение следующих действий:

  • dynamodb:PutItem
  • dynamodb:GetItem

Шаги по устранению:

  1. Проверка IAM-политиков: Убедитесь, что ваша IAM-политика для пользователя terraform действительно включает необходимые разрешения. У вас уже есть следующие записи в вашей политике:

    {
       "Effect": "Allow",
       "Action": [
           "dynamodb:PutItem",
           "dynamodb:DeleteItem",
           "dynamodb:GetItem"
       ],
       "Resource": "arn:aws:dynamodb:us-east-1:***:table/terraform-asav-lock-table"
    }

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

  2. Проверка синтаксиса и имён ресурсов: Убедитесь, что ARN таблицы DynamoDB указан правильно и соответствует фактическому имени таблицы, которую вы создали.

Ошибка 2: Неверные параметры в запросе

Следующее сообщение об ошибке указывает на то, что параметр terraform.tfstate отсутствует в запрашиваемом элементе в таблице DynamoDB:

Error message: operation error DynamoDB: PutItem, https response error StatusCode: 400, api error ValidationException: One or more parameter values were invalid: Missing the key terraform.tfstate in the item

Это говорит о том, что Terraform ожидает наличие ключа с именем terraform.tfstate в таблице, но не может его найти. Это может происходить по нескольким причинам:

  1. Неправильная настройка таблицы DynamoDB: Проверьте, правильно ли вы настроили схему таблицы DynamoDB. Вам необходимо создать таблицу с ключом, который будет использоваться как блокировка состояния. Обычно это основной ключ, например, LockID.

    При создании таблицы DynamoDB убедитесь, что:

    • Основной ключ (Partition Key) имеет правильное имя (обычно это LockID).
    • Если вы используете составной ключ, убедитесь, что оба ключа правильно настроены.
  2. Проверка существования записи: Вы можете проверить, не существует ли уже соответствующая запись в таблице, и если да, то соответствует ли она ожидаемому формату.

Решение

Первым делом проверьте правильность настроек IAM, а затем убедитесь, что ваша таблица DynamoDB требует правильные ключи. Если таблица создана неправильно, вы можете создать её заново с корректной схемой.

Заключение

После выполнения указанных шагов попробуйте снова запустить команду terraform apply. Если всё сделано правильно, вы должны сможете успешно получить доступ к таблице DynamoDB и выполнить операции PutItem и GetItem. Если проблема не исчезает, попробуйте предоставить больше информации о текущих настройках DynamoDB. Это поможет более точно определить источник проблемы.

Оцените материал
Добавить комментарий

Капча загружается...