# Настройка Snowflake PrivateLink

Платформа dbt | Enterprise+

Доступно на определённых уровнях Enterprise

Эта функция доступна на следующих уровнях dbt Enterprise:

* Enterprise+
* Virtual Private

Чтобы узнать больше об этих тарифах, свяжитесь с нами по адресу <sales@getdbt.com>.

Следующие шаги помогут настроить размещенную в AWS конечную точку Snowflake PrivateLink в мультитенантной среде dbt.

Конечные точки частного подключения не поддерживают соединения между разными облачными провайдерами (AWS, Azure и GCP). Чтобы частное подключение работало, и dbt, и сервер (например, Snowflake) должны быть размещены у одного облачного провайдера. Например, dbt, размещённый в AWS, не может подключаться к сервисам, размещённым в Azure, а dbt, размещённый в Azure, не может подключаться к сервисам, размещённым в GCP.

Snowflake OAuth с PrivateLink

Пользователям, подключающимся к Snowflake с помощью [Snowflake OAuth](https://docs.getdbt.tech/docs/platform/manage-access/set-up-snowflake-oauth.md) через соединение AWS PrivateLink из dbt, также потребуется доступ к конечной точке PrivateLink с локальной рабочей станции. По возможности используйте [Snowflake External OAuth](https://docs.getdbt.tech/docs/platform/manage-access/snowflake-external-oauth.md), чтобы обойти это ограничение.

Из документации [Snowflake](https://docs.snowflake.com/en/user-guide/admin-security-fed-auth-overview#label-sso-private-connectivity):

> В настоящее время для каждой учетной записи Snowflake SSO может работать только с одним URL учетной записи одновременно: либо с публичным URL учетной записи, либо с URL, связанным с сервисом приватной сетевой связности.

## Настройка AWS PrivateLink

В этом разделе описана настройка размещенной в AWS конечной точки Snowflake PrivateLink в dbt platform. Настройку можно выполнить двумя способами:

* [Самостоятельная настройка частных конечных точек](#self-serve-private-endpoints): самостоятельная настройка конечных точек Snowflake PrivateLink непосредственно в пользовательском интерфейсе dbt platform. В настоящее время доступна в бета-версии.
* [Настройка с помощью службы поддержки](#support-led-setup): для настройки конечных точек Snowflake PrivateLink необходимо обратиться в службу поддержки dbt. Этот способ не предусматривает самостоятельную настройку конечных точек Snowflake PrivateLink.

### Самостоятельная настройка частных конечных точек [Бета-версия](https://docs.getdbt.tech/docs/dbt-versions/product-lifecycles "Подробнее о статусе или тарифе")

*Самостоятельная настройка частных конечных точек для Snowflake в AWS в настоящее время находится в стадии бета-тестирования и доступна всем клиентам, соответствующим требованиям. Эта функция недоступна для Azure и GCP. Если в настройках вашей учетной записи нет раздела **Private endpoints**, воспользуйтесь [настройкой с помощью службы поддержки](#support-led-setup).*

В этом разделе описан процесс запроса новой конечной точки Snowflake PrivateLink в dbt platform.

##### Предварительные требования

* Набор разрешений [Account admin](https://docs.getdbt.tech/docs/platform/manage-access/enterprise-permissions.md?version=2.0#account-admin) или [Project creator](https://docs.getdbt.tech/docs/platform/manage-access/enterprise-permissions.md?version=2.0#project-creator) в dbt platform. Пользователи с лицензией IT также могут создавать частные конечные точки.
* [Разрешения `ACCOUNTADMIN` в Snowflake](https://docs.snowflake.com/en/user-guide/security-access-control-overview#system-defined-roles).

##### Перед началом работы

Прежде чем запрашивать частную конечную точку, добавьте учетную запись AWS компании dbt Labs в список разрешенных в Snowflake. Это однократная настройка для каждой учетной записи Snowflake, которая выполняется через обращение в службу поддержки Snowflake и может занять некоторое время — завершите ее до начала процедуры запроса.

1. Создайте обращение в службу поддержки Snowflake, чтобы разрешить доступ из учетной записи AWS dbt.

   * Snowflake предпочитает, чтобы владелец учетной записи создавал обращение самостоятельно, а не через dbt Labs. Дополнительные сведения см. в [статье базы знаний Snowflake](https://community.snowflake.com/s/article/HowtosetupPrivatelinktoSnowflakefromCloudServiceVendors).
   * Укажите идентификатор вашей учетной записи dbt, а также другую информацию, запрашиваемую в статье.
     * **Идентификатор учетной записи AWS**: `346425330055` — *Примечание: этот идентификатор учетной записи применим только к мультитенантным средам dbt в AWS. Чтобы получить идентификаторы учетных записей AWS Virtual Private/Single-Tenant, обратитесь в [службу поддержки dbt](mailto:support@getdbt.com).*

2. Прежде чем продолжить, дождитесь подтверждения от Snowflake о предоставлении доступа.

   [![Создание обращения в службу поддержки Snowflake](/img/docs/dbt-platform/snowflakeprivatelink1.png?v=2 "Создание обращения в службу поддержки Snowflake")](#)Создание обращения в службу поддержки Snowflake

#### Запрос новой частной конечной точки

После того как Snowflake подтвердит добавление учетной записи AWS компании dbt Labs в список разрешенных в Snowflake, вы сможете запросить новую частную конечную точку. Для этого выполните следующие действия:

1. В dbt platform перейдите в **Account settings → Private endpoints**.

2. В таблице **Private endpoints** просмотрите существующие конечные точки. В таблице представлены все частные конечные точки вашей учетной записи (в том числе не относящиеся к Snowflake) со следующими сведениями:

   * **Name** — имя
   * **Connection type** — тип подключения (например, Snowflake)
   * **URL**
   * **Connectivity status** — состояние подключения (например, **Success** или **Unknown**)
   * **Connections** — количество подключений dbt platform, использующих конечную точку

   Можно выполнять поиск по **Name** или **URL**. В таблице перечислены все частные конечные точки вашей учетной записи, но самостоятельное создание, редактирование и удаление в настоящее время доступны только для Snowflake в AWS.

   [![Таблица частных конечных точек с существующими конечными точками, состоянием подключения и кнопкой Request new](/img/docs/dbt-platform/private-endpoint-page.png?v=2 "Таблица частных конечных точек с существующими конечными точками, состоянием подключения и кнопкой Request new")](#)Таблица частных конечных точек с существующими конечными точками, состоянием подключения и кнопкой Request new

3. Чтобы запросить новую конечную точку, нажмите **Request new**.

4. В разделе **Provider type** убедитесь, что выбран **Snowflake**. В настоящее время другие поставщики конечных точек не поддерживаются. Если вам нужно подключиться к другому сервису, обратитесь в [службу поддержки dbt](mailto:support@getdbt.com).

5. Скопируйте SQL-команду из раздела **SQL command snippet**.

6. Перейдите в Snowflake и выполните SQL-команду, скопированную из dbt platform: `SELECT SYSTEM$GET_PRIVATELINK_CONFIG();`

7. Скопируйте результат из Snowflake и вернитесь в dbt platform, чтобы вставить его в поле **Snowflake output**. Если результат корректен, под текстовым полем появится сообщение наподобие **Output looks good**. Если возникнет ошибка, ознакомьтесь с сообщением и внесите необходимые исправления.

8. Нажмите **Submit request**.

   [![Форма запроса конечной точки с полями Provider type, SQL command snippet и Snowflake output](/img/docs/dbt-platform/private-endpoint-config.png?v=2 "Форма запроса конечной точки с полями Provider type, SQL command snippet и Snowflake output")](#)Форма запроса конечной точки с полями Provider type, SQL command snippet и Snowflake output

9. После отправки появится всплывающее окно с подтверждением (например, **Endpoint request submitted**). В этом окне можно запросить еще одну конечную точку или вернуться в **Private endpoints**, чтобы отслеживать статус запроса.

10. Перейдите на страницу **Connections** и выполните действия из раздела [Создание подключения в dbt](#create-connection-in-dbt), чтобы настроить PrivateLink. После настройки PrivateLink на странице **Connections** новая конечная точка появится в разделе **Private endpoints → Associated connections**.

Распространение изменений DNS

Если проверка подключения завершается ошибкой сразу после настройки, это ожидаемо и не означает, что что-то настроено неправильно. Распространение изменений DNS может занять несколько минут. Подождите несколько минут и повторите проверку, прежде чем обращаться в службу поддержки.

 Редактирование или удаление частной конечной точки

Если вы не видите **Edit** или **Delete endpoint**, обратитесь к менеджеру вашей учетной записи, чтобы включить возможность изменения частных конечных точек для вашей учетной записи.

**Редактирование конечной точки**

1. В таблице **Private endpoints** нажмите на конечную точку, которую хотите изменить.
2. На странице сведений о конечной точке нажмите **Edit**.
3. При необходимости измените **Name** и/или **Port**.
4. Нажмите **Save changes**.
5. В модальном окне **Save changes?** нажмите **Save changes**, чтобы применить изменения.

[![Страница сведений о частной конечной точке с кнопкой Edit](/img/docs/dbt-platform/private-endpoint-details-edit.png?v=2 "Страница сведений о частной конечной точке с кнопкой Edit")](#)Страница сведений о частной конечной точке с кнопкой Edit

**Удаление конечной точки**

Конечную точку со связанными подключениями удалить нельзя. Сначала удалите эти подключения.

1. В таблице **Private endpoints** нажмите на конечную точку, которую хотите удалить.
2. На странице сведений о конечной точке нажмите **Edit**.
3. Прокрутите страницу вниз и нажмите **Delete endpoint**.
4. В модальном окне **Delete endpoint** введите `DELETE` для подтверждения, затем нажмите **Delete endpoint**.

[![Страница сведений о частной конечной точке в режиме редактирования с кнопкой Delete endpoint](/img/docs/dbt-platform/private-endpoint-details-delete.png?v=2 "Страница сведений о частной конечной точке в режиме редактирования с кнопкой Delete endpoint")](#)Страница сведений о частной конечной точке в режиме редактирования с кнопкой Delete endpoint

#### Повторные запросы конечных точек

Если вы отправите запрос с идентификатором VPCE, совпадающим с идентификатором существующей конечной точки, dbt platform отобразит всплывающее окно **Endpoint already exists** с двумя вариантами:

* **Reuse existing interface endpoint** (по умолчанию, рекомендуется) — связывает новую частную конечную точку с уже одобренной интерфейсной конечной точкой. Используйте этот вариант, если ваша VPCE уже одобрена, чтобы избежать дублирования инфраструктуры.
* **Create new interface endpoint** — создает новую интерфейсную конечную точку с собственной сетевой политикой. Используйте этот вариант, только если вам нужна отдельная конфигурация сетевой политики.

Выберите нужный вариант и нажмите **Confirm & Submit**.

[![Всплывающее окно Endpoint already exists с вариантами создания новой интерфейсной конечной точки или повторного использования существующей](/img/docs/dbt-platform/endpoint-exists.png?v=2 "Всплывающее окно Endpoint already exists с вариантами создания новой интерфейсной конечной точки или повторного использования существующей")](#)Всплывающее окно Endpoint already exists с вариантами создания новой интерфейсной конечной точки или повторного использования существующей

#### Устранение неполадок и ошибки

Если запрос конечной точки завершается ошибкой, dbt platform отображает сведения об ошибке, которыми можно безопасно делиться за пределами организации.

Если вы видите статус ошибки без четких указаний о дальнейших действиях, соберите сведения о запросе (имя конечной точки, время создания, статус и предоставленный вами результат Snowflake) и обратитесь в [службу поддержки dbt](mailto:support@getdbt.com).

### Настройка с помощью службы поддержки

Если раздел **Private endpoints** недоступен в настройках вашей учетной записи, настройте Snowflake PrivateLink, выполнив следующие действия и отправив запрос в службу поддержки dbt.

Чтобы настроить [PrivateLink](https://aws.amazon.com/privatelink) для экземпляров Snowflake, размещенных в AWS:

1. Создайте обращение в службу поддержки Snowflake, чтобы разрешить доступ из учетной записи AWS dbt.

   * Snowflake предпочитает, чтобы владелец учетной записи создавал обращение самостоятельно, а не через dbt Labs. Дополнительные сведения см. в [статье базы знаний Snowflake](https://community.snowflake.com/s/article/HowtosetupPrivatelinktoSnowflakefromCloudServiceVendors).
   * Укажите идентификатор вашей учетной записи dbt, а также другую информацию, запрашиваемую в статье.
     * **Идентификатор учетной записи AWS**: `346425330055` — *Примечание: этот идентификатор учетной записи применим только к мультитенантным средам dbt в AWS. Чтобы получить идентификаторы учетных записей AWS Virtual Private/Single-Tenant, обратитесь в [службу поддержки dbt](mailto:support@getdbt.com).*
   * Вам необходимы [разрешения `ACCOUNTADMIN` в Snowflake](https://docs.snowflake.com/en/user-guide/security-access-control-overview#system-defined-roles).

[![Создание обращения в службу поддержки Snowflake](/img/docs/dbt-platform/snowflakeprivatelink1.png?v=2 "Создание обращения в службу поддержки Snowflake")](#)Создание обращения в службу поддержки Snowflake

2. После того как Snowflake предоставит запрошенный доступ, выполните системную функцию Snowflake [SYSTEM$GET\_PRIVATELINK\_CONFIG](https://docs.snowflake.com/en/sql-reference/functions/system_get_privatelink_config.html) и скопируйте результат.

3. Добавьте необходимую информацию в следующий шаблон и отправьте запрос в [службу поддержки dbt](mailto:support@getdbt.com):

 Шаблон письма для обращения в службу поддержки

```text
Subject: New Multi-Tenant (Azure or AWS) PrivateLink Request

- Type: Snowflake
- dbt platform account URL:
- SYSTEM$GET_PRIVATELINK_CONFIG output:
- *Use privatelink-account-url or regionless-privatelink-account-url?:
- **Create Internal Stage PrivateLink endpoint? (Y/N):
- dbt AWS multi-tenant environment (US, EMEA, AU, JP):
```

*\*По умолчанию dbt будет настроен на использование `privatelink-account-url` из предоставленного результата [SYSTEM$GET\_PRIVATELINK\_CONFIG](https://docs.snowflake.com/en/sql-reference/functions/system_get_privatelink_config.html) в качестве конечной точки PrivateLink. По запросу вместо него можно использовать `regionless-privatelink-account-url`.*

*\*\* Для использования этой функции необходимо [включить Internal Stage PrivateLink в учетной записи Snowflake](https://docs.snowflake.com/en/user-guide/private-internal-stages-aws#prerequisites)*

dbt Labs выполнит настройку приватного подключения от вашего имени. Пожалуйста, заложите 3–5 рабочих дней на завершение этого процесса. Служба поддержки свяжется с вами, когда конечная точка (endpoint) будет доступна.

## Создание подключения в dbt

После того как служба поддержки dbt завершит настройку, вы сможете создавать новые подключения с использованием PrivateLink.

1. Перейдите в **Account Settings** → **Projects** → **Create new project**.
2. В разделе **Configure your development environment step** выберите **Add new connection**.
3. Вы перейдёте на страницу **Add new connection**. Выберите **Snowflake**.
4. В разделе **Settings** выберите **PrivateLink Endpoint**.
5. Выберите частную конечную точку из раскрывающегося списка (поле имени хоста/учётной записи заполнится автоматически).
6. Настройте остальные параметры платформы данных.
7. Проверьте подключение и сохраните его.

## Настройка PrivateLink для внутренней области хранения в dbt

Если конечная точка Internal Stage PrivateLink уже создана, необходимо настроить среды dbt на использование этой конечной точки вместо конечной точки по умолчанию, заданной для учетной записи в Snowflake.

1. Получите DNS-имя конечной точки Internal Stage PrivateLink в службе поддержки dbt. Например, `*.vpce-012345678abcdefgh-4321dcba.s3.us-west-2.vpce.amazonaws.com`.
2. В соответствующем проекте dbt перейдите в **Orchestration** → **Environments**.
3. Откройте среду, которая должна использовать конечную точку dbt Internal Stage PrivateLink, и задайте **Extended attributes**. Шаги настройки различаются для сред развертывания и разработки; см. раздел [Расширенные атрибуты](https://docs.getdbt.tech/docs/dbt-platform-environments.md#extended-attributes). Используйте значение, аналогичное следующему:

```text
s3_stage_vpce_dns_name: '*.vpce-012345678abcdefgh-4321dcba.s3.us-west-2.vpce.amazonaws.com'
```

4. Сохраните изменения.

[![DNS-имя внутренней области хранения](/img/docs/dbt-platform/snowflake-internal-stage-dns.png?v=2 "DNS-имя внутренней области хранения")](#)DNS-имя внутренней области хранения

## Настройка сетевых политик

Если ваша организация использует [сетевые политики Snowflake](https://docs.snowflake.com/en/user-guide/network-policies) для ограничения доступа к учетной записи Snowflake, необходимо добавить сетевое правило для dbt. Snowflake поддерживает два типа сетевых правил: на основе идентификатора VPCE (рекомендуется) и на основе IP/CIDR. В следующих шагах используется идентификатор VPCE. Если вашей организации требуется сетевая политика на основе IP-адресов, диапазон CIDR недоступен в интерфейсе dbt platform. Чтобы получить его, обратитесь в [службу поддержки dbt](mailto:support@getdbt.com).

Для создания сетевой политики в Snowflake вам потребуется идентификатор VPCE:

1. В dbt platform перейдите в **Account settings → Private endpoints**
2. Нажмите на конечную точку в таблице, затем найдите поле **Endpoint identifier** на странице сведений о конечной точке.
3. Если вы настроили PrivateLink [с помощью службы поддержки](#support-led-setup) или раздел **Private endpoints** недоступен в настройках вашей учетной записи, обратитесь в [службу поддержки dbt](mailto:support@getdbt.com), чтобы получить идентификатор VPCE.
4. Если вы создаете конечную точку для Internal Stage, ее идентификатор VPCE отличается от идентификатора VPCE основной конечной точки сервиса.

Сетевая политика для Snowflake Internal Stage PrivateLink

Рекомендации по защите как сервиса Snowflake, так и внутренней области хранения см. в документации Snowflake по [сетевым политикам](https://docs.snowflake.com/en/user-guide/network-policies#strategies-for-protecting-both-service-and-internal-stage) и [сетевым правилам](https://docs.snowflake.com/en/user-guide/network-rules#incoming-requests).

### Использование пользовательского интерфейса

Откройте интерфейс Snowflake и выполните следующие действия:

1. Перейдите на вкладку **Security**.
2. Нажмите **Network Rules**.
3. Нажмите **Add Rule**.
4. Задайте имя правила.
5. Выберите базу данных и схему, в которых будет храниться правило. Этот выбор служит для настройки разрешений и организации объектов; на само правило он не влияет.
6. Установите тип `AWS VPCE ID` и режим `Ingress`.
7. Введите в поле идентификатора идентификатор VPCE со страницы сведений о конечной точке в dbt platform (или полученный от службы поддержки dbt, если вы использовали настройку с помощью службы поддержки).
8. Нажмите **Create Network Rule**.

[![Создание сетевого правила](/img/docs/dbt-platform/snowflakeprivatelink2.png?v=2 "Создание сетевого правила")](#)Создание сетевого правила

9. На вкладке **Network Policy** отредактируйте политику, в которую хотите добавить правило. Это может быть политика уровня учетной записи или политика для конкретных пользователей, подключающихся из dbt.

10. Добавьте новое правило в список разрешенных и нажмите **Update Network Policy**.

[![Обновление сетевой политики](/img/docs/dbt-platform/snowflakeprivatelink3.png?v=2 "Обновление сетевой политики")](#)Обновление сетевой политики

### Использование SQL

Для быстрой и автоматизированной настройки сетевых правил с помощью SQL в Snowflake используйте следующие команды, которые позволяют создавать и настраивать правила доступа для dbt. Эти примеры SQL показывают, как добавить сетевое правило и соответствующим образом обновить сетевую политику.

1. Создайте новое сетевое правило с помощью следующего SQL:

```sql

CREATE NETWORK RULE allow_dbt_cloud_access
  MODE = INGRESS
  TYPE = AWSVPCEID
  VALUE_LIST = ('<VPCE_ID>'); -- Замените '<VPCE_ID>' фактическим значением идентификатора VPCE
```

2. Добавьте правило в сетевую политику с помощью следующего SQL:

```sql

ALTER NETWORK POLICY <network_policy_name>
  ADD ALLOWED_NETWORK_RULE_LIST =('allow_dbt_cloud_access');
```
