Skip to main content
Version: 1.12-grodno (current)

Модуль bucket

Тип: Terraform модуль для создания Yandex Object Storage бакетов

Использование: Создает бакет с настраиваемыми параметрами доступа, CORS, website hosting, шифрованием и lifecycle правилами.


Входные переменные

Обязательные

ПеременнаяОписание
provider-zoneЗона Yandex Cloud (например, ru-central1-a)
provider-tokenIAM токен для доступа к Yandex Cloud
provider-cloudidID облака
provider-folderidID папки
bucket-nameИмя бакета (например, my.medikt.net)

Доступ и CORS

ПеременнаяТипОписание
bucket_grantslist(object)Список прав доступа к бакету (например, AllUsers READ)
bucket_grants = [
{
type = "Group"
permissions = ["READ"]
uri = "http://acs.amazonaws.com/groups/global/AllUsers"
}
]
ПеременнаяТипОписание
cors_ruleobjectCORS правила для бакета
cors_rule = {
allowed_headers = ["*"]
allowed_methods = ["PUT", "GET"]
allowed_origins = ["*"]
expose_headers = ["Etag"]
max_age_seconds = "0"
}

Настройки безопасности

ПеременнаяТипОписание
encrypted_bucketboolВключить шифрование (по умолчанию false)
key_rotation_periodstringПериод ротации ключа KMS (по умолчанию "168h" = 7 дней)

Настройки хранилища

ПеременнаяТипОписание
bucket_logging_enabledboolВключить логирование (по умолчанию false)
bucket_versioning_enabledboolВключить версионирование (по умолчанию false)

Website hosting

ПеременнаяТипОписание
websiteobjectНастройки website hosting для бакета
foreign_websiteobjectWebsite hosting с внешним DNS
website = {
error_document = "index.html"
index_document = "index.html"
dns_zone_id = module.dns_zone.dns_zone_id
subdomain = "my"
certificate_id = var.certificate_id
}

Lifecycle правила

ПеременнаяТипОписание
abort_incomplete_multipart_upload_daysnumberУдаление незавершенных multipart uploads
expiration_rotation_periodnumberУдаление объектов через X дней
expiration_ruleslist(object)Дополнительные правила с префиксами
user_spa_backup_rotation_periodnumberУдаление бэкапов user-spa
expiration_rules = [
{
id = "EdgeCenterSyncExpirationRule"
days = 31
prefix = "edge-center-sync/"
}
]

Выходные переменные

ВыходОписание
provider-bucketИмя бакета
provider-bucket-idID бакета
provider-bucket-fqdnПолное доменное имя (bucket-domain-name)
bucket-access-keyAccess key для доступа к бакету
bucket-secret-keySecret key для доступа к бакету
service-account-idID сервисного аккаунта

Использование в prod-infra

module "private_bucket" {
source = "../modules/bucket"
bucket-name = "private.medikt.net"
provider-zone = var.provider-zone
provider-token = var.provider-token
provider-cloudid = var.provider-cloudid
provider-folderid = var.provider-folderid
cors_rule = {
allowed_headers = ["*"]
allowed_methods = ["PUT", "GET"]
allowed_origins = ["*"]
expose_headers = ["Etag"]
max_age_seconds = "0"
}
}

module "public_bucket" {
source = "../modules/bucket"
bucket-name = "public.medikt.net"
provider-zone = var.provider-zone
provider-token = var.provider-token
provider-cloudid = var.provider-cloudid
provider-folderid = var.provider-folderid
bucket_grants = [
{
type = "Group"
permissions = ["READ"]
uri = "http://acs.amazonaws.com/groups/global/AllUsers"
}
]
cors_rule = {
allowed_headers = ["*"]
allowed_methods = ["PUT", "GET"]
allowed_origins = ["*"]
expose_headers = ["Etag"]
max_age_seconds = "0"
}
}

module "transcoder_bucket" {
source = "../modules/bucket"
bucket-name = "transcoderbucket.medikt.net"
provider-zone = var.provider-zone
provider-token = var.provider-token
provider-cloudid = var.provider-cloudid
provider-folderid = var.provider-folderid
expiration_rotation_period = 31
}

module "my_static_website" {
source = "../modules/bucket"
bucket-name = "my.medikt.net"
provider-zone = var.provider-zone
provider-token = var.provider-token
provider-cloudid = var.provider-cloudid
provider-folderid = var.provider-folderid
bucket_grants = [
{
type = "Group"
permissions = ["READ"]
uri = "http://acs.amazonaws.com/groups/global/AllUsers"
}
]
user_spa_backup_rotation_period = 90
cors_rule = {
allowed_headers = ["*"]
allowed_methods = ["GET"]
allowed_origins = ["https://my.medikt.net/"]
expose_headers = ["Etag"]
max_age_seconds = "0"
}
website = {
error_document = "index.html"
index_document = "index.html"
dns_zone_id = module.dns_zone.dns_zone_id
subdomain = "my"
certificate_id = var.my_medikt_certificate_id
}
}

Примечания

  1. Версионирование: Для включения versioning требуется роль storage.admin (не storage.editor)
  2. Website hosting: При указании параметра website автоматически создается DNS запись типа ANAME
  3. Шифрование: При encrypted_bucket = true создается KMS ключ с ротацией
  4. DNS запись: Создается только для website, не для foreign_website