Snowflake 配置 S3 Storage Integration
介绍
Snowflake
的 Data Loading
和 Data Unloading
可以通过 S3
导入和导出数据。用户可以使用 AWS_KEY_ID
和 AWS_SECRET_KEY
来授权 Snowflake
访问 S3
,不过出于安全和权限控制的考虑,一般不会这么做。
Snowflake
建议通过 Storage Integration
来管理权限。
获取 VPC ID
在配置 Storage Integration
前,需要设置 S3
策略。首先获取 Snowflake
的 VPC ID
,后续的 S3
策略配置中将只允许该 VPC
访问。
允许特定 VPC 访问的功能要求 Snowflake 实例和对应的 S3 Bucket 运行在相同的 AWS 区域内。
切换到 ACCOUNTADMIN
角色在 Snowflake
中执行:
1 | USE ROLE ACCOUNTADMIN; |
记录下返回的 VPC ID
:
1 | {"snowflake-vpc-id":["vpc-abc"]} |
创建 IAM 策略
然后,需要创建一个 S3
策略来定义 Snowflake
访问 S3 Bucket
的权限。
从 AWS
控制台进入 IAM
,在左侧导航栏 Access management
下选择 Account settings
:
在 Security Token Service (STS)
下查看所在区域的 STS
状态是否是 Active
:
接着,在左侧导航栏 Access management
下选择 Policies
,之后点击 Create policy
:
切换到 JSON
后输入 S3
策略:
下面的策略中 vpc-abc
是 Snowflake
实例的 VPC
,snowflake-storage-integration-example
是示例 Bucket
的名字,unloading
和 loading
是该 Bucket
下的两个文件夹,分别用于 Data Unloading
和 Data Loading
使用:
1 | { |
创建 IAM 角色
接着,创建一个 IAM
角色并绑定前一步创建的 S3
策略。在 IAM
左侧导航栏 Access management
下选择 Roles
,之后点击 Create role
:
Trusted entity type
选择 AWS account
,然后在 An AWS account
下选择 Another AWS account
,Account ID
暂时先填当前账号的 ID
,之后会修改:
同时,选择 Require external ID (Best practice when a third party will assume this role)
,External ID
暂时用一个假的例如 0000
替代,之后同样会修改:
最后绑定先前创建的 S3
策略:
创建角色之后,记录下角色的 ARN
,接下来会用到:
创建 Storage Integration
这时就可以在 Snowflake
中创建 Storage Integration
了:
1 | CREATE STORAGE INTEGRATION snowflake_storage_integration_example |
其中 STORAGE_AWS_ROLE_ARN
是之前所创建的 IAM
角色的 ARN
,STORAGE_ALLOWED_LOCATIONS
是示例 Bucket
下的两个文件夹的地址。
只有授权了
CREATE INTEGRATION
权限的角色才能创建STORAGE INTEGRATION
,默认只有ACCOUNTADMIN
才有这个权限。
获取 Snowflake 的用户 ARN 和 External ID
接着需要获取所创建的 Storage Integration
对应的 Snowflake
IAM
用户的 ARN
和 External ID
:
1 | desc integration snowflake_storage_integration_example; |
记录下 STORAGE_AWS_IAM_USER_ARN
和 STORAGE_AWS_EXTERNAL_ID
。
授权 Snowflake 用户
回到之前创建的 IAM
角色,在 Trust relationships
下替换掉之前填写的临时 Account ID
和 External ID
:
完成后,我们就可以执行一条 Data Unloading
命令来验证配置是否成功:
1 | copy into 's3://snowflake-storage-integration-example/unloading/' |
如果配置成功,那么 Snowflake
会将表 MY_DATABASE.MY_SCHEMA.MY_TABLE
的数据导出到 s3://snowflake-storage-integration-example/unloading/
文件夹下。