Amazon Virtual Private Cloud ID 适用于外部暂存区、外部函数和外部卷

Snowflake 不断致力于加强对从 Snowflake 环境传出的数据的控制,为此,我们正在将出口控制点迁移到新的 Amazon Virtual Private Cloud (VPC)。这将导致 Snowflake 在为外部函数、外部暂存区和外部卷建立出站连接时,使用的 Amazon VPC ID 发生变化。

备注

使用 兼容 Amazon S3 的存储 的客户应确认,是否有任何策略可能受此变更影响,并相应更新其策略。

如果客户根据已发布的 VPC ID 筛选传入其 API 网关或 S3 暂存区的流量,则需要更新其策略以包含新的 VPC ID。

若要获得需要列入允许列表的 VPC IDs 的完整列表,客户应运行 SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO 函数。

行为变更

变更前:

SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO 的输出不包含 snowflake-egress-vpc-ids 属性。

变更后:

SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO 函数的输出包含一个新属性 snowflake-egress-vpc-ids,其中包括 idexpirespurpose 子属性。

该函数的输出类似于:

{
  "snowflake-vpc-id": ["<existing VPC ID>"],
  "snowflake-egress-vpc-ids": [
    {
      "id": "<existing VPC ID>",
      "expires": "2025-03-01T00:00:00",
      "purpose": "generic"
    },
    {
      "id": "<new VPC ID>",
      "expires": "2025-03-01T00:00:00",
      "purpose": "generic"
    }
  ]
}

客户应检查 snowflake-egress-vpc-ids 属性中的 id 字段,并注意标记为 "purpose":"generic"id 值。generic IDs 是 VPC IDs,需要列入到允许列表中,以支持 Snowflake 的核心功能。

此变更将于 2025 年 2 月 24 日生效。

备注

该函数返回 VPC IDs 的列表:当前使用的 VPC ID 和新的 VPC ID。snowflake-vpc-id 提供的 VPC IDs 将在 snowflake-egress-vpc-ids 中复制,但标记为 "purpose":"generic"。所有具有通用目的的 VPC IDs 都必须在策略中纳入允许列表。

expires 属性指定了相关 VPC ID 保证有效的截止日期和时间。客户应在到期日之前更新任何自动化机制或流程,以查询该函数,确保其拥有关于当前 VPC IDs 的最新信息。

输出 VPC IDs 保持稳定,其有效期会自动更新和延长。

尽管 Snowflake 今后可能需要更改 VPC IDs,但在 2025 年 3 月 31 日之前无更改计划。这些信息主要供未来参考。

必须实施以下更改,才能继续访问以下 Snowflake 功能:

外部暂存区和卷:

遵循 允许虚拟专用云 IDs 中的说明,为外部暂存区或外部卷指定 VPC IDs。

外部函数:

遵循 保护 Amazon API 网关端点 中的说明,为外部函数指定 VPC IDs。

时间表

第一阶段:

从 2025 年 2 月 24 日当周开始,SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO 函数将在所有 AWS 部署中更新,以包括 snowflake-egress-vpc-ids 元素下的新出口 VPC IDs。客户可以开始更新其 S3 和API 网关策略,以将这些新的 VPC IDs 纳入允许列表。

第二阶段:

从 2025 年 5 月 24 日当周开始,Snowflake 将开始逐步过渡到为外部暂存区、外部函数和外部卷使用新的 VPCs。客户必须确保在此日期之前完成其 S3 和 API 网关策略更新。

常见问题

如何查找可能受此变更影响的外部暂存区对应的 S3 桶?

使用 ACCOUNTADMIN 角色执行以下查询,以确定受此变更影响的外部暂存区:

USE ROLE ACCOUNTADMIN;

SELECT stage_url, stage_region, stage_owner, stage_catalog, stage_schema
  FROM SNOWFLAKE.ACCOUNT_USAGE.STAGES
  WHERE STARTSWITH(stage_url, 's3')
    AND stage_url IS NOT NULL
    AND deleted IS NULL;
Copy

如何查找可能受此变更影响的 API 网关?

使用 ACCOUNTADMIN 角色,执行以下查询以确定受此变更影响的 S3 网关:

USE ROLE ACCOUNTADMIN;

SELECT function_name, function_definition, function_owner, function_catalog, function_schema
  FROM SNOWFLAKE.ACCOUNT_USAGE.FUNCTIONS
  WHERE function_language = 'EXTERNAL'
    AND function_definition ILIKE '%.execute-api.%.amazonaws.com%'
    AND deleted IS NULL;
Copy

如何查找可能受此变更影响的外部卷对应的 S3 桶?

使用 ACCOUNTADMIN 角色,执行以下查询以确定受此变更影响的 S3 桶:

use role accountadmin;

DECLARE
res1 RESULTSET;
res2 RESULTSET;
sql_vol VARCHAR;
rpt VARIANT;
rpt_int VARIANT;
BEGIN
  rpt := object_construct();
  sql_vol := 'SELECT PROPERTY, VALUE:"NAME"::VARCHAR as NAME, VALUE:"STORAGE_ALLOWED_LOCATIONS"::VARCHAR as S3_PATH FROM (
SELECT PARSE_JSON(T."property_value") AS VALUE, T."property" as PROPERTY
FROM TABLE(RESULT_SCAN(last_query_id())) T
WHERE T."property_type" = \'String\'
AND T."property" != \'ACTIVE\'
AND VALUE:"STORAGE_PROVIDER"=\'S3\')
;';
  show external volumes;
  LET c1 CURSOR FOR SELECT * FROM TABLE(RESULT_SCAN(last_query_id()));
  OPEN c1;
  FOR record IN c1 DO
    res1 := (execute immediate 'describe external volume ' || record."name");
    res2 := (execute immediate :sql_vol);
    rpt_int := object_construct();
    let c2 CURSOR for res2;
    open c2;
    for inner_record in c2 do
        rpt_int := object_insert( rpt_int, inner_record.NAME, inner_record.S3_PATH);
    end for;

    rpt := object_insert( rpt, record."name", rpt_int );
  END FOR;
  RETURN rpt;
END;
Copy

如何查找可能包含当前 Snowflake VPC ID 的 AWS 策略?

要确定可能受此变更影响的策略,请使用 AWS CLI (https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

  1. 运行 SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO 命令,留意在 Snowflake-vpc-id 中返回的 VPC ID。

  2. 运行以下脚本,列出 IAM 策略中的 ARNs 和包含当前 Snowflake VPC ID 的 API 网关中的 API IDs。请注意,脚本运行可能需要一些时间。

  3. 根据上述说明,查看所列出的策略,并确定哪些策略需要更新,以包括额外的 VPC ID。

SNOWFLAKE_VPC_ID="<VPC ID returned in snowflake-vpc-id>"

# List ARNs of IAM policies that contain the current Snowflake VPC ID.
aws iam list-policies --scope Local --query 'Policies[*].Arn' --output text | tr '\t' '\n' | while read -r policy_arn; do
  version_id=$(aws iam get-policy --policy-arn "${policy_arn}" --query 'Policy.DefaultVersionId' --output text)
  aws iam get-policy-version --policy-arn "${policy_arn}" --version-id "${version_id}" | grep -q "${SNOWFLAKE_VPC_ID}" && echo "${policy_arn}"
done

# List API IDs of API Gateways that contain resource policies with the current Snowflake VPC ID.
aws apigateway get-rest-apis --query 'items[*].id' --output text --profile | tr '\t' '\n' | while read -r api_id; do
  aws apigateway get-rest-api --rest-api-id "${api_id}" --query 'policy' --output text | grep -q "${SNOWFLAKE_VPC_ID}" && echo "${api_id}"
done
Copy

参考:1910

语言: 中文