Проблема с настройкой 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 шт):
Чисто для теста попробуй простого админа (Simpe admin в ролях для сервисного аккаунта), только потом нормально роли настрой.
upd:
- проверь что целевой папке в списке сервисных аккаунтов есть тот, который ты настраиваешь.
- проверь что у аккаунта есть роль storage.admin (см доку https://yandex.cloud/en-ru/docs/iam/roles-reference)
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
и не указывая их. Для этого вам:
- понадобится обновить провайдер до последней версии.
- в ресурсе бакета указать
folder_id
. Тогда он будет создаваться не при помощи AWS SDK, где нужны ключи в совместимом с ним формате, а через YC gRPC API, где возможно использование IAM-токена и ключи не нужны.
Вот ссылка на код провайдера, где выбирается клиент.
Вторая ошибка связана с нехваткой прав. Чтобы создавать сервисные аккаунты вам нужна роль iam.serviceAccounts.admin
на фолдер, в котором вы создаете аккаунт. Чтобы выдать ему роль на работу с Object Storage, вам понадобится роль не ниже storage.admin
.