选项 1:配置 Snowflake 存储集成以访问 Amazon S3¶
本主题介绍如何使用存储集成来允许 Snowflake 从外部(即 S3)暂存区中引用的 Amazon S3 桶读取数据,并向其中写入数据。集成是已命名的第一类 Snowflake 对象,无需传递显式云提供商凭据(如密钥或访问令牌)。集成对象存储 AWS Identity and Access Management (IAM) 用户 ID。您组织中的管理员在 AWS 账户向集成授予 IAM 用户权限。
集成还可以列出桶(和可选路径),以限制用户在创建使用集成的外部暂存区时可以指定的位置。
备注
下图显示了 S3 暂存区的集成流程:
外部(即 S3)暂存区在其定义中引用了存储集成对象。
Snowflake 会自动将存储集成与为您的账户创建的 S3 IAM 用户相关联。Snowflake 会创建一个 IAM 用户,供 Snowflake 账户中的所有 S3 存储集成引用。
您组织中的 AWS 管理员向 IAM 用户授予权限,以访问暂存区定义中引用的桶。请注意,许多外部暂存区对象可以引用不同的桶和路径,并使用相同的存储集成进行身份验证。
当用户从暂存区加载或卸载数据时,Snowflake 会在允许或拒绝访问之前验证桶上授予 IAM 用户的权限。
本主题内容:
配置对 Cloud Storage 的安全访问¶
本部分介绍如何配置 Snowflake 存储集成对象,以将云存储的身份验证责任委托给 Snowflake Identity and Access Management (IAM) 实体。
第 1 步:配置 S3 桶的访问权限¶
AWS 访问控制要求¶
Snowflake 需要对 S3 桶和文件夹拥有以下权限才能访问该文件夹(以及子文件夹)中的文件:
s3:GetBucketLocation
s3:GetObject
s3:GetObjectVersion
s3:ListBucket
备注
需要以下额外的权限才能执行其他 SQL 操作:
权限 |
SQL 操作 |
---|---|
|
将文件卸载到桶中。 |
|
在成功加载后自动从暂存区中清除文件,或 执行 REMOVE 语句以手动移除文件。 |
作为最佳实践,Snowflake 建议创建一个供 Snowflake 访问 S3 桶的 IAM 策略。然后,您可以将策略附加到角色,并使用由 AWS 为角色生成的安全凭据来访问桶中的文件。
创建 IAM 策略¶
以下分步说明介绍如何在 AWS 管理控制台中配置 Snowflake 的访问权限,以便您可以使用 S3 桶来加载和卸载数据:
登录 AWS 管理控制台。
从主页仪表板搜索并选择 IAM。
从左侧导航窗格中选择 Account settings。
在 Endpoints 列表中的 Security Token Service (STS) 下,找到账户所在的 Snowflake 区域。如果 STS status 不活动,请将切换按钮移至 Active。
从左侧导航窗格中选择 Policies。
选择 Create Policy。
对于 Policy editor,选择 JSON。
添加允许 Snowflake 访问 S3 桶和文件夹的策略文档。
以下策略(采用 JSON 格式)为 Snowflake 提供使用单个桶和文件夹路径加载或卸载数据所需的权限。您还可以使用 PURGE 复制选项来清除数据文件。
将文本复制并粘贴到策略编辑器中:
备注
确保用实际桶名称和文件夹路径前缀替换
bucket
和prefix
。政府区域 中的桶的 Amazon 资源名称 (ARN) 有一个
arn:aws-us-gov:s3:::
前缀。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource": "arn:aws:s3:::<bucket>/<prefix>/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::<bucket>", "Condition": { "StringLike": { "s3:prefix": [ "<prefix>/*" ] } } } ] }
备注
将
"s3:prefix":
条件设置为["*"]
或者["<path>/*"]
,以便分别向指定桶中的所有前缀或桶中的路径分别授予访问权限。注意 AWS 策略支持各种不同的安全用例。
以下策略为 Snowflake 提供从单个 只读 桶和文件夹路径加载数据所需的权限。该策略包括
s3:GetBucketLocation
、s3:GetObject
、s3:GetObjectVersion
和s3:ListBucket
权限:替代策略:从只读 S3 桶加载
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::<bucket>/<prefix>/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::<bucket>", "Condition": { "StringLike": { "s3:prefix": [ "<prefix>/*" ] } } } ] }
选择 Next。
输入 Policy name (例如
snowflake_access
)和可选的 Description。选择 Create policy。
第 2 步:在 AWS 中创建 IAM 角色¶
要在 AWS 管理控制台中为 Snowflake 配置访问权限,请执行以下操作:
在 Identity and Access Management (IAM) 控制面板的左侧导航窗格中,选择 Roles。
选择 Create role。
选择 AWS account 作为信任实体类型。
在 Account ID 字段中,暂时输入自己的 AWS 账户 ID。在稍后的步骤中,您将修改信任关系并授予对 Snowflake 的访问权限。
选择 Require external ID 选项。外部 ID 用于向第三方(如 Snowflake)授予对 AWS 资源(例如 S3 桶)的访问权限。
输入占位符 ID,例如
0000
。在后续步骤中,您将修改 IAM 角色的信任关系并指定外部 ID 用于存储集成。选择 Next。
选择您在 第 1 步:配置 S3 桶访问权限 (本主题内容)中创建的策略。
选择 Next。
输入角色的名称和描述,然后选择 Create role。
您现在已经为一个桶创建了 IAM 策略,创建了一个 IAM 角色,并将策略附加到了该角色。
在角色摘要页面上,找到 Role ARN 值并将其记录下来。在下一步中,您将创建引用此角色的 Snowflake 集成。
备注
Snowflake 会将临时凭据缓存一段时间,但不能超过 60 分钟的过期时间。如果您撤消 Snowflake 的访问权限,用户或许也能够从云存储位置列出文件并访问数据,直到缓存过期。
第 3 步:在 Snowflake 中创建云存储集成¶
使用 CREATE STORAGE INTEGRATION 命令创建存储集成。存储集成是一个 Snowflake 对象,用于存储生成的身份和 S3 云存储访问管理 (IAM) 用户,以及一组可选的允许或阻止的存储位置(如桶)。组织中的云提供商管理员会将存储位置的权限授予生成的用户。此选项可让用户在创建暂存区或加载数据时无需提供凭据。
单个存储集成可以支持多个外部(如 S3)暂存区。暂存区定义中的 URL 必须与为 STORAGE_ALLOWED_LOCATIONS 参数指定的 S3 桶(和可选路径)一致。
备注
只有账户管理员(具有 ACCOUNTADMIN 角色的用户)或具有全局 CREATE INTEGRATION 权限的角色才能执行此 SQL 命令。
CREATE STORAGE INTEGRATION <integration_name>
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'S3'
ENABLED = TRUE
STORAGE_AWS_ROLE_ARN = '<iam_role>'
STORAGE_ALLOWED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/')
[ STORAGE_BLOCKED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/') ]
其中:
integration_name
是新集成的名称。iam_role
是您在 第 2 步:在 AWS 中创建 IAM 角色 (本主题内容)中创建的角色的 Amazon 资源名称 (ARN)。bucket
是存储数据文件的 S3 桶的名称(例如mybucket
)。在创建或修改引用此集成的暂存区时,必需的 STORAGE_ALLOWED_LOCATIONS 参数和可选的 STORAGE_BLOCKED_LOCATIONS 参数分别限制或阻止对这些桶的访问。path
是一个可选路径,可用于提供对桶中对象的精细控制。
下面的示例创建了一个集成,允许访问账户中的所有桶,但阻止访问定义的 sensitivedata
文件夹。
也使用此集成的其他外部暂存区可以引用允许的桶和路径:
CREATE STORAGE INTEGRATION s3_int TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'S3' ENABLED = TRUE STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::001234567890:role/myrole' STORAGE_ALLOWED_LOCATIONS = ('*') STORAGE_BLOCKED_LOCATIONS = ('s3://mybucket1/mypath1/sensitivedata/', 's3://mybucket2/mypath2/sensitivedata/');
备注
(可选)使用 STORAGE_AWS_EXTERNAL_ID 参数来指定您自己的外部 ID。您可以选择此选项,在多个外部卷和/或存储集成中使用相同的外部 ID。
第 4 步:检索您的 Snowflake 账户的 AWSIAM 用户¶
要检索自动为您的 Snowflake 账户创建的 IAM 用户的 ARN,请使用 DESCRIBE INTEGRATION。
DESC INTEGRATION <integration_name>;
其中:
integration_name
是您在 第 3 步:在 Snowflake 中创建云存储集成 (本主题内容)中创建的集成的名称。
例如:
DESC INTEGRATION s3_int; +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+ | property | property_type | property_value | property_default | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------| | ENABLED | Boolean | true | false | | STORAGE_ALLOWED_LOCATIONS | List | s3://mybucket1/mypath1/,s3://mybucket2/mypath2/ | [] | | STORAGE_BLOCKED_LOCATIONS | List | s3://mybucket1/mypath1/sensitivedata/,s3://mybucket2/mypath2/sensitivedata/ | [] | | STORAGE_AWS_IAM_USER_ARN | String | arn:aws:iam::123456789001:user/abc1-b-self1234 | | | STORAGE_AWS_ROLE_ARN | String | arn:aws:iam::001234567890:role/myrole | | | STORAGE_AWS_EXTERNAL_ID | String | MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq= | | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
记录以下属性的值:
属性
描述
STORAGE_AWS_IAM_USER_ARN
为您的 Snowflake 账户创建的 AWS IAM 用户,例如
arn:aws:iam::123456789001:user/abc1-b-self1234
。Snowflake 会为整个 Snowflake 账户配置单一 IAM 用户。您账户中的所有 S3 存储集成都使用该 IAM 用户。STORAGE_AWS_EXTERNAL_ID
Snowflake 与 AWS 建立信任关系所使用的外部 ID。如果创建存储集成时未指定外部 ID (
STORAGE_AWS_EXTERNAL_ID
),Snowflake 会生成一个 ID 供您使用。在下一部分中需要提供这些值。
第 5 步:授予访问桶对象的 IAM 用户权限¶
以下分步说明描述了如何在 AWS 管理控制台中配置 Snowflake 的 IAM 访问权限,以便您可以使用 S3 桶来加载和卸载数据:
登录 AWS 管理控制台。
选择 IAM。
从左侧导航窗格中选择 Roles。
选择在 第 2 步:在 AWS 中创建 IAM 角色 (本主题内容)中创建的角色。
选择 Trust relationships 选项卡。
选择 Edit trust policy。
使用您在 第 4 步:检索 Snowflake 账户 AWS IAM 用户 (本主题内容)中记录的 DESC STORAGE INTEGRATION 输出值修改策略文档。
IAM 角色的策略文档
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "<snowflake_user_arn>" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "<snowflake_external_id>" } } } ] }
其中:
snowflake_user_arn
是记录的 STORAGE_AWS_IAM_USER_ARN 值。snowflake_external_id
是记录的 STORAGE_AWS_EXTERNAL_ID 值。在此示例中,
snowflake_external_id
值为MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq=
。备注
出于安全原因,如果您在不指定外部 ID 的情况下创建新的存储集成(或使用 CREATE OR REPLACE STORAGE INTEGRATION 语法重新创建一个现有的存储集成),新的集成具有 不同 的外部 ID,所以它不能解析信任关系,除非更新信任策略。
选择 Update policy 保存更改。
备注
Snowflake 会将临时凭据缓存一段时间,但不能超过 60 分钟的过期时间。如果您撤消 Snowflake 的访问权限,用户或许也能够从云存储位置列出文件并加载数据,直到缓存过期。
第 6 步:创建外部暂存区¶
创建外部(如 S3)暂存区,该暂存区引用您在 第 3 步:在 Snowflake 中创建云存储集成 (本主题内容)中创建的存储集成。
备注
创建使用存储集成的暂存区需要具有以下权限的角色:架构的 CREATE STAGE 权限以及存储集成的 USAGE 权限。例如:
GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;
GRANT USAGE ON INTEGRATION s3_int TO ROLE myrole;
使用 CREATE STAGE 命令创建暂存区。
例如,设置 mydb.public
作为用户会话的当前数据库和架构,然后创建一个名为 my_s3_stage
的暂存区。在此示例中,暂存区引用由集成提供支持的 S3 桶和路径 mybucket1/path1
。暂存区还引用名为 my_csv_format
的指定文件格式对象:
USE SCHEMA mydb.public; CREATE STAGE my_s3_stage STORAGE_INTEGRATION = s3_int URL = 's3://bucket1/path1/' FILE_FORMAT = my_csv_format;
备注
暂存区所有者(即具有暂存区 OWNERSHIP 权限的角色)必须拥有存储集成的 USAGE 权限。
追加正斜杠 (
/
) 到 URL 值,以筛选到指定的文件夹路径。如果省略正斜杠,则包含以指定路径的前缀开头的所有文件和文件夹。请注意,必须添加 正斜杠才能访问和检索暂存区中的非结构化数据文件。
要从使用集成的暂存区加载或卸载数据,角色必须具有暂存区的 USAGE 权限。不必 同时具有存储集成的 USAGE 权限。
STORAGE_INTEGRATION 参数与其他暂存区参数分开处理,例如 FILE_FORMAT。无论用于访问 S3 桶的集成如何,对这些其他参数的支持都是相同的。
下一步: AWS 数据文件加密