CREATE EXTERNAL ACCESS INTEGRATION

创建 外部访问集成,以便从 UDF 或过程处理程序访问外部网络位置。

另请参阅:

ALTER EXTERNAL ACCESS INTEGRATIONDROP INTEGRATIONSHOW INTEGRATIONSDESCRIBE INTEGRATION

语法

CREATE [ OR REPLACE ] EXTERNAL ACCESS INTEGRATION <name>
  ALLOWED_NETWORK_RULES = ( <rule_name_1> [, <rule_name_2>, ... ] )
  [ ALLOWED_API_AUTHENTICATION_INTEGRATIONS = ( { <integration_name_1> [, <integration_name_2>, ... ] | none } ) ]
  [ ALLOWED_AUTHENTICATION_SECRETS = ( { <secret_name_1> [, <secret_name_2>, ... ] | all | none } ) ]
  ENABLED = { TRUE | FALSE }
  [ COMMENT = '<string_literal>' ]
Copy

必填参数

name

外部访问集成的标识符。

标识符值必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如 "My object")。放在双引号内的标识符区分大小写。

有关更多详细信息,请参阅 标识符要求

ALLOWED_NETWORK_RULES = (rule_name [ , rule_name ... ])

指定允许的 网络规则。只能指定出口规则。

ENABLED = { TRUE | FALSE }

指定是启用还是禁用此集成。如果禁用了集成,任何依赖集成的处理程序代码都将无法到达外部网络位置。

该值不区分大小写。

默认为 TRUE

可选参数

ALLOWED_API_AUTHENTICATION_INTEGRATIONS = ( integration_name_1 [, integration_name_2, ... ] | none )

指定安全集成,其 OAuth 授权服务器发布了 UDF 或程序所使用的密钥。安全集成必须是 用于外部 API 集成的类型

此参数的值必须为以下值之一:

  • 一个或多个 Snowflake 安全集成名称,以允许任何列出的集成。

  • none,以不允许集成。

此参数指定的安全集成 – 以及 ALLOWED_AUTHENTICATION_SECRETS 参数指定的密钥 – 是允许在 UDF 或使用此外部访问集成的过程中使用密钥的方法。有关更多信息,请参阅 使用说明

有关安全集成的参考信息,请参阅 CREATE SECURITY INTEGRATION(外部 API 身份验证)

ALLOWED_AUTHENTICATION_SECRETS = ( secret_name [, secret_name ... ] | all | none )

指定 UDF 或过程处理程序代码在访问允许的网络规则中引用的外部网络位置时可以使用的密钥。

此参数的值必须为以下值之一:

  • 一个或多个 Snowflake 密钥名称,以允许列出的任何密钥。

  • all,以允许任何密钥。

  • none,以禁止密钥。

ALLOWED_API_AUTHENTICATION_INTEGRATIONS 参数还可以指定允许的密钥。有关更多信息,请参阅 使用说明

有关密钥的参考信息,请参阅 CREATE SECRET

COMMENT = 'string_literal'

指定外部访问集成的注释。

默认:无值

访问控制要求

用于执行此 SQL 命令的 角色 必须至少具有以下 权限

权限

对象

备注

CREATE INTEGRATION

账户

Only the ACCOUNTADMIN role has this privilege by default. The privilege can be granted to additional roles as needed.

USAGE

密钥

对于集成引用的所有密钥都是必需的。

USAGE

架构

对于包含集成引用的任何密钥的所有架构都是必需的。

有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色

有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述

使用说明

  • 您可以通过使用两个外部访问集成参数,允许 UDF 或过程使用密钥,具体用法如下所述。

    • 使用 ALLOWED_AUTHENTICATION_SECRETS 参数。您可以将密钥指定为参数值,或将参数的值设置为 all,以允许处理程序代码使用任何密钥。

    • 使用 ALLOWED_API_AUTHENTICATION_INTEGRATIONS 参数。当密钥本身指定名称也由该参数指定的安全集成时,允许使用 密钥。密钥使用其 API_AUTHENTICATION 参数指定安全集成。换句话说,当密钥和外部访问集成都指定了安全集成时,允许将密钥用于指定外部访问集成的函数和过程。

    请注意,这两个替代函数彼此独立运行。如果其中一个(或两个)参数允许使用密钥,则不管对另一个参数指定的值如何,都允许使用密钥。例如,将其中一个参数设置为 none 并不会阻止在处理程序代码中使用另一个参数指定的密钥。

  • 关于元数据:

    注意

    客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段

示例

创建外部访问集成,提供对 Google 翻译 API 的访问。

有关更完整的示例,请参阅 创建和使用外部访问集成

  1. 创建一个代表凭据的密钥。

    要创建密钥,必须为您分配一个具有当前架构 CREATE SECRET 权限的角色。有关此命令支持的其他类型的密钥,请参阅 CREATE SECRET。在此示例中,google_translate_oauth 表示安全集成。有关更多信息,请参阅 CREATE SECURITY INTEGRATION(外部 API 身份验证)

    CREATE OR REPLACE SECRET oauth_token
      TYPE = OAUTH2
      API_AUTHENTICATION = google_translate_oauth
      OAUTH_REFRESH_TOKEN = 'my-refresh-token';
    
    Copy
  2. developer 角色授予密钥的 READ 权限,以便 UDF 开发者可以使用它。

    创建需要使用密钥的开发者所需具备的角色。

    USE ROLE USERADMIN;
    CREATE OR REPLACE ROLE developer;
    
    Copy

    developer 角色授予 READ 权限。

    USE ROLE SECURITYADMIN;
    GRANT READ ON SECRET oauth_token TO ROLE developer;
    
    Copy
  3. 创建代表外部网络位置的网络规则。使用具有 CREATE NETWORK RULE 中所述权限的角色。

    USE ROLE SYSADMIN;
    CREATE OR REPLACE NETWORK RULE google_apis_network_rule
      MODE = EGRESS
      TYPE = HOST_PORT
      VALUE_LIST = ('translation.googleapis.com');
    
    Copy
  4. 使用密钥和网络规则创建外部访问集成。

    USE ROLE ACCOUNTADMIN;
    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION google_apis_access_integration
      ALLOWED_NETWORK_RULES = (google_apis_network_rule)
      ALLOWED_AUTHENTICATION_SECRETS = (oauth_token)
      ENABLED = true;
    
    Copy
  5. developer 角色授予集成的 USAGE 权限,以便 UDF 开发者可以使用它。

    GRANT USAGE ON INTEGRATION google_apis_access_integration TO ROLE developer;
    
    Copy
  6. 创建一个 UDF google_translate_python,将指定文本翻译成指定语言的短语。有关更多信息,请参阅 在函数或过程中使用外部访问集成

    USE ROLE developer;
    
    CREATE OR REPLACE FUNCTION google_translate_python(sentence STRING, language STRING)
    RETURNS STRING
    LANGUAGE PYTHON
    RUNTIME_VERSION = 3.8
    HANDLER = 'get_translation'
    EXTERNAL_ACCESS_INTEGRATIONS = (google_apis_access_integration)
    PACKAGES = ('snowflake-snowpark-python','requests')
    SECRETS = ('cred' = oauth_token )
    AS
    $$
    import _snowflake
    import requests
    import json
    session = requests.Session()
    def get_translation(sentence, language):
      token = _snowflake.get_oauth_access_token('cred')
      url = "https://translation.googleapis.com/language/translate/v2"
      data = {'q': sentence,'target': language}
      response = session.post(url, json = data, headers = {"Authorization": "Bearer " + token})
      return response.json()['data']['translations'][0]['translatedText']
    $$;
    
    Copy
  7. 授予对 google_translate_python 函数的 USAGE 权限,以便具有相应用户角色的人可以调用它。

    GRANT USAGE ON FUNCTION google_translate_python(string, string) TO ROLE user;
    
    Copy
  8. 执行 google_translate_python 函数来翻译短语。

    USE ROLE user;
    SELECT google_translate_python('Happy Thursday!', 'zh-CN');
    
    Copy

    这会生成以下输出。

    -------------------------------------------------------
    | GOOGLE_TRANSLATE_PYTHON('HAPPY THURSDAY!', 'ZH-CN') |
    -------------------------------------------------------
    | 快乐星期四!                                          |
    -------------------------------------------------------
    
语言: 中文