Проблема с настройкой Terraform для работы с Yandex.Cloud

Я сталкиваюсь с двумя основными проблемами при работе с Terraform для создания ресурсов в Yandex.Cloud:

Ошибка при создании S3-бакета: При попытке создать бакет в Yandex.Cloud с помощью Terraform возникает ошибка:

Error: error creating Storage S3 Bucket: error getting storage client: failed to get default storage client

Ошибка с созданием сервисного аккаунта: При попытке создать сервисный аккаунт для функции возникает ошибка с правами доступа:

Error: Error while requesting API to create service account: server-request-id = <some-id> rpc error: code = PermissionDenied desc = You are not authorized for this operation

resource.tf

resource "yandex_storage_bucket" "exam_solver_tg_bot_bucket" {
  bucket = var.bucket_name
}
resource "yandex_storage_object" "yandexgpt_instruction" {
  bucket = yandex_storage_bucket.exam_solver_tg_bot_bucket.id
  key    = var.bucket_object_key
  source = "instruction.txt"
}


data "archive_file" "content" {
  type        = "zip"
  source_dir  = var.source_dir
  output_path = "./build/hash.zip"
}

resource "local_file" "user_hash_file" {
  content  = data.archive_file.content.output_sha512
  filename = "../src/build/hash/user_hash.txt"
}

resource "yandex_function" "bot" {
  name               = "bot"
  description        = "Функция для обработки сообщений от Telegram бота"
  entrypoint         = "index.handler"
  memory             = "128"
  runtime            = "python312"
  service_account_id = yandex_iam_service_account.sa_adm_tg_bot.id  
  user_hash          = data.archive_file.content.output_sha512
  execution_timeout  = "30"
  environment = {
    TELEGRAM_BOT_TOKEN = var.tg_bot_key
    FOLDER_ID          = var.folder_id
  }
  content {
    zip_filename = data.archive_file.content.output_path
  }
}

resource "yandex_iam_service_account" "sa_adm_tg_bot" {
  name = "sa-adm-tg-bot"  # Новый сервисный аккаунт
}

resource "yandex_resourcemanager_folder_iam_member" "sa_adm_tg_bot_storage_viewer_iam" {
  folder_id = var.folder_id
  role      = "storage.viewer"
  member    = "serviceAccount:${yandex_iam_service_account.sa_adm_tg_bot.id}"
}

resource "null_resource" "register_webhook" {
  triggers = {
    function_id = yandex_function.bot.id  
  }
  provisioner "local-exec" {
    command = <<EOT
      curl -s -X POST \
      "https://api.telegram.org/bot${var.tg_bot_key}/setWebhook" \
      -d "url=https://functions.yandexcloud.net/${yandex_function.bot.id}" 
    EOT
  }
}


resource "null_resource" "delete_webhook" {
  triggers = {
    tg_bot_key = var.tg_bot_key
  }

  provisioner "local-exec" {
    command = "curl -s -X POST https://api.telegram.org/bot${var.tg_bot_key}/deleteWebhook"
  }
}

providers.tf

terraform {
  required_providers {
    yandex = {
      source = "yandex-cloud/yandex"
      version = "0.80.0"
    }
    telegram = {
      source  = "yi-jiayu/telegram"
      version = "0.3.1"
    }
  }
  required_version = ">= 0.13"
}

provider "yandex" {
  cloud_id = var.cloud_id
  folder_id = var.folder_id
  service_account_key_file = pathexpand(var.key_file_path)
}

provider "telegram" {
  bot_token = var.tg_bot_key
}

variables.tf

variable "cloud_id" {
    description = "ID облака Yandex Cloud"
    type = string
}

variable "folder_id" {
    description = "ID каталога Yandex Cloud"
    type = string
}

variable "tg_bot_key" {
    description = "Токен для доступа к Telegram Bot API"
    type = string
}

variable "key_file_path" {
  type        = string
  description = "Ключ сервисного аккаунта"
  default     = "~/.yc-keys/key.json"
}

variable "source_dir" {
  type        = string
  description = "Путь к директории для архивации"
  default     = "/Users/karina/Desktop/VvOT/src"
}

variable "bucket_name" {
  description = "Имя bucket для хранения объектов"
  type        = string
}

variable "bucket_object_key" {
  description = "Ключ объекта, который будет храниться в bucket"
  type        = string
}

На сервисный аккаунт навешены все возможные роли


Ответы (2 шт):

Автор решения: Alexey Gurzhiy

Чисто для теста попробуй простого админа (Simpe admin в ролях для сервисного аккаунта), только потом нормально роли настрой.

upd:

  1. проверь что целевой папке в списке сервисных аккаунтов есть тот, который ты настраиваешь.
  2. проверь что у аккаунта есть роль storage.admin (см доку https://yandex.cloud/en-ru/docs/iam/roles-reference)
→ Ссылка
Автор решения: Nikolay Matrosov

Error: error creating Storage S3 Bucket: error getting storage client: failed to get default storage client

Эта ошибка обычно возникает, когда не заданы ключи storage_access_key и storage_secret_key в конфигурации провайдера.

Однако, вы можете создавать ресурс yandex_storage_bucket и не указывая их. Для этого вам:

  1. понадобится обновить провайдер до последней версии.
  2. в ресурсе бакета указать folder_id. Тогда он будет создаваться не при помощи AWS SDK, где нужны ключи в совместимом с ним формате, а через YC gRPC API, где возможно использование IAM-токена и ключи не нужны.

Вот ссылка на код провайдера, где выбирается клиент.

Вторая ошибка связана с нехваткой прав. Чтобы создавать сервисные аккаунты вам нужна роль iam.serviceAccounts.admin на фолдер, в котором вы создаете аккаунт. Чтобы выдать ему роль на работу с Object Storage, вам понадобится роль не ниже storage.admin.

→ Ссылка