Snowflake外部表从AWS账户复制到GCP账户的实现方案咨询
跨云外部表配置方案
以下两种方案可实现需求,可根据你的合规要求选择:
方案1:GCP侧Snowflake直接创建指向AWS S3的外部表(推荐)
该方案无需复制数据,GCP侧查询的是AWS S3的原始文件,和AWS侧外部表数据实时一致,操作成本最低。
操作步骤:
- 第一步:AWS侧配置S3跨云访问权限
在AWS IAM中创建专属访问角色,给角色配置S3桶的s3:GetObject、s3:ListBucket权限,同时预留Snowflake IAM实体的信任关系配置位。 - 第二步:GCP侧Snowflake创建AWS S3存储集成
执行以下SQL创建存储集成,替换括号内的实际参数:
执行完成后运行CREATE STORAGE INTEGRATION aws_s3_cross_cloud_integ TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'S3' STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::<AWS账号ID>:role/<你创建的跨云访问角色名>' ENABLED = TRUE STORAGE_ALLOWED_LOCATIONS = ('s3://<你的S3桶名>/<外部表对应的路径前缀>/');DESC STORAGE INTEGRATION aws_s3_cross_cloud_integ;,获取输出中的STORAGE_AWS_IAM_USER_ARN参数值,将该ARN填入第一步AWS角色的信任关系中,完成权限打通。 - 第三步:创建外部阶段和外部表
先创建指向S3路径的外部阶段,复用上面的存储集成:
最后参照AWS侧的外部表字段定义、分区规则、文件过滤逻辑,在GCP侧创建完全一致的外部表即可,查询时会直接读取S3中的对应文件,和AWS侧数据完全同步。CREATE STAGE aws_s3_ext_stage URL = 's3://<你的S3桶名>/<外部表对应的路径前缀>/' STORAGE_INTEGRATION = aws_s3_cross_cloud_integ FILE_FORMAT = (TYPE = <实际文件格式,比如PARQUET/CSV/JSON>);
方案2:复制AWS侧外部表元数据到GCP侧
如果需要复用AWS侧的外部表配置,不需要手动重写建表语句,可以用该方案:
- 首先在AWS侧Snowflake账户创建私有共享,将外部表所属的数据库/模式、关联的存储集成、文件格式等对象加入共享,授权给你的GCP区域Snowflake账户ID。
- 在GCP侧Snowflake账户挂载该共享,直接执行以下SQL复制外部表元数据:
CREATE EXTERNAL TABLE gcp_ext_table COPY OF <共享数据库名>.<模式名>.<AWS侧外部表名>;
注意:该方案仍然需要GCP侧Snowflake有权限访问AWS S3才能正常查询数据,如果有合规要求不允许跨云访问对象存储,你需要先将S3中的文件同步到GCS,再在GCP侧创建指向GCS的外部表。
注意事项
- 如果AWS侧的外部表结构有变更,方案1需要同步修改GCP侧的外部表定义,方案2可以开启元数据自动刷新同步变更。
- 同一个存储集成可以给同一路径下的所有外部表复用,不需要重复创建。
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

