授予跨账户 Amazon S3 存储的权限 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

授予跨账户 Amazon S3 存储的权限

在设置用户访问 Canvas 的 SageMaker 域名或用户配置文件时,您需要为 SageMaker Canvas 项目指定 Amazon S3 存储位置。这些构件包括输入数据集、模型构件、预测和其他应用程序数据的保存副本。您可以使用默认 SageMaker 创建的 Amazon S3 存储桶,也可以自定义存储位置并指定自己的存储桶来存储 Canvas 应用程序数据。

您可以在另一个 Amazon 账户中指定 Amazon S3 存储桶来存储您的 Canvas 数据,但首先必须授予跨账户权限,这样 Canvas 才能访问该存储桶。

以下几节介绍如何向 Canvas 授予通过另一个账户中 Amazon S3 存储桶上传和下载对象的权限。当您的存储桶使用加密时,还有其他权限 Amazon KMS。

要求

在开始之前,请查看以下要求:

  • 跨账户 Amazon S3 存储桶(以及任何关联的 Amazon KMS 密钥)必须与 Canvas 用户域或用户个人资料位于同一个 Amazon 区域。

  • Canvas 存储位置中训练文件夹的最终 Amazon S3 URI 不得超过 128 个字符。最终的 S3 URI 由存储桶路径 s3://<your-bucket-name>/<folder-name>/ 和 Canvas 添加到存储桶的路径组成:Canvas/<user-profile-name>/Training。例如,少于 128 个字符的可接受路径是 s3://<my-bucket>/<machine-learning>/Canvas/<user-1>/Training

跨账户 Amazon S3 存储桶的权限

下一节将概述授予必要权限以便 Canvas 可以在其他账户中访问您的 Amazon S3 存储桶的基本步骤。有关更详细的说明,请参阅《Amazon S3 用户指南》中的示例 2:存储桶拥有者授予跨账户存储桶权限

  1. 在账户 A 中创建 Amazon S3 存储桶 bucketA

  2. Canvas 用户存在于另一个名为账户 B 的账户中。在以下步骤中,我们将 Canvas 用户的 IAM 角色称为账户 B 中的 roleB

    通过附加 IAM 策略,授予账户 B 中的 IAM 角色 roleB 通过账户 A 中的 bucketA 下载 (GetObject) 和上传 (PutObject) 对象的权限。

    要限制对特定存储桶文件夹的访问权限,请在资源元素中定义文件夹名称,例如 arn:aws:s3:::<bucketA>/FolderName/*。有关更多信息,请参阅如何使用 IAM 策略授予特定用户对特定文件夹的访问权限?

    注意

    存储桶级别的操作(例如 GetBucketCorsGetBucketLocation)应添加在存储桶级别的资源上,而不是文件夹上。

    以下示例 IAM 策略授予 roleB 访问 bucketA 中对象所需的权限:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::bucketA/FolderName/*", ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketCors", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::bucketA", ] } ] }
  3. 在账户 A 中配置 bucketA 的存储桶策略,以向账户 B 中的 IAM 角色 roleB 授予权限。

    注意

    管理员还必须关闭存储桶权限部分下的阻止所有公开访问

    下面是 bucketA 的存储桶策略示例,用于向 roleB 授予必要的权限:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::accountB:role/roleB" }, "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::bucketA/FolderName/*" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::accountB:role/roleB" }, "Action": [ "s3:ListBucket", "s3:GetBucketCors", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::bucketA" } ] }

配置上述权限后,账户 B 中的 Canvas 用户配置文件现在可以使用账户 A 中的 Amazon S3 存储桶作为 Canvas 构件的存储位置。

使用加密的跨账户 Amazon S3 存储桶的权限 Amazon KMS

以下过程向您展示如何授予必要的权限,以便 Canvas 可以在另一个使用加密的账户中访问您的 Amazon S3 存储桶 Amazon KMS。相关步骤与上面的过程类似,但需要额外的权限。有关授予跨账户 KMS 密钥访问权限的更多信息,请参阅《Amazon KMS 开发人员指南》中的允许其他账户中的用户使用 KMS 密钥

  1. 在账户 A 中创建亚马逊 S3 存储桶和亚马逊 S3 KMS 密钥 bucketA s3KmsInAccountA

  2. Canvas 用户存在于另一个名为账户 B 的账户中。在以下步骤中,我们将 Canvas 用户的 IAM 角色称为账户 B 中的 roleB

    授予账户 B 中的 IAM 角色 roleB 执行以下操作的权限:

    • 通过账户 A 中的 bucketA 下载 (GetObject) 和上传 (PutObject) 对象。

    • 访问账户 A s3KmsInAccountA 中的 Amazon KMS 密钥。

    以下 IAM 策略示例授予 roleB 访问 bucketA 中对象和使用 KMS 密钥 s3KmsInAccountA 所需的权限:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::bucketA/FolderName/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetBucketCors", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::bucketA" ] }, { "Action": [ "kms:DescribeKey", "kms:CreateGrant", "kms:RetireGrant", "kms:GenerateDataKey", "kms:GenerateDataKeyWithoutPlainText", "kms:Decrypt" ], "Effect": "Allow", "Resource": "arn:aws:kms:{region}:accountA:key/s3KmsInAccountA" } ] }
  3. 在账户 A 中配置 bucketA 的存储桶策略和 s3KmsInAccountA 的密钥策略,以向账户 B 中的 IAM 角色 roleB 授予权限。

    下面是 bucketA 的存储桶策略示例,用于向 roleB 授予必要的权限:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::accountB:role/roleB" }, "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::bucketA/FolderName/*" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::accountB:role/roleB" }, "Action": [ "s3:GetBucketCors", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::bucketA" } ] }

    以下示例是您附加到账户 A 中的 KMS 密钥 s3KmsInAccountA 以授予 roleB 访问权限的密钥策略。有关如何创建和附加密钥策略声明的更多信息,请参阅《Amazon KMS 开发人员指南》中的创建密钥策略

    { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::accountB:role/roleB" ] }, "Action": [ "kms:DescribeKey", "kms:CreateGrant", "kms:RetireGrant", "kms:GenerateDataKey", "kms:GenerateDataKeyWithoutPlainText", "kms:Decrypt" ], "Resource": "*" }

配置上述权限后,账户 B 中的 Canvas 用户个人资料现在可以使用账户 A 中的加密的 Amazon S3 存储桶作为 Canvas 项目的存储位置。