创建 Amazon S3 存储桶 - Amazon Transfer Family
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

创建 Amazon S3 存储桶

Amazon Transfer Family访问您的 Amazon S3 存储桶以处理用户的传输请求,因此在设置启用文件传输协议的服务器时,您需要提供 Amazon S3 存储桶。您可以使用现有存储桶或新建一个存储桶。

注意

您不必使用位于同一Amazon区域的服务器和 Amazon S3 存储桶,但我们建议将其作为最佳实践。

在设置用户时,您为每个用户分配一个 IAM 角色。此角色决定他们对您的 Amazon S3 存储桶的访问级别。

有关创建新存储桶的信息,请参阅如何创建 S3 存储桶? Amazon Simple Services 用户指南中。

注意

您可以使用 Amazon S3 对象锁定在固定的时间段内或无限期地阻止覆盖对象。这与 Transfer Family 的运作方式与其他服务相同。如果对象存在且受保护,则不允许写入或删除该文件。有关 Amazon S3 对象锁定的更多详细信息,请参阅《Amazon S imple Storage Service 用户指南》中的使用 Amazon S3 对象锁定

Amazon S3 访问点

Amazon Transfer Family支持 Amazon S3 接入点,这是 Amazon S3 的一项功能,可让您轻松管理对共享数据集的精细访问。在使用 S3 存储桶名称的任何位置,您都可以使用 S3 接入点别名。您可以在 Amazon S3 中为具有不同权限的用户创建数百个接入点,以访问 Amazon S3 存储桶中的共享数据。

例如,您可以使用接入点允许三个不同的团队访问同一个共享数据集,其中一个团队可以从 S3 读取数据,第二个团队可以向 S3 写入数据,第三个团队可以从 S3 读取、写入和删除数据。要实现如上所述的精细访问控制,您可以创建一个 S3 接入点,其中包含向不同团队提供非对称访问权限的策略。您可以在 Transfer Family 服务器上使用 S3 接入点来实现细粒度的访问控制,而无需创建跨越数百个用例的复杂 S3 存储桶策略。要详细了解如何在 Transfer Family 服务器上使用 S3 接入点,请参阅通过 Amazon S3 增强数据访问控制博客文章。Amazon Transfer Family

注意

Amazon Transfer Family目前不支持 Amazon S3 多区域访问点。

Amazon S3 HeadObject 行为

在 Amazon S3 中,存储桶和对象是主要资源,并且对象存储在存储桶中。Amazon S3 可以模仿分层文件系统,但有时其行为方式可能与典型文件系统不同。例如,在 Amazon S3 中,目录不是一流的概念,而是基于对象密钥。 Amazon Transfer Family通过以下方法推断出目录路径:用正斜杠字符 (/) 拆分对象的密钥,将最后一个元素视为文件名,然后将具有相同前缀的文件名分组到同一路径下。当您使用mkdir或使用 Amazon S3 控制台创建空目录时,会创建零字节对象以表示文件夹的路径。这些物体的密钥以训练正斜线结尾。在 Amazon S3 用户指南Amazon S3 控制台中使用文件夹组织对象中描述了这些零字节对象。

当您运行ls命令时,某些结果是 Amazon S3 零字节对象(这些对象的密钥以正斜杠字符结尾),Transfer Family 会针对每个对象HeadObject发出请求(请参阅 Amazon Simple Storage Service API HeadObject中的详情参考)。在使用 Amazon S3 作为 Transfer Family 的存储时,这可能会导致以下问题。

授予仅写入和列出文件的能力

在某些情况下,客户只希望提供对其 Amazon S3 对象的写入权限。他们希望提供写入/上传和列出存储桶中对象的权限,但不想提供读取/下载的权限。这转化为 Amazon S3 权限PutOjbectListObjectsls以及使用文件传输客户端执行和mkdir命令。但是,当 Transfer Family 需要HeadObject调用写入或列出文件时,它会失败并显示 “访问被拒绝” 错误,因为此调用需要GetObject权限。

在这种情况下,您可以通过添加一个策略条件来授予访问GetObject权限,该条件为任何以/结尾的对象添加权限。这样可以防止GetObject文件无法读取,同时允许用户列出和遍历文件夹。以下示例策略仅提供对其 Amazon S3 存储桶的写入和列出访问权限(将 DOC-EXAMPLE-B UCKET 替换为存储桶的实际名称)。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListing", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET" }, { "Sid": "AllowReadWrite", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetobjectVersion" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] }, { "Sid": "DenyIfNotFolder", "Effect": "Deny", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "NotResource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*/" ] } ] }
注意

此策略不允许向文件附加内容。也就是说,分配了此策略的用户无法打开文件向其添加内容或对其进行修改。此外,如果您的用例涉及在上传文件之前发出HeadObject呼叫,则此政策对您不起作用。

大量零字节对象导致延迟问题

如果您的 Amazon S3 存储桶包含大量此类零字节对象,则 Transfer Family 会发出大量HeadObject调用,这可能会导致处理延迟。

解决此问题的一种可能方法是删除所有零字节对象。请注意以下几点:

  • 空目录将不再存在。目录之所以存在,是因为它们的名称位于对象的密钥中。

  • 不会阻止别人再次打电话mkdir和破坏东西。您可以通过制定阻止创建目录的策略来缓解这种情况。

  • 有些场景会使用这些 0 字节的对象。例如,你有一个像 /inboxes/customer1000 这样的结构,每天都会清理收件箱目录。

另一种可能的解决方案是限制通过策略条件可见的对象数量,以减少HeadObject调用次数。要使这成为一个可行的解决方案,你需要接受你可能只能查看有限的一组子目录。