yandex-cloud / terraform-provider-yandex

Terraform Yandex provider
https://www.terraform.io/docs/providers/yandex/
Mozilla Public License 2.0
208 stars 114 forks source link

После создание Storage Bucket, получаю ошибку 403 Access Denied getting current policy #261

Open Caoimhin89 opened 2 years ago

Caoimhin89 commented 2 years ago

Storage Bucket успешно создан, но потом я получаю такую ошибку: 403 - error getting current policy.

Мой код:

terraform {
  required_providers {
    yandex = {
      source = "yandex-cloud/yandex"
    }
  }
}

provider "yandex" {
  token                    = var.yc_iam_token
  cloud_id                 = "ХХХХХХХХХХХХХХХХХХХХ"
  folder_id                = var.folder_id
  zone                     = "ru-central1-a"
}

// Storage IAM Member
resource "yandex_resourcemanager_folder_iam_member" "sa-editor" {
  folder_id = var.folder_id
  role      = "storage.editor"
  member    = "serviceAccount:${var.service_account_id}"
}

// Storage Static Access Keys
resource "yandex_iam_service_account_static_access_key" "sa-static-key" {
  service_account_id = "${var.service_account_id}"
  description        = "static access key for object storage"
}

// Logging Bucket
resource "yandex_storage_bucket" "logging_bucket" {
    access_key = "${yandex_iam_service_account_static_access_key.sa-static-key.access_key}"
    secret_key = "${yandex_iam_service_account_static_access_key.sa-static-key.secret_key}"
    bucket     = "${var.logging_bucket_name}"
}

После terraform apply, выводит на экран следующий текст:

module.data_layer.yandex_storage_bucket.logging_bucket: Still creating... [1m0s elapsed]
╷
│ Error: error getting current policy: AccessDenied: Access Denied
│       status code: 403, request id: 1c49327f9f0603b6, host id: 
│ 
│   with module.data_layer.yandex_storage_bucket.logging_bucket,
│   on modules/data/main.tf line 31, in resource "yandex_storage_bucket" "logging_bucket":
│   31: resource "yandex_storage_bucket" "logging_bucket" {

Я что-то не так делаю или это bug?

ferux commented 2 years ago

Доброго дня, Caoimhin89.

Да, у нас был баг в этом месте, но мы его уже исправили. В версии провайдера 0.75.0 эта ошибка будет поправлена.

Как временное решение, если с версией 0.73.0 проблем нет, можно воспользоваться ей. Для этого надо выставить её в вашем файле как-то так:

  required_providers {
    yandex = {
      source = "yandex-cloud/yandex"
      version = "0.73.0"
    }
  }

после чего выполнить команду terraform init -upgrade

salemgolemugoo commented 2 years ago

С 73 версией та же беда

Windemiatrix commented 2 years ago

Версия 0.80.0. При установке lifecycle_rule ошибка сохраняется.

ferux commented 2 years ago

Привет, @salemgolemugoo @Windemiatrix! Для решения проблем предлагаю вам создать обращение в нашей службе поддержки и уже в индивидуальном порядке мы сможем помочь найти проблему и решить её.

На данный момент следующий план выполняется успешно на версии 0.80.0:

terraform {
  required_providers {
    yandex = {
      source  = "yandex-cloud/yandex"
      version = "0.80.0"
    }
  }

  required_version = ">= 0.13"

  backend "s3" {
    endpoint   = "storage.yandexcloud.net"
    bucket     = "xxx"
    region     = "ru-central1-a"
    key        = "state.tfstate"
    access_key = "xxxx"
    secret_key = "xxxx"

    skip_region_validation      = true
    skip_credentials_validation = true
  }
}

locals {
  cloud_id  = "xxx"
  folder_id = "xxx"
  zone      = "ru-central1-a"
}

provider "yandex" {
  cloud_id  = local.cloud_id
  folder_id = local.folder_id
  zone      = local.zone
  service_account_key_file = file("terra-key.json")
}

resource "yandex_iam_service_account" "sa" {
  folder_id   = local.folder_id
  description = "Service account for terraform"
  name        = "sa"
}

resource "yandex_resourcemanager_folder_iam_member" "sa-editor" {
  folder_id = local.folder_id
  role      = "storage.editor"
  member    = "serviceAccount:${yandex_iam_service_account.sa.id}"
}

resource "yandex_iam_service_account_static_access_key" "keys" {
  service_account_id = yandex_iam_service_account.sa.id
  description        = "Access keys for object storage"
}

resource "yandex_storage_bucket" "backups" {
  bucket     = "xxx"
  access_key = yandex_iam_service_account_static_access_key.keys.access_key
  secret_key = yandex_iam_service_account_static_access_key.keys.secret_key

  lifecycle_rule {
    prefix  = "config/"
    enabled = true

    noncurrent_version_transition {
      days          = 30
      storage_class = "COLD"
    }

    noncurrent_version_expiration {
      days = 90
    }
  }
}

Логи:

yandex_iam_service_account.sa: Creating...
yandex_iam_service_account.sa: Creation complete after 2s [id=xxx]
yandex_resourcemanager_folder_iam_member.sa-editor: Creating...
yandex_iam_service_account_static_access_key.keys: Creating...
yandex_iam_service_account_static_access_key.keys: Creation complete after 1s [id=xxx]
yandex_storage_bucket.backups: Creating...
yandex_resourcemanager_folder_iam_member.sa-editor: Creation complete after 2s [id=xxx/storage.editor/serviceAccount:xxx]
yandex_storage_bucket.backups: Still creating... [10s elapsed]
yandex_storage_bucket.backups: Still creating... [20s elapsed]
yandex_storage_bucket.backups: Still creating... [30s elapsed]
yandex_storage_bucket.backups: Still creating... [40s elapsed]
yandex_storage_bucket.backups: Still creating... [50s elapsed]
yandex_storage_bucket.backups: Still creating... [1m0s elapsed]
yandex_storage_bucket.backups: Creation complete after 1m3s [id=xxx]

Возможно, AccessDenied в вашем случае имеет какую-то другую природу.

av-petrov commented 1 year ago

Здравствуйте! Аналогичная проблема. В каталоге права storage.admin, при попытке создать бакет из terraform, получаю ошибку:

yandex_storage_bucket.stat-event-code: Still creating... [50s elapsed]
yandex_storage_bucket.stat-event-code: Still creating... [1m0s elapsed]
╷
│ Error: handling lifecycle_rule: Error putting S3 lifecycle: AccessDenied: Access Denied
│       status code: 403, request id: 20ff976ddfec84c3, host id: 
│ 
│   with yandex_storage_bucket.stat-event-code,
│   on main.tf line 76, in resource "yandex_storage_bucket" "stat-event-code":
│   76: resource "yandex_storage_bucket" "stat-event-code" {
│ 

При этом, бакет создаётся, но без lifecycle_rule, и не сохраняется в состоянии terraform. Более того, я могу создать lifecycle_rule из web-интерфейса для этого же бакета.

 terraform version
Terraform v1.3.0
on darwin_amd64
+ provider registry.terraform.io/yandex-cloud/yandex v0.82.0

Код выглядит вот так:

resource "yandex_storage_bucket" "stat-event-code" {
  access_key = yandex_iam_service_account_static_access_key.sa-static-key.access_key
  secret_key = yandex_iam_service_account_static_access_key.sa-static-key.secret_key
  bucket     = "stat-event-code"
  folder_id  = data.yandex_resourcemanager_folder.folder.id
  max_size   = 50048576
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        kms_master_key_id = yandex_kms_symmetric_key.s3-key.id
        sse_algorithm     = "aws:kms"
      }
    }
  }
  anonymous_access_flags {
    read = false
    list = false
  }
  versioning {
    enabled = false
  }
  lifecycle_rule {
    id      = "static-event"
    enabled = true
    prefix  = "static-event"
    expiration {
      days = 7
    }
  }
}
av-petrov commented 1 year ago

При операциях через terraform:

av-petrov commented 1 year ago

Проблема решена в моём случае. Изменение параметров происходит от имени пользователя, статический ключ которого указан в параметрах access_key/secret_key, а не от того пользователя, от которого запускается tf. Собственно, невнимательно прочитал доку к провайдеру.

_For extended API usage, such as setting max_size, folder_id, anonymous_access_flags, default_storageclass and https parameters for bucket, will be used default authorization method, i.e. IAM / OAuth token from provider block will be used. This might be a little bit confusing in cases when separate service account is used for managing buckets because in this case buckets will be accessed by two different accounts that might have different permissions for buckets.