---
title: 'MinIO SDK'
sidebar_label: 'MinIO SDK'
sidebar_position: 15
description: 'Как настроить MinIO SDK и работать с S3'
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import GrantAccess from '@site/docs/_partials/s3/grant-access.mdx'
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import {TabItemLabel} from '@selectel/docux/components'
import {CustomTable} from '@selectel/docux/components'

# MinIO SDK

[MinIO Go Client SDK](https://pkg.go.dev/github.com/minio/minio-go/v7#section-readme) — официальная библиотека для языка Go, которая позволяет работать с S3-совместимыми хранилищами через API Amazon S3 ([S3 API](/api/object-storage-s3/)).

## Настроить MinIO SDK \{#configure-minio-sdk}

1. [Настройте доступ к S3](#configure-s3-access).
2. [Установите библиотеку в проекте](#install-library).
3. [Задайте переменные окружения](#set-variables).
4. [Настройте клиент](#configure-client).

### 1. Настроить доступ к S3 \{#configure-s3-access}

<GrantAccess />

### 2. Установить библиотеку \{#install-library}

1. Откройте CLI.
2. Подключите библиотеку к вашему проекту:

   ```go
   go get github.com/minio/minio-go/v7
   ```

### 3. Задать переменные окружения \{#set-variables}

Доступны разные способы указания S3-ключей.
Мы рекомендуем указывать S3-ключи не в коде, а через переменные окружения.
Подробнее о других способах в [документации MinIO SDK](https://pkg.go.dev/github.com/minio/minio-go/v7/pkg/credentials).

<Tabs queryString="set-variables">
  <TabItem value="linux-macos" default>
    <TabItemLabel>
      Linux/macOS
    </TabItemLabel>

    1. Откройте CLI.
    2. Задайте переменные:

       ```bash
       export AWS_ACCESS_KEY_ID=<access_key>
       export AWS_SECRET_ACCESS_KEY=<secret_key>
       ```

       Укажите:

       * `<access_key>` — значение поля **Access key** из S3-ключа, который вы [получили на этапе 1](#configure-s3-access);
       * `<secret_key>` — значение поля **Secret key** из S3-ключа, который вы [получили на этапе 1](#configure-s3-access).
  </TabItem>

  <TabItem value="windows">
    <TabItemLabel>
      Windows
    </TabItemLabel>

    1. Откройте PowerShell.
    2. Задайте переменные:

       ```PowerShell
       $env:AWS_ACCESS_KEY_ID="<access_key>"
       $env:AWS_SECRET_ACCESS_KEY="<secret_key>"
       ```

       Укажите:

       * `<access_key>` — значение поля **Access key** из S3-ключа, который вы [получили на этапе 1](#configure-s3-access);
       * `<secret_key>` — значение поля **Secret key** из S3-ключа, который вы [получили на этапе 1](#configure-s3-access).
  </TabItem>
</Tabs>

### 4. Настройте клиент \{#configure-client}

1. В вашем локальном проекте откройте файл `main.go`.
2. Добавьте скрипт инициализации клиента:

   ```go
   package main

   import (
       "context"
       "log"
       "github.com/minio/minio-go/v7"
       "github.com/minio/minio-go/v7/pkg/credentials"
   )

   func main() {

       creds := credentials.NewEnvAWS()

       endpoint := "<s3_domain>"

       minioClient, err := minio.New(endpoint, &minio.Options{
           Creds:  creds,
           Secure: true,
       })
       if err != nil {
           log.Fatal(err)
       }

   }
   ```

   Укажите `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains).
   Домен зависит от [пула](/infrastructure/locations.mdx#pool), в котором находится S3.

## Работа с MinIO SDK \{#minio-sdk-usage}

Если при работе с MinIO SDK возникают ошибки, проверьте [список возможных ошибок](#errors).

### Получить список бакетов \{#get-bucket-list}

1. Откройте файл `main.go` с клиентом, который вы [настроили на этапе 4](#configure-client), или создайте новый файл и скопируйте в него клиент.
2. В блок `func main()` добавьте скрипт для получения списка бакетов:

   ```go
     info, err := minioClient.ListBuckets(context.Background())
     if err != nil {
         log.Fatalf("cannot get ListBuckets: %s", err)
     }

     log.Printf("%#v\n", info)
   ```

   <details>
     <summary>Пример полного скрипта</summary>

     ```go
     package main

     import (
         "context"
         "log" 
         "github.com/minio/minio-go/v7"
         "github.com/minio/minio-go/v7/pkg/credentials"
     )

     func main() {

         creds := credentials.NewEnvAWS()

         endpoint := "<s3_domain>"

         minioClient, err := minio.New(endpoint, &minio.Options{
             Creds:  creds,
             Secure: true,
         })
         if err != nil {
             log.Fatal(err)
         }

         info, err := minioClient.ListBuckets(context.Background())
         if err != nil {
             log.Fatalf("cannot get ListBuckets: %s", err)
         }

         log.Printf("%#v\n", info)

     }
     ```

     Здесь `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains).
     Домен зависит от [пула](/infrastructure/locations.mdx#pool), в котором находится S3.
   </details>

### Создать бакет \{#create-bucket}

1. Откройте файл `main.go` с клиентом, который вы [настроили на этапе 4](#configure-client), или создайте новый файл и скопируйте в него клиент.
2. В блок `func main()` добавьте скрипт для создания бакета:

   ```go
   bucketName := "<bucket_name>"

   err = minioClient.MakeBucket(
       context.Background(),
       bucketName,
       minio.MakeBucketOptions{Region: "<pool>"},
   )
   if err != nil {
       exists, errBucketExists := minioClient.BucketExists(context.Background(), bucketName)
       if errBucketExists == nil && exists {
       log.Printf("Bucket %s already exists", bucketName)
       } else {
       log.Fatalf("cannot create bucket: %s", err)
       }
   } else {
       log.Printf("Bucket %s created", bucketName)
   } 
   ```

   Укажите:

   * опционально: `<pool>` — [пул](/infrastructure/locations.mdx#pool), в котором будет создан бакет;
   * `<bucket_name>` — имя бакета.

   <details>
     <summary>Пример полного скрипта</summary>

     ```go
     package main

     import (
         "context"
         "log"

         "github.com/minio/minio-go/v7"
         "github.com/minio/minio-go/v7/pkg/credentials"
     )

     func main() {

         creds := credentials.NewEnvAWS()

         endpoint := "<s3_domain>"

         minioClient, err := minio.New(endpoint, &minio.Options{
             Creds:  creds,
             Secure: true,
         })
         if err != nil {
             log.Fatal(err)
         }

         bucketName := "bucketName"

         err = minioClient.MakeBucket(
             context.Background(),
             bucketName,
             minio.MakeBucketOptions{Region: "ru-7"},
         )
         if err != nil {
             exists, errBucketExists := minioClient.BucketExists(context.Background(), bucketName)
             if errBucketExists == nil && exists {
                 log.Printf("Bucket %s already exists", bucketName)
             } else {
                 log.Fatalf("cannot create bucket: %s", err)
             }
         } else {
             log.Printf("Bucket %s created", bucketName)
         }
     }
     ```

     Здесь `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains).
     Домен зависит от [пула](/infrastructure/locations.mdx#pool), в котором находится S3.
   </details>

### Загрузить объект в бакет \{#upload-object}

1. Откройте файл `main.go` с клиентом, который вы [настроили на этапе 4](#configure-client), или создайте новый файл и скопируйте в него клиент.
2. В блок `func main()` добавьте скрипт для загрузки объекта в бакет:

   ```go
   objectName := "<object_name>"
   filePath := "<path>"
   contentType := "application/octet-stream"

   info, err := minioClient.FPutObject(
       context.Background(),
       "<bucket_name>",
       objectName,
       filePath,
       minio.PutObjectOptions{ContentType: contentType},
   )
   if err != nil {
       log.Fatalf("Error: %s", err)
   }

   log.Printf("File uploaded. Size: %d bytes", info.Size)
   ```

   Укажите:

   * `<object_name>` — имя, которое будет у объекта в S3;
   * `<path>` — путь до файла на локальном устройстве;
   * `<bucket_name>` — имя бакета.

   <details>
     <summary>Пример полного скрипта</summary>

     ```go
     package main

     import (
         "context"
         "log"
         "github.com/minio/minio-go/v7"
         "github.com/minio/minio-go/v7/pkg/credentials"
     )

     func main() {

         creds := credentials.NewEnvAWS()

         endpoint := "<s3_domain>"

         minioClient, err := minio.New(endpoint, &minio.Options{
             Creds:  creds,
             Secure: true,
         })
         if err != nil {
             log.Fatal(err)
         }

         objectName := "object-name.csv"
         filePath := "/path/file.csv"
         contentType := "application/octet-stream"

         info, err := minioClient.FPutObject(
             context.Background(),
             "bucketName",
             objectName,
             filePath,
             minio.PutObjectOptions{ContentType: contentType},
         )
         if err != nil {
             log.Fatalf("Error: %s", err)
         }

         log.Printf("File uploaded. Size: %d bytes", info.Size)
     }
     ```

     Здесь `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains).
     Домен зависит от [пула](/infrastructure/locations.mdx#pool), в котором находится S3.
   </details>

### Получить список объектов в бакете \{#get-object-list}

1. Откройте файл `main.go` с клиентом, который вы [настроили на этапе 4](#configure-client), или создайте новый файл и скопируйте в него клиент.
2. В блок `func main()` добавьте скрипт для получения списка объектов в бакете:

   ```go
   objectsChan := minioClient.ListObjects(context.TODO(), "<bucket_name>", minio.ListObjectsOptions{
       Recursive: true,
   })
   for object := range objectsChan {
       log.Printf("%#v\n", object)
   }
   ```

   Укажите `<bucket_name>` — имя бакета.

   <details>
     <summary>Пример полного скрипта</summary>

     ```go
     package main

     import (
         "context"
         "log" 
         "github.com/minio/minio-go/v7"
         "github.com/minio/minio-go/v7/pkg/credentials"
     )

     func main() {

         creds := credentials.NewEnvAWS()

         endpoint := "<s3_domain>"

         minioClient, err := minio.New(endpoint, &minio.Options{
             Creds:  creds,
             Secure: true,
         })
         if err != nil {
             log.Fatal(err)
         }

         objectsChan := minioClient.ListObjects(context.TODO(), "bucketName", minio.ListObjectsOptions{
             Recursive: true,
         })
         for object := range objectsChan {
             log.Printf("%#v\n", object)
         }
     }
     ```

     Здесь `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains).
     Домен зависит от [пула](/infrastructure/locations.mdx#pool), в котором находится S3.
   </details>

### Изменить статус версионирования в бакете \{#change-versioning-status}

1. Откройте файл `main.go` с клиентом, который вы [настроили на этапе 4](#configure-client), или создайте новый файл и скопируйте в него клиент.

2. В блок `func main()` добавьте скрипт для изменения статуса версионирования:

   ```go
   err = minioClient.SetBucketVersioning(
       context.Background(),
       "<bucket_name>",
       minio.BucketVersioningConfiguration{Status: "<status>"},
   )
   if err != nil {
       log.Fatalf("cannot enable versioning: %s", err)
   }
   log.Printf("Versioning enabled for bucket %s", "<bucket_name>") 
   ```

   Укажите:

   * `<bucket_name>` — имя бакета;
   * `<status>` — статус версионирования, который нужно установить в бакете. Возможные значения:

     * `Enabled` — включение версионирования;
     * `Suspended` — приостановка версионирования.

   <details>
     <summary>Пример полного скрипта</summary>

     ```go
     package main

     import (
         "context"
         "log"

         "github.com/minio/minio-go/v7"
         "github.com/minio/minio-go/v7/pkg/credentials"
     )

     func main() {

         creds := credentials.NewEnvAWS()

         endpoint := "<s3_domain>"

         minioClient, err := minio.New(endpoint, &minio.Options{
             Creds:  creds,
             Secure: true,
         })
         if err != nil {
             log.Fatal(err)
         }

         bucketName := "bucketName"

         err = minioClient.SetBucketVersioning(
             context.Background(),
             bucketName,
             minio.BucketVersioningConfiguration{Status: "Enabled"},
         )
         if err != nil {
             log.Fatalf("cannot enable versioning: %s", err)
         }

         log.Printf("Versioning enabled for bucket %s", bucketName)
     }
     ```

     Здесь `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains).
     Домен зависит от [пула](/infrastructure/locations.mdx#pool), в котором находится S3.
   </details>

3. Опционально: в блок `func main()` добавьте скрипт для проверки статуса версионирования:

   ```Go
   bucketName := "<bucket_name>"

   config, err := minioClient.GetBucketVersioning(context.Background(), bucketName)
   if err != nil {
       log.Fatalf("cannot get versioning config: %s", err)
   }

   log.Printf("Versioning status: %s", config.Status)
   ```

   Укажите `<bucket_name>` — имя бакета.

### Получить объект \{#get-object}

1. Откройте файл `main.go` с клиентом, который вы [настроили на этапе 4](#configure-client), или создайте новый файл и скопируйте в него клиент.

2. В блок `import` добавьте пакет `io`:

   ```go
   import (
       "context"
       "log"
       "io" 
       "github.com/minio/minio-go/v7"
       "github.com/minio/minio-go/v7/pkg/credentials"
   )
   ```

3. В блок `func main()` добавьте скрипт для получения объекта:

   ```go
     object, err := minioClient.GetObject(context.TODO(), "<bucket_name>", "<object_name>", minio.GetObjectOptions{})
     if err != nil {
         log.Fatalf("cannot get object: %s", err)
     }

     log.Printf("%#v\n", object)

     byteSlice, err := io.ReadAll(object)
     if err != nil {
         log.Fatalf("Error reading from reader: %s\n", err)
     }

     log.Printf("object contains: \"%s\"", byteSlice)
   ```

   Укажите:

   * `<object_name>` — имя объекта;
   * `<bucket_name>` — имя бакета.

   <details>
     <summary>Пример полного скрипта</summary>

     ```go
     package main

     import (
         "context"
         "log"
         "io" 
         "github.com/minio/minio-go/v7"
         "github.com/minio/minio-go/v7/pkg/credentials"
     )

     func main() {

         creds := credentials.NewEnvAWS()

         endpoint := "<s3_domain>"

         minioClient, err := minio.New(endpoint, &minio.Options{
             Creds:  creds,
             Secure: true,
         })
         if err != nil {
             log.Fatal(err)
         }

         object, err := minioClient.GetObject(context.TODO(), "bucketName", "objectName", minio.GetObjectOptions{})
         if err != nil {
             log.Fatalf("cannot get object: %s", err)
         }

         log.Printf("%#v\n", object)

         byteSlice, err := io.ReadAll(object)
         if err != nil {
             log.Fatalf("Error reading from reader: %s\n", err)
         }

         log.Printf("object contains: \"%s\"", byteSlice)
     }
     ```

     Здесь `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains).
     Домен зависит от [пула](/infrastructure/locations.mdx#pool), в котором находится S3.
   </details>

### Создать временную ссылку на загрузку или скачивание объекта \{#create-temporary-link-to-upload-or-download-object}

Вы можете создать ссылку в публичном или приватном бакете через подписанный URL (Presigned URL).
Подробнее о Presigned URLs в инструкции [Sharing objects with presigned URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html) документации AWS.

1. Откройте файл `main.go` с клиентом, который вы [настроили на этапе 4](#configure-client), или создайте новый файл и скопируйте в него клиент.

2. В блок `import` добавьте пакет `time`.

   ```go
   import (
       "context"
       "log"
       "time"

       "github.com/minio/minio-go/v7"
       "github.com/minio/minio-go/v7/pkg/credentials"
   )
   ```

3. В блок `func main()` добавьте скрипт для создания ссылок на загрузку и скачивание:

   ```go
   getURL, err := minioClient.PresignedGetObject(
       context.Background(),
       "<bucket_name>",
       "<object_name>",
       <expiry>,
       nil,
   )
   if err != nil {
       log.Fatalf("cannot generate presigned get url: %s", err)
   }
   log.Printf("Presigned GET URL: %s", getURL.String())

   putURL, err := minioClient.PresignedPutObject(
       context.Background(),
       "<bucket_name>",
       "<object_name>",
       <expiry>,
   )
   if err != nil {
       log.Fatalf("cannot generate presigned put url: %s", err)
   }
   log.Printf("Presigned PUT URL: %s", putURL.String())
   ```

   Укажите:

   * `<bucket_name>` — имя бакета;
   * `<object_name>` — имя объекта;
   * `<expiry>` — срок действия ссылки в формате `<amount>*<time>`, где:

     * `<amount>` — количество часов, минут или секунд, которое будет действовать ссылка;
     * `<time>` — единица времени, возможные значения: `time.Hour`, `time.Minute` или `time.Second`.

   <details>
     <summary>Пример полного скрипта</summary>

     ```go
     package main

     import (
         "context"
         "log"
         "time"

         "github.com/minio/minio-go/v7"
         "github.com/minio/minio-go/v7/pkg/credentials"
     )

     func main() {

         creds := credentials.NewEnvAWS()

         endpoint := "<s3_domain>"

         minioClient, err := minio.New(endpoint, &minio.Options{
             Creds:  creds,
             Secure: true,
         })
         if err != nil {
             log.Fatal(err)
         }

         getURL, err := minioClient.PresignedGetObject(
             context.Background(),
             "bucketName",
             "objectName",
             30*time.Hour,
             nil,
         )
         if err != nil {
             log.Fatalf("cannot generate presigned get url: %s", err)
         }
         log.Printf("Presigned GET URL: %s", getURL.String())

         putURL, err := minioClient.PresignedPutObject(
             context.Background(),
             "bucketName",
             "objectName",
             time.Hour,
         )
         if err != nil {
             log.Fatalf("cannot generate presigned put url: %s", err)
         }
         log.Printf("Presigned PUT URL: %s", putURL.String())
     }
     ```

     Здесь `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains).
     Домен зависит от [пула](/infrastructure/locations.mdx#pool), в котором находится S3.
   </details>

### Получить метаданные объекта \{#get-object-metadata}

1. Откройте файл `main.go` с клиентом, который вы [настроили на этапе 4](#configure-client), или создайте новый файл и скопируйте в него клиент.
2. В блок `func main()` добавьте скрипт для получения метаданных объекта:

   ```go
   info, err := minioClient.StatObject(
       context.Background(),
       "<bucket_name>",
       "<object_name>",
       minio.StatObjectOptions{},
   )
   if err != nil {
       log.Fatalf("cannot get object info: %s", err)
   }

   log.Printf("Key: %s", info.Key)
   log.Printf("Size: %d bytes", info.Size)
   log.Printf("ContentType: %s", info.ContentType)
   log.Printf("ETag: %s", info.ETag)
   log.Printf("LastModified: %s", info.LastModified)
   ```

   Укажите:

   * `<bucket_name>` — имя бакета;
   * `<object_name>` — имя объекта.

   <details>
     <summary>Пример полного скрипта</summary>

     ```go
     package main

     import (
         "context"
         "log"

         "github.com/minio/minio-go/v7"
         "github.com/minio/minio-go/v7/pkg/credentials"
     )

     func main() {

         creds := credentials.NewEnvAWS()

         endpoint := "<s3_domain>"

         minioClient, err := minio.New(endpoint, &minio.Options{
             Creds:  creds,
             Secure: true,
         })
         if err != nil {
             log.Fatal(err)
         }

         info, err := minioClient.StatObject(
             context.Background(),
             "bucketName",
             "objectName",
             minio.StatObjectOptions{},
         )
         if err != nil {
             log.Fatalf("cannot get object info: %s", err)
         }

         log.Printf("Key: %s", info.Key)
         log.Printf("Size: %d bytes", info.Size)
         log.Printf("ContentType: %s", info.ContentType)
         log.Printf("ETag: %s", info.ETag)
         log.Printf("LastModified: %s", info.LastModified)
     }
     ```

     Здесь `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains).
     Домен зависит от [пула](/infrastructure/locations.mdx#pool), в котором находится S3.
   </details>

### Удалить объект \{#delete-object}

1. Откройте файл `main.go` с клиентом, который вы [настроили на этапе 4](#configure-client), или создайте новый файл и скопируйте в него клиент.
2. В блок `func main()` добавьте скрипт для удаления объекта:

   ```go
   err = minioClient.RemoveObject(
       context.Background(),
       "<bucket_name>",
       "<object_name>",
       minio.RemoveObjectOptions{VersionID: "<version_id>"},
   )
   if err != nil {
       log.Fatalf("cannot remove object: %s", err)
   }
   log.Printf("Object %s removed", "<object_name>") 
   ```

   Укажите:

   * `<bucket_name>` — имя бакета;
   * `<object_name>` — имя объекта;
   * опционально: `VersionID: "<version_id>"` — опция, которая удаляет конкретную версию объекта, если в бакете включено [версионирование](/s3/buckets/versioning.mdx). Укажите `<version_id>` — [идентификатор версии](/s3/buckets/versioning.mdx#version-id).

   <details>
     <summary>Пример полного скрипта</summary>

     ```go
     package main

     import (
         "context"
         "log"

         "github.com/minio/minio-go/v7"
         "github.com/minio/minio-go/v7/pkg/credentials"
     )

     func main() {

         creds := credentials.NewEnvAWS()

         endpoint := "<s3_domain>"

         minioClient, err := minio.New(endpoint, &minio.Options{
         Creds:  creds,
         Secure: true,
         })
         if err != nil {
         log.Fatal(err)
         }

         err = minioClient.RemoveObject(
         context.Background(),
         "bucketName",
         "objectName",
         minio.RemoveObjectOptions{},
         )
         if err != nil {
         log.Fatalf("cannot remove object: %s", err)
         }

         log.Printf("Object %s removed", "objectName")
     }
     ```

     Здесь `<s3_domain>` — [домен S3 API](/s3/manage/domains.mdx#s3-api-domains).
     Домен зависит от [пула](/infrastructure/locations.mdx#pool), в котором находится S3.
   </details>

## Возможные ошибки \{#errors}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Ошибка</th>
        <th>Описание</th>
        <th>Решение</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <th>AccessDenied</th>
        <td>Доступ запрещен</td>
        <td>Проверьте ключи, политики доступа и разрешения пользователей</td>
      </tr>

      <tr>
        <th>NoSuchBucket</th>
        <td>Бакет не существует</td>
        <td>Проверьте имя бакета и целевой [пул](/infrastructure/locations.mdx#pool)</td>
      </tr>

      <tr>
        <th>NoSuchKey</th>
        <td>Объект не найден</td>
        <td>Проверьте имя объекта и путь до него в бакете</td>
      </tr>

      <tr>
        <th>BucketAlreadyExists</th>
        <td>Бакет с таким именем уже существует</td>
        <td>Укажите другое имя</td>
      </tr>

      <tr>
        <th>BucketNotEmpty</th>
        <td>Бакет не пуст</td>
        <td>Удалите все объекты и незавершенные загрузки перед удалением бакета</td>
      </tr>

      <tr>
        <th>InvalidBucketName</th>
        <td>Некорректное имя бакета</td>
        <td>Укажите имя, которое содержит только строчные буквы, цифры, точки и дефисы</td>
      </tr>

      <tr>
        <th>connection refused</th>
        <td>Некорректный [домен S3 API](/s3/manage/domains.mdx)</td>
        <td>Убедитесь, что домен соответствует [пулу](/infrastructure/locations.mdx#pool), в котором находится бакет</td>
      </tr>

      <tr>
        <th>SignatureDoesNotMatch</th>
        <td>Подпись не совпадает: неверный секретный ключ или повреждены заголовки запроса</td>
        <td>Используйте корректный секретный ключ и проверьте заголовки запроса</td>
      </tr>

      <tr>
        <th>MalformedXML</th>
        <td>Некорректный XML</td>
        <td>Проверьте синтаксис и структуру переданного XML</td>
      </tr>

      <tr>
        <th>TooManyBuckets</th>
        <td>Достигнут лимит на количество бакетов. Удалите неиспользуемые бакеты или запросите увеличение квоты</td>

        <td />
      </tr>

      <tr>
        <th>RequestTimeout</th>
        <td>Превышено время ожидания. Проверьте сетевое соединение или увеличьте таймаут запроса</td>

        <td />
      </tr>

      <tr>
        <th>MethodNotAllowed</th>
        <td>Используется неподходящий HTTP-метод для этой операции (GET/PUT/DELETE)</td>

        <td />
      </tr>
    </tbody>
  </table>
</CustomTable>

<Formbricks />
