> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8c05c8a2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Этот движок обеспечивает интеграцию с экосистемой Amazon S3. Аналогичен движку HDFS, но предоставляет возможности, специфичные для S3.

# Движок таблицы S3

Этот движок обеспечивает интеграцию с экосистемой [Amazon S3](https://aws.amazon.com/s3/). Он аналогичен движку [HDFS](/ru/reference/engines/table-engines/integrations/hdfs), но предоставляет возможности, специфичные для S3.

<div id="example">
  ## Пример
</div>

```sql theme={null}
CREATE TABLE s3_engine_table (name String, value UInt32)
    ENGINE=S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/test-data.csv.gz', 'CSV', 'gzip')
    SETTINGS input_format_with_names_use_header = 0;

INSERT INTO s3_engine_table VALUES ('one', 1), ('two', 2), ('three', 3);

SELECT * FROM s3_engine_table LIMIT 2;
```

```text theme={null}
┌─name─┬─value─┐
│ one  │     1 │
│ two  │     2 │
└──────┴───────┘
```

<div id="creating-a-table">
  ## Создайте таблицу
</div>

```sql theme={null}
CREATE TABLE s3_engine_table (name String, value UInt32)
    ENGINE = S3(path [, NOSIGN | aws_access_key_id, aws_secret_access_key,] format, [compression], [partition_strategy], [partition_columns_in_data_file], [extra_credentials])
    [PARTITION BY expr]
    [SETTINGS ...]
```

<div id="parameters">
  ### Параметры движка
</div>

* `path` — URL бакета с путём к файлу. В режиме `readonly` поддерживаются следующие подстановочные шаблоны: `*`, `**`, `?`, `{abc,def}` и `{N..M}`, где `N`, `M` — числа, а `'abc'`, `'def'` — строки. Подробнее см. [ниже](#wildcards-in-path).
* `NOSIGN` - Если это ключевое слово указано вместо учётных данных, запросы не будут подписываться.
* `format` — [Формат](/ru/reference/formats/index#formats-overview) файла.
* `aws_access_key_id`, `aws_secret_access_key` - Долговременные учётные данные пользователя аккаунта [AWS](https://aws.amazon.com/). Их можно использовать для аутентификации запросов. Параметр необязателен. Если учётные данные не указаны, они берутся из файла конфигурации. Подробнее см. [Использование S3 для хранения данных](/ru/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-s3).
* `compression` — Тип сжатия. Поддерживаемые значения: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. Параметр необязателен. По умолчанию тип сжатия определяется автоматически по расширению файла.
* `partition_strategy` – Варианты: `WILDCARD` или `HIVE`. Для `WILDCARD` в пути должен присутствовать `{_partition_id}`, который заменяется ключом партиционирования. `HIVE` не поддерживает подстановочные шаблоны, предполагает, что путь указывает на корень таблицы, и генерирует каталоги партиций в стиле Hive, где в качестве имён файлов используются Snowflake ID, а расширением служит формат файла. По умолчанию используется настройка `file_like_engine_default_partition_strategy` (`WILDCARD` при настройках `compatibility` старше `26.6`, в противном случае `HIVE`).
* `partition_columns_in_data_file` - Используется только со стратегией партиционирования `HIVE`. Указывает, должен ли ClickHouse ожидать, что столбцы партиции будут записаны в файл данных. По умолчанию — `false`.
* `storage_class_name` - Варианты: `STANDARD` или `INTELLIGENT_TIERING`; позволяет указать [AWS S3 Intelligent Tiering](https://aws.amazon.com/s3/storage-classes/intelligent-tiering/).
* `extra_credentials` - Необязательный параметр. Используется для передачи `role_arn` для ролевого доступа в ClickHouse Cloud. Инструкции по настройке см. в [Secure S3](/ru/products/cloud/guides/data-sources/accessing-s3-data-securely).

<div id="data-cache">
  ### Кэш данных
</div>

Движок таблицы `S3` поддерживает кэширование данных на локальном диске.
Параметры конфигурации и использование файлового кэша описаны в этом [разделе](/ru/concepts/features/configuration/server-config/storing-data#using-local-cache).
Кэширование выполняется на основе path и ETag объекта хранилища, поэтому ClickHouse не будет читать устаревшую версию кэша.

Чтобы включить кэширование, используйте настройки `filesystem_cache_name = '<name>'` и `enable_filesystem_cache = 1`.

```sql theme={null}
SELECT *
FROM s3('http://minio:10000/clickhouse//test_3.csv', 'minioadmin', 'minioadminpassword', 'CSV')
SETTINGS filesystem_cache_name = 'cache_for_s3', enable_filesystem_cache = 1;
```

Есть два способа задать кэш в конфигурационном файле.

1. добавьте следующий раздел в конфигурационный файл ClickHouse:

```xml theme={null}
<clickhouse>
    <filesystem_caches>
        <cache_for_s3>
            <path>путь к каталогу кэша</path>
            <max_size>10Gi</max_size>
        </cache_for_s3>
    </filesystem_caches>
</clickhouse>
```

2. повторно использовать конфигурацию кэша (а значит, и хранилище кэша) из раздела `storage_configuration` в ClickHouse, [описанного здесь](/ru/concepts/features/configuration/server-config/storing-data#using-local-cache)

<div id="partition-by">
  ### PARTITION BY
</div>

`PARTITION BY` — необязателен. В большинстве случаев ключ партиционирования не нужен, а если он всё же нужен, то, как правило, достаточно партиционирования по месяцам. Партиционирование не ускоряет запросы (в отличие от выражения ORDER BY). Никогда не используйте слишком мелкое партиционирование. Не разбивайте данные на партиции по идентификаторам или именам клиентов (вместо этого сделайте идентификатор или имя клиента первым столбцом в выражении ORDER BY).

Для партиционирования по месяцам используйте выражение `toYYYYMM(date_column)`, где `date_column` — столбец с датой типа [Date](/ru/reference/data-types/date). Имена партиций в этом случае имеют формат `"YYYYMM"`.

<div id="partition-strategy">
  #### Стратегия партиционирования
</div>

`WILDCARD`: заменяет подстановочный символ `{_partition_id}` в пути к файлу на фактический ключ партиционирования. Чтение не поддерживается. По умолчанию выбирается только при значении настройки `compatibility` ниже `26.6`; в противном случае по умолчанию используется `HIVE` (см. настройку `file_like_engine_default_partition_strategy`).

`HIVE` реализует секционирование в стиле Hive для чтения и записи. Для чтения используется рекурсивный glob-шаблон; это эквивалентно `SELECT * FROM s3('table_root/**.parquet')`.
При записи файлы создаются в следующем формате: `<prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>`.

Примечание: при использовании стратегии партиционирования `HIVE` настройка `use_hive_partitioning` не имеет эффекта.

Пример стратегии партиционирования `HIVE`:

```sql theme={null}
arthur :) CREATE TABLE t_03363_parquet (year UInt16, country String, counter UInt8)
ENGINE = S3(s3_conn, filename = 't_03363_parquet', format = Parquet, partition_strategy='hive')
PARTITION BY (year, country);

arthur :) INSERT INTO t_03363_parquet VALUES
    (2022, 'USA', 1),
    (2022, 'Canada', 2),
    (2023, 'USA', 3),
    (2023, 'Mexico', 4),
    (2024, 'France', 5),
    (2024, 'Germany', 6),
    (2024, 'Germany', 7),
    (1999, 'Brazil', 8),
    (2100, 'Japan', 9),
    (2024, 'CN', 10),
    (2025, '', 11);

arthur :) select _path, * from t_03363_parquet;

    ┌─_path──────────────────────────────────────────────────────────────────────┬─year─┬─country─┬─counter─┐
 1. │ test/t_03363_parquet/year=2100/country=Japan/7329604473272971264.parquet   │ 2100 │ Japan   │       9 │
 2. │ test/t_03363_parquet/year=2024/country=France/7329604473323302912.parquet  │ 2024 │ France  │       5 │
 3. │ test/t_03363_parquet/year=2022/country=Canada/7329604473314914304.parquet  │ 2022 │ Canada  │       2 │
 4. │ test/t_03363_parquet/year=1999/country=Brazil/7329604473289748480.parquet  │ 1999 │ Brazil  │       8 │
 5. │ test/t_03363_parquet/year=2023/country=Mexico/7329604473293942784.parquet  │ 2023 │ Mexico  │       4 │
 6. │ test/t_03363_parquet/year=2023/country=USA/7329604473319108608.parquet     │ 2023 │ USA     │       3 │
 7. │ test/t_03363_parquet/year=2025/country=/7329604473327497216.parquet        │ 2025 │         │      11 │
 8. │ test/t_03363_parquet/year=2024/country=CN/7329604473310720000.parquet      │ 2024 │ CN      │      10 │
 9. │ test/t_03363_parquet/year=2022/country=USA/7329604473298137088.parquet     │ 2022 │ USA     │       1 │
10. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet │ 2024 │ Germany │       6 │
11. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet │ 2024 │ Germany │       7 │
    └────────────────────────────────────────────────────────────────────────────┴──────┴─────────┴─────────┘
```

<div id="querying-partitioned-data">
  ### Запросы к данным, разбитым на партиции
</div>

В этом примере используется [рецепт Docker Compose](https://github.com/ClickHouse/examples/tree/5fdc6ff72f4e5137e23ea075c88d3f44b0202490/docker-compose-recipes/recipes/ch-and-minio-S3), который интегрирует ClickHouse и MinIO. Вы сможете воспроизвести те же запросы с S3, заменив значения конечной точки и аутентификации.

Обратите внимание, что конечная точка S3 в конфигурации `ENGINE` использует токен параметра `{_partition_id}` как часть объекта S3 (имени файла), а в запросах SELECT используются получившиеся имена объектов (например, `test_3.csv`).

<Note>
  Как показано в примере, выполнение запросов к S3-таблицам с разбиением на партиции
  в настоящее время напрямую не поддерживается, но этого можно добиться, запрашивая отдельные партиции
  с помощью табличной функции S3.

  Основной сценарий использования
  записи данных с разбиением на партиции в S3 — перенос этих данных в другую
  систему ClickHouse (например, при переходе с локальных систем на ClickHouse
  Cloud). Поскольку датасеты ClickHouse часто бывают очень большими, а надёжность
  сети не всегда идеальна, имеет смысл передавать датасеты
  по частям — отсюда и запись с разбиением на партиции.
</Note>

<div id="create-the-table">
  #### Создание таблицы
</div>

```sql highlight={8} theme={null}
CREATE TABLE p
(
    `column1` UInt32,
    `column2` UInt32,
    `column3` UInt32
)
ENGINE = S3(
           'http://minio:10000/clickhouse//test_{_partition_id}.csv',
           'minioadmin',
           'minioadminpassword',
           'CSV')
PARTITION BY column3
```

<div id="insert-data">
  #### Вставка данных
</div>

```sql theme={null}
INSERT INTO p VALUES (1, 2, 3), (3, 2, 1), (78, 43, 45)
```

<div id="select-from-partition-3">
  #### Выборка из партиции 3
</div>

<Tip>
  В этом запросе используется табличная функция S3
</Tip>

```sql theme={null}
SELECT *
FROM s3('http://minio:10000/clickhouse//test_3.csv', 'minioadmin', 'minioadminpassword', 'CSV')
```

```response theme={null}
┌─c1─┬─c2─┬─c3─┐
│  1 │  2 │  3 │
└────┴────┴────┘
```

<div id="select-from-partition-1">
  #### Выборка из партиции 1
</div>

```sql theme={null}
SELECT *
FROM s3('http://minio:10000/clickhouse//test_1.csv', 'minioadmin', 'minioadminpassword', 'CSV')
```

```response theme={null}
┌─c1─┬─c2─┬─c3─┐
│  3 │  2 │  1 │
└────┴────┴────┘
```

<div id="select-from-partition-45">
  #### Выборка данных из партиции 45
</div>

```sql theme={null}
SELECT *
FROM s3('http://minio:10000/clickhouse//test_45.csv', 'minioadmin', 'minioadminpassword', 'CSV')
```

```response theme={null}
┌─c1─┬─c2─┬─c3─┐
│ 78 │ 43 │ 45 │
└────┴────┴────┘
```

<div id="limitation">
  #### Ограничение
</div>

Возможно, вы попробуете выполнить `Select * from p`, но, как отмечалось выше, этот запрос завершится ошибкой; используйте запрос выше.

```sql theme={null}
SELECT * FROM p
```

```response theme={null}
Received exception from server (version 23.4.1):
Code: 48. DB::Exception: Received from localhost:9000. DB::Exception: Reading from a partitioned S3 storage is not implemented yet. (NOT_IMPLEMENTED)
```

<div id="inserting-data">
  ## Вставка данных
</div>

Обратите внимание: строки можно вставлять только в новые файлы. Операции разделения файлов и циклы слияния не поддерживаются. После записи файла все последующие вставки завершатся ошибкой. Чтобы этого избежать, можно использовать настройки `s3_truncate_on_insert` и `s3_create_new_file_on_insert`. Подробнее см. [здесь](/ru/integrations/connectors/data-ingestion/AWS/integrating-s3-with-clickhouse#inserting-data).

<div id="virtual-columns">
  ## Виртуальные столбцы
</div>

* `_path` — Путь к файлу. Тип: `LowCardinality(String)`.
* `_file` — Имя файла. Тип: `LowCardinality(String)`.
* `_size` — Размер файла в байтах. Тип: `Nullable(UInt64)`. Если размер неизвестен, значение равно `NULL`.
* `_time` — Время последнего изменения файла. Тип: `Nullable(DateTime)`. Если время неизвестно, значение равно `NULL`.
* `_etag` — ETag файла. Тип: `LowCardinality(String)`. Если ETag неизвестен, значение равно `NULL`.
* `_tags` — Метки файла. Тип: `Map(String, String)`. Если меток нет, значение — пустой `Map` `{}`.

Подробнее о виртуальных столбцах см. [здесь](/ru/reference/engines/table-engines/index#table_engines-virtual_columns).

<div id="implementation-details">
  ## Подробности реализации
</div>

* Чтение и запись могут выполняться параллельно
* Не поддерживаются:
  * операции `ALTER` и `SELECT...SAMPLE`.
  * индексы.
  * возможна [репликация с нулевым копированием](/ru/concepts/features/configuration/server-config/storing-data#zero-copy), но она не поддерживается.

<Info>
  **Репликация с нулевым копированием не готова для продакшна**

  В ClickHouse версии 22.8 и выше репликация с нулевым копированием по умолчанию отключена. Эта возможность не рекомендуется для использования в продакшне.
</Info>

<div id="wildcards-in-path">
  ## Подстановочные шаблоны в path
</div>

Аргумент `path` может задавать несколько файлов с помощью bash-подобных подстановочных шаблонов. Чтобы файл был обработан, он должен существовать и соответствовать всему шаблону пути. Список файлов определяется во время выполнения `SELECT` (а не в момент `CREATE`).

* `*` — Подставляет любое количество любых символов, кроме `/`, включая пустую строку.
* `**` — Подставляет любое количество любых символов, включая `/`, включая пустую строку.
* `?` — Подставляет любой отдельный символ.
* `{some_string,another_string,yet_another_one}` — Подставляет любую из строк `'some_string', 'another_string', 'yet_another_one'`.
* `{N..M}` — Подставляет любое число в диапазоне от N до M включительно. N и M могут содержать ведущие нули, например `000..078`.

Конструкции с `{}` аналогичны табличной функции [remote](/ru/reference/functions/table-functions/remote).

<Note>
  Если список файлов содержит числовые диапазоны с ведущими нулями, используйте конструкцию с фигурными скобками отдельно для каждой цифры или `?`.
</Note>

**Пример с подстановочными шаблонами 1**

Создайте таблицу с файлами с именами `file-000.csv`, `file-001.csv`, ... , `file-999.csv`:

```sql theme={null}
CREATE TABLE big_table (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/my_folder/file-{000..999}.csv', 'CSV');
```

**Пример с подстановочными шаблонами 2**

Предположим, у нас есть несколько файлов в формате CSV со следующими URI в S3:

* '[https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some\&#95;folder/some\&#95;file\&#95;1.csv\&#39](https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some\&#95;folder/some\&#95;file\&#95;1.csv\&#39);
* '[https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some\&#95;folder/some\&#95;file\&#95;2.csv\&#39](https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some\&#95;folder/some\&#95;file\&#95;2.csv\&#39);
* '[https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some\&#95;folder/some\&#95;file\&#95;3.csv\&#39](https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some\&#95;folder/some\&#95;file\&#95;3.csv\&#39);
* '[https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another\&#95;folder/some\&#95;file\&#95;1.csv\&#39](https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another\&#95;folder/some\&#95;file\&#95;1.csv\&#39);
* '[https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another\&#95;folder/some\&#95;file\&#95;2.csv\&#39](https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another\&#95;folder/some\&#95;file\&#95;2.csv\&#39);
* '[https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another\&#95;folder/some\&#95;file\&#95;3.csv\&#39](https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another\&#95;folder/some\&#95;file\&#95;3.csv\&#39);

Есть несколько способов создать таблицу из всех шести файлов:

1. Укажите диапазон суффиксов файлов:

```sql theme={null}
CREATE TABLE table_with_range (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/some_file_{1..3}', 'CSV');
```

2. Возьмите все файлы с префиксом `some_file_` (в обеих папках не должно быть других файлов с таким префиксом):

```sql theme={null}
CREATE TABLE table_with_question_mark (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/some_file_?', 'CSV');
```

3. Возьмите все файлы из обеих папок (все файлы должны соответствовать формату и схеме, указанным в запросе):

```sql theme={null}
CREATE TABLE table_with_asterisk (name String, value UInt32)
    ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/*', 'CSV');
```

<div id="storage-settings">
  ## Настройки хранилища
</div>

* [s3\_truncate\_on\_insert](/ru/reference/settings/session-settings#s3_truncate_on_insert) - позволяет обрезать файл перед вставкой данных. По умолчанию отключена.
* [s3\_create\_new\_file\_on\_insert](/ru/reference/settings/session-settings#s3_create_new_file_on_insert) - позволяет создавать новый файл при каждой вставке, если у формата есть суффикс. По умолчанию отключена.
* [s3\_skip\_empty\_files](/ru/reference/settings/session-settings#s3_skip_empty_files) - позволяет пропускать пустые файлы при чтении. По умолчанию включена.

<div id="settings">
  ## Настройки, связанные с S3
</div>

Следующие настройки можно задать перед выполнением запроса или указать в конфигурационном файле.

* `s3_max_single_part_upload_size` — Максимальный размер объекта для загрузки в S3 с помощью singlepart upload. Значение по умолчанию — `32Mb`.
* `s3_min_upload_part_size` — Минимальный размер части, загружаемой при multipart-загрузке через [S3 Multipart upload](https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html). Значение по умолчанию — `16Mb`.
* `s3_max_redirects` — Максимально допустимое количество переходов при перенаправлениях S3. Значение по умолчанию — `10`.
* `s3_single_read_retries` — Максимальное количество попыток при одном чтении. Значение по умолчанию — `4`.
* `s3_max_put_rps` — Максимальная частота PUT-запросов в секунду до применения троттлинга. Значение по умолчанию — `0` (без ограничений).
* `s3_max_put_burst` — Максимальное количество запросов, которые можно отправить одновременно до достижения лимита запросов в секунду. По умолчанию (значение `0`) равно `s3_max_put_rps`.
* `s3_max_get_rps` — Максимальная частота GET-запросов в секунду до применения троттлинга. Значение по умолчанию — `0` (без ограничений).
* `s3_max_get_burst` — Максимальное количество запросов, которые можно отправить одновременно до достижения лимита запросов в секунду. По умолчанию (значение `0`) равно `s3_max_get_rps`.
* `s3_upload_part_size_multiply_factor` - Умножает `s3_min_upload_part_size` на этот коэффициент каждый раз, когда в рамках одной записи в S3 было загружено `s3_multiply_parts_count_threshold` частей. Значение по умолчанию — `2`.
* `s3_upload_part_size_multiply_parts_count_threshold` - Каждый раз, когда в S3 загружено такое количество частей, `s3_min_upload_part_size` умножается на `s3_upload_part_size_multiply_factor`. Значение по умолчанию — `500`.
* `s3_max_inflight_parts_for_one_file` - Ограничивает количество PUT-запросов, которые могут выполняться параллельно для одного объекта. Это число следует ограничивать. Значение `0` означает отсутствие ограничений. Значение по умолчанию — `20`. Для каждой части в процессе загрузки выделяется буфер размером `s3_min_upload_part_size` для первых `s3_upload_part_size_multiply_factor` частей и большего размера, если файл достаточно велик; см. `upload_part_size_multiply_factor`. При настройках по умолчанию загрузка одного файла размером менее `8G` потребляет не более `320Mb`. Для файлов большего размера потребление выше.

Соображение безопасности: если злоумышленник может указывать произвольные URL S3, `s3_max_redirects` необходимо установить в ноль, чтобы избежать атак [SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery); либо, в качестве альтернативы, в конфигурации сервера необходимо указать `remote_host_filter`.

<div id="endpoint-settings">
  ## Настройки для конечных точек
</div>

Следующие настройки можно указать в файле конфигурации для заданной конечной точки (которая будет сопоставляться по точному префиксу URL):

* `endpoint` — Задает префикс конечной точки. Обязательно.
* `access_key_id` и `secret_access_key` — Задают учетные данные, которые будут использоваться для данной конечной точки. Необязательно.
* `use_environment_credentials` — Если установлено значение `true`, клиент S3 попытается получить учетные данные из переменных окружения и метаданных [Amazon EC2](https://en.wikipedia.org/wiki/Amazon_Elastic_Compute_Cloud) для данной конечной точки. Необязательно, значение по умолчанию — `false`.
* `region` — Задает имя региона S3. Необязательно.
* `use_insecure_imds_request` — Если установлено значение `true`, клиент S3 будет использовать небезопасный запрос IMDS при получении учетных данных из метаданных Amazon EC2. Необязательно, значение по умолчанию — `false`.
* `expiration_window_seconds` — Льготный период для проверки того, не истек ли срок действия учетных данных. Необязательно, значение по умолчанию — `120`.
* `no_sign_request` - Игнорирует все учетные данные, чтобы запросы не подписывались. Полезно для доступа к публичным бакетам.
* `header` —  Добавляет указанный HTTP-заголовок в запрос к данной конечной точке. Необязательно, можно указывать несколько раз.
* `access_header` - Добавляет указанный HTTP-заголовок в запрос к данной конечной точке в случаях, когда отсутствуют другие учетные данные из другого источника.
* `server_side_encryption_customer_key_base64` — Если указано, будут установлены необходимые заголовки для доступа к объектам S3 с шифрованием SSE-C. Необязательно.
* `server_side_encryption_kms_key_id` - Если указано, будут установлены необходимые заголовки для доступа к объектам S3 с [шифрованием SSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html). Если указана пустая строка, будет использоваться ключ S3 под управлением AWS. Необязательно.
* `server_side_encryption_kms_encryption_context` - Если указано вместе с `server_side_encryption_kms_key_id`, будет установлен указанный заголовок контекста шифрования для SSE-KMS. Необязательно.
* `server_side_encryption_kms_bucket_key_enabled` - Если указано вместе с `server_side_encryption_kms_key_id`, будет установлен заголовок для включения ключей S3 бакета для SSE-KMS. Необязательно, может быть `true` или `false`, по умолчанию не задано (соответствует настройке на уровне бакета).
* `max_single_read_retries` — Максимальное количество попыток в ходе одного чтения. Значение по умолчанию — `4`. Необязательно.
* `max_put_rps`, `max_put_burst`, `max_get_rps` и `max_get_burst` - Настройки ограничения скорости (см. описание выше), используемые для конкретной конечной точки вместо настроек на уровне запроса. Необязательно.

**Пример:**

```xml theme={null}
<s3>
    <endpoint-name>
        <endpoint>https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/</endpoint>
        <!-- <access_key_id>ACCESS_KEY_ID</access_key_id> -->
        <!-- <secret_access_key>SECRET_ACCESS_KEY</secret_access_key> -->
        <!-- <region>us-west-1</region> -->
        <!-- <use_environment_credentials>false</use_environment_credentials> -->
        <!-- <use_insecure_imds_request>false</use_insecure_imds_request> -->
        <!-- <expiration_window_seconds>120</expiration_window_seconds> -->
        <!-- <no_sign_request>false</no_sign_request> -->
        <!-- <header>Authorization: Bearer SOME-TOKEN</header> -->
        <!-- <server_side_encryption_customer_key_base64>BASE64-ENCODED-KEY</server_side_encryption_customer_key_base64> -->
        <!-- <server_side_encryption_kms_key_id>KMS_KEY_ID</server_side_encryption_kms_key_id> -->
        <!-- <server_side_encryption_kms_encryption_context>KMS_ENCRYPTION_CONTEXT</server_side_encryption_kms_encryption_context> -->
        <!-- <server_side_encryption_kms_bucket_key_enabled>true</server_side_encryption_kms_bucket_key_enabled> -->
        <!-- <max_single_read_retries>4</max_single_read_retries> -->
    </endpoint-name>
</s3>
```

<div id="working-with-archives">
  ## Работа с архивами
</div>

Предположим, что у нас есть несколько архивных файлов со следующими URI в S3:

* '[https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-10.csv.zip\&#39](https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-10.csv.zip\&#39);
* '[https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-11.csv.zip\&#39](https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-11.csv.zip\&#39);
* '[https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip\&#39](https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip\&#39);

Извлечь данные из этих архивов можно с помощью ::. Глоб-шаблоны можно использовать как в части URL, так и в части после :: (она отвечает за имя файла внутри архива).

```sql theme={null}
SELECT *
FROM s3(
   'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-1{0..2}.csv.zip :: *.csv'
);
```

<Note>
  ClickHouse поддерживает три формата архивов:
  ZIP
  TAR
  7Z
  Хотя к архивам ZIP и TAR можно обращаться из любого поддерживаемого места хранения, архивы 7Z можно читать только из локальной файловой системы, на которой установлен ClickHouse.
</Note>

<div id="accessing-public-buckets">
  ## Доступ к публичным бакетам
</div>

ClickHouse пытается получать учетные данные из множества различных источников.
Иногда это может вызывать проблемы при доступе к некоторым публичным бакетам, из-за чего клиент возвращает ошибку `403`.
Этой проблемы можно избежать, используя ключевое слово `NOSIGN`, которое заставляет клиент игнорировать все учетные данные и не подписывать запросы.

```sql theme={null}
CREATE TABLE big_table (name String, value UInt32)
    ENGINE = S3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv', NOSIGN, 'CSVWithNames');
```

<div id="optimizing-performance">
  ## Оптимизация производительности
</div>

Подробнее об оптимизации производительности функции s3 см. в [нашем подробном руководстве](/ru/integrations/connectors/data-ingestion/AWS/performance).

<div id="role-based-access">
  ## Ролевой доступ
</div>

В ClickHouse Cloud для аутентификации в S3 можно использовать ролевой доступ вместо ключей доступа. Шаги по настройке см. в разделе [Secure S3](/ru/products/cloud/guides/data-sources/accessing-s3-data-securely).

После настройки `roleARN` можно передать через параметр `extra_credentials`:

```sql theme={null}
CREATE TABLE my_s3_table(name String, value UInt32)
ENGINE = S3('https://my-bucket.s3.amazonaws.com/data/*.csv', extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001'), 'CSV')
```

Необязательный `external_id` также можно передать вместе с `role_arn`. Он передаётся как параметр `ExternalId` в вызове AWS STS `AssumeRole`, что позволяет политике доверия роли требовать общий секрет, чтобы снизить риск [проблемы confused deputy](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html):

```sql theme={null}
CREATE TABLE my_s3_table(name String, value UInt32)
ENGINE = S3('https://my-bucket.s3.amazonaws.com/data/*.csv', extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001', external_id = 'my-external-id'), 'CSV')
```

<div id="see-also">
  ## См. также
</div>

* [табличная функция S3](/ru/reference/functions/table-functions/s3)
* [Интеграция S3 с ClickHouse](/ru/integrations/connectors/data-ingestion/AWS/integrating-s3-with-clickhouse)
