选项 2:配置 AWS IAM 角色以访问 Amazon S3 – 已弃用¶
备注
使用已弃用的身份验证方法时,您可能会遇到 assumeRole
错误。
本节介绍如何配置 S3 桶、IAM 角色和策略,以便 Snowflake 代表 Snowflake 账户中的一个或多个个人用户以安全方式访问外部暂存区。
最佳实践是将 S3 桶访问限制为具有所需的最低权限的特定 IAM 角色。该 IAM 角色创建于 AWS 账户,同时系统还会设定访问 S3 桶的权限和允许 Snowflake 承担 IAM 角色的信任策略。
一个为 Snowflake 账户创建的 AWS IAM 用户与您通过信任关系配置的 IAM 角色关联。
该角色通过您配置的 IAM 策略被授予对 S3 桶的有限访问权限。
备注
完成本主题中的说明需要拥有 AWS 的管理权限。如果您不是 AWS 管理员,请让 AWS 管理员来执行这些任务。
本主题内容:
第 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。
展开 Security Token Service Regions 列表,找到与账户所在 区域 对应的 AWS 区域;如果状态是 Inactive,则选择 Activate。
从左侧导航窗格中选择 Policies。
点击 Create Policy。
点击 JSON 选项卡。
添加允许 Snowflake 访问 S3 桶和文件夹的策略文档。
以下策略(采用 JSON 格式)为 Snowflake 提供使用单个桶和文件夹路径加载或卸载数据所需的权限。您还可以使用 PURGE 复制选项来清除数据文件。
将文本复制并粘贴到策略编辑器中:
备注
确保用实际桶名称和文件夹路径前缀替换
bucket
和prefix
。{ "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>/*" ] } } } ] }
点击 Review policy。
输入 Policy name (例如
snowflake_access
)和可选的 Description。选择 Create policy。
第 2 步:创建一个 AWS IAM 角色¶
在 AWS 管理控制台中,创建一个可对包含数据文件的 S3 桶授予特权的 AWS IAM 角色。
在 Identity and Access Management (IAM) 控制面板的左侧导航窗格中,选择 Roles。
选择 Create role。
选择 AWS account 作为信任实体类型。
在 An AWS account 下,选择 This account。在稍后的步骤中,您将修改信任关系,并授予对 Snowflake 的访问权限。
选择 Require external ID 选项。输入一个虚拟 ID,例如
0000
。稍后,您将修改信任关系并为您的 Snowflake 暂存区指定外部 ID。点击 Next 按钮。
找到您在 第 1 步:配置 S3 桶访问权限 (在本主题中)所创建的策略,然后选择此策略。
点击 Next 按钮。
输入角色的名称和描述,然后点击 Create role 按钮。
您现在已经为一个桶创建了 IAM 策略,创建了一个 IAM 角色,并将策略附加到了该角色。
记录位于角色摘要页面上的 Role ARN 值。在下一步中,您将创建一个 Snowflake 暂存区,该暂存区引用此角色作为安全凭据。
备注
Snowflake 会将临时凭据缓存一段时间,但不能超过 60 分钟的过期时间。如果您撤消 Snowflake 的访问权限,用户或许也能够从云存储位置列出文件并加载数据,直到缓存过期。
第 3 步:创建外部暂存区¶
创建可引用您所创建的 AWS 角色的外部(即 S3)暂存区。
使用 CREATE STAGE 命令创建一个外部暂存区,或者您可以选择更改现有的外部暂存区并设置 CREDENTIALS 选项。
备注
凭证与其他暂存区参数(例如 ENCRYPTION 和 FILE_FORMAT)可分开处理。无论用于访问外部 S3 桶的凭证如何,对这些其他参数的支持都是相同的。
追加正斜杠 (
/
) 到 URL 值,以筛选到指定的文件夹路径。如果省略正斜杠,则包含以指定路径的前缀开头的所有文件和文件夹。请注意,必须添加 正斜杠才能访问和检索暂存区中的非结构化数据文件。
例如,设置
mydb.public
作为用户会话的当前数据库和架构,然后创建一个名为my_S3_stage
的暂存区。在此示例中,暂存区引用 S3 桶和路径mybucket/load/files
。S3 桶中的文件使用服务器端加密 (AWS_SSE_KMS) 进行加密:USE SCHEMA mydb.public; CREATE STAGE my_s3_stage URL='s3://mybucket/load/files' CREDENTIALS = (AWS_ROLE = 'arn:aws:iam::001234567890:role/mysnowflakerole') ENCRYPTION=(TYPE='AWS_SSE_KMS' KMS_KEY_ID = 'aws/key');
执行 DESCRIBE STAGE 命令来查看暂存区属性:
DESC STAGE my_S3_stage; +--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+ | parent_property | property | property_type | property_value | property_default | |--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------| ... | STAGE_CREDENTIALS | AWS_ROLE | String | arn:aws:iam::001234567890:role/mysnowflakerole | | | STAGE_CREDENTIALS | AWS_EXTERNAL_ID | String | MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw= | | | STAGE_CREDENTIALS | SNOWFLAKE_IAM_USER | String | arn:aws:iam::123456789001:user/vj4g-a-abcd1234 | | +--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+
记录 SNOWFLAKE_IAM_USER 和 AWS_EXTERNAL_ID 属性的值,其中:
- SNOWFLAKE_IAM_USER:
一个为 Snowflake 账户所创建的 AWS IAM 用户。对于您账户中创建的每个外部 S3 暂存区,该用户都是相同的。
- AWS_EXTERNAL_ID:
一个特别的 ID 分配到特定暂存区。ID 具有以下格式:
snowflakeAccount_SFCRole=snowflakeRoleId_randomId
请注意,本示例中使用的 AWS_ROLE、AWS_EXTERNAL_ID 和 SNOWFLAKE_IAM_USER 的值仅用于说明目的。
在下一步中,您将配置 AWS IAM 角色,并通过使用生成的 AWS 外部 ID 来向 Snowflake IAM 用户授予访问权限。
第 4 步:配置 AWS IAM 角色,以允许其访问暂存区¶
在 AWS 管理控制台中,使用您在 第 3 步:创建外部暂存 (在本主题中)记录的暂存区属性来配置 IAM 角色:
登录 AWS 管理控制台。
从主页仪表板搜索并选择 IAM。
从左侧导航窗格中选择 Roles,并点击您在 第 2 步:创建一个 AWS IAM 角色 (在本主题中)所创建的角色。
点击 Trust relationships 选项卡,然后点击 Edit trust relationship 按钮。
在 Policy Document 字段中,使用暂存区的属性值更新策略:
AWS: 输入 ARN 作为 SNOWFLAKE_IAM_USER 的暂存属性,即本示例中的
arn:aws:iam::123456789001:user/vj4g-a-abcd1234
。sts:ExternalId: 输入生成的外部 ID,即本示例中的
MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw=
。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789001:user/vj4g-a-abcd1234" ] }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw=" } } } ] }
备注
上述信任策略允许 Snowflake 账户中的单个外部暂存承担 IAM 角色。这是限制性最强的信任策略,因此也是最安全的。
承担 IAM 角色的权限与外部 ID 相关联。一个外部 ID 具有以下格式:
snowflake_account_SFCRole=snowflake_role_id_random_id
其中:
snowflake_account
是分配给 Snowflake 账户的名称。snowflake_role_id
是一个 ID 分配给在 第 3 步:创建外部暂存区 (在本主题中)中所创建暂存区的 Snowflake 角色。在当前示例中,
snowflake_role_id
值为2
。此 ID 与 Snowflake 账户中的单个角色关联。此 ID 的目的仅限于外部暂存的信任策略;因此,各 IDs 的 Snowflake 角色映射不可用。既定角色的角色 ID 仅显示于 DESCRIBE STAGE 输出的 AWS_EXTERNAL_ID 值里面。作为最佳实践,仅允许单个 Snowflake 角色创建外部 S3 暂存区。请注意,创建暂存区的角色不一定与暂存所有者(即在暂存区拥有 OWNERSHIP 特权的角色)相同。该暂存的所有权随后可转移给不同的角色,而无需对信任策略进行相应的更改。
出于安全原因,如果您创建新的存储集成(或使用 CREATE OR REPLACE STORAGE INTEGRATION 语法重新创建一个现有的存储集成),生成的集成具有不同的外部 ID,所以它不能承担 IAM 角色,除非修改信任策略。
如果您所需要的信任策略拥有一组缺乏安全的限制(即支持账户中所有外部暂存的策略),请用通配符 (
*
) 替换外部 ID 中的random_id
:snowflake_account_SFCRole=snowflake_role_id_*
,例如当前示例中的MYACCOUNT_SFCRole=2_*
。外部 ID 的这种形式允许用户在您账户中创建的任何外部 S3 暂存具有相同的 Snowflake 角色(例如 SYSADMIN),以承担 IAM 角色,反过来也承担 IAM 角色已有权访问的任何 S3 桶。请注意,如果您实施这种缺乏安全性的信任策略类型,则必须将
Condition
从StringEquals
更改为StringLike
。
点击 Update Trust Policy 按钮。
您现在已经完成了一次性设置,可以使用 AWS 角色来访问 S3 桶。
下一步: AWS 数据文件加密