В этом руководстве показано, как клиенты ClickHouse Cloud могут использовать ролевой доступ для аутентификации в Amazon Simple Storage Service (S3) и безопасного доступа к своим данным. Прежде чем переходить к настройке безопасного доступа к S3, важно понять, как это работает. Ниже приведен обзор того, как сервисы ClickHouse могут получать доступ к приватным S3 бакетам, принимая на себя роль в аккаунте AWS клиента.

Этот подход позволяет клиентам управлять всем доступом к своим S3 бакетам в одном месте (в политике IAM для принимаемой роли), не просматривая все политики бакетов, чтобы добавить или удалить доступ. В разделе ниже вы узнаете, как это настроить.
Получение ARN роли IAM вашего сервиса ClickHouse
-
Войдите в свой аккаунт ClickHouse Cloud.
-
Выберите сервис ClickHouse, для которого хотите создать интеграцию.
-
Выберите вкладку Settings.
-
Прокрутите страницу вниз до раздела Network security information в нижней части страницы.
-
Скопируйте значение Service role ID (IAM) для сервиса, как показано ниже.

Настройка IAM Assume Role
IAM Assume Role можно настроить одним из двух способов:
Развертывание с помощью стека CloudFormation
-
Войдите в свою учетную запись AWS в браузере под пользователем IAM, у которого есть права на создание роли IAM и управление ею.
-
Перейдите по следующему URL CloudFormation, чтобы заполнить параметры стека CloudFormation.
-
Введите (или вставьте) Service role ID (IAM) для вашего сервиса, который вы получили ранее, в поле "ClickHouse Instance Roles" ID сервисной роли можно вставить в точности так, как он отображается в консоли Cloud.
-
Введите имя вашего бакета в поле "Bucket Names". Если URL вашего бакета —
https://ch-docs-s3-bucket.s3.eu-central-1.amazonaws.com/clickhouseS3/, то имя бакета —ch-docs-s3-bucket.
- Настройте стек CloudFormation. Ниже приведена дополнительная информация об этих параметрах.
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
| RoleName | ClickHouseAccess-001 | Имя новой роли, которую ClickHouse Cloud будет использовать для доступа к вашему S3 бакету. |
| Role Session Name | * | Role Session Name можно использовать как общий секрет для дополнительной защиты вашего бакета. |
| ClickHouse Instance Roles | Список ролей IAM сервиса ClickHouse, разделенных запятыми, которые могут использовать эту защищенную интеграцию с S3. | |
| Bucket Access | Read | Задает уровень доступа для указанных бакетов. |
| Bucket Names | Список имен бакетов, разделенных запятыми, к которым эта роль будет иметь доступ. Примечание: используйте имя бакета, а не полный ARN бакета. |
-
Установите флажок I acknowledge that AWS CloudFormation might create IAM resources with custom names.
-
Нажмите кнопку Create stack в правом нижнем углу
-
Убедитесь, что создание стека CloudFormation завершилось без ошибок.
-
Выберите только что созданный Stack, затем откройте вкладку Outputs этого стека CloudFormation
-
Скопируйте значение RoleArn для этой интеграции — оно потребуется для доступа к вашему S3 бакету.

Создайте роль IAM вручную
-
Войдите в свой аккаунт AWS в браузере под пользователем IAM, у которого есть права на создание и управление ролью IAM.
-
Перейдите в консоль сервиса IAM
-
Создайте новую роль IAM со следующими политиками IAM и доверия. Замените
{ClickHouse_IAM_ARN}на ARN роли IAM, относящейся к вашему экземпляру ClickHouse.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "{ClickHouse_IAM_ARN}"
},
"Action": "sts:AssumeRole"
}
]
}Политика IAM
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::{BUCKET_NAME}"
],
"Effect": "Allow"
},
{
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::{BUCKET_NAME}/*"
],
"Effect": "Allow"
}
]
}- После создания скопируйте новый ARN роли IAM — он понадобится для доступа к вашему S3 бакету.
Получите доступ к S3 бакету с ролью ClickHouseAccess
ClickHouse Cloud позволяет указывать extra_credentials в табличной функции S3.
Ниже приведён пример выполнения запроса с использованием только что созданной роли, скопированной выше.
DESCRIBE TABLE s3('https://s3.amazonaws.com/BUCKETNAME/BUCKETOBJECT.csv','CSVWithNames',extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001'))Ниже приведён пример запроса, в котором role_session_name используется в качестве общего секрета для запроса данных из бакета.
Если role_session_name указан неверно, эта операция завершится ошибкой.
DESCRIBE TABLE s3('https://s3.amazonaws.com/BUCKETNAME/BUCKETOBJECT.csv','CSVWithNames',extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001', role_session_name = 'secret-role-name'))Расширенный контроль действий
Для более строгого управления доступом можно ограничить политику бакета так, чтобы она принимала только запросы, поступающие через конечные точки VPC ClickHouse Cloud, с помощью условия aws:SourceVpce. Чтобы получить конечные точки VPC для вашего региона ClickHouse Cloud, откройте терминал и выполните:
# Replace <your-region> with your ClickHouse Cloud region
curl -s https://api.clickhouse.cloud/static-ips.json | jq -r '.aws[] | select(.region == "<your-region>") | .s3_endpoints[]'Затем добавьте в политику IAM правило запрета, используя полученные конечные точки:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:List*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::{BUCKET_NAME}",
"arn:aws:s3:::{BUCKET_NAME}/*"
]
},
{
"Sid": "VisualEditor3",
"Effect": "Deny",
"Action": [
"s3:GetObject"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": [
"{ClickHouse VPC ID from your S3 region}",
"{ClickHouse VPC ID from your S3 region}",
"{ClickHouse VPC ID from your S3 region}"
]
}
}
}
]
}Подробнее о том, как получить доступ к конечным точкам сервисов ClickHouse Cloud, см. в разделе IP-адреса Cloud.