本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
通过 VPC 端点设置对 Amazon S3 存储桶的私有访问权限
Martin Maritsch、Nicolas Jacob Baer、Gabriel Rodriguez Garcia、Shukhrat Khodjaev、Mohan Gowda Purushothama 和 Joaquin Rinaudo,Amazon Web Services
Summary
在 Amazon Simple Storage Service (Amazon S3) 中, URLs 预签名允许您与目标用户共享任意大小的文件。默认情况下,预签名 URLs 的 Amazon S3 可以在到期时间窗口内从互联网访问,这使得它们使用起来很方便。但是,企业环境通常要求对预先签名 URLs 的 Amazon S3 的访问权限仅限于私有网络。
这种模式提供了一种无服务器解决方案,通过使用 URLs 来自私有网络的预签名与 S3 对象进行安全交互,无需遍历互联网。在该架构中,用户通过内部域名访问应用程序负载均衡器。流量通过 Amazon API Gateway 和 S3 存储桶的虚拟私有云(VPC)端点在内部路由。该 AWS Lambda 函数生成预签名, URLs 以便通过私有 VPC 端点下载文件,这有助于增强敏感数据的安全和隐私。
先决条件和限制
先决条件
一个 VPC,包括部署在与公司网络相连的子网(例如,通过 AWS Direct Connect)。 AWS 账户
限制
S3 存储桶的名称必须与域名保持一致,因此建议您查阅 Amazon S3 存储桶命名规则。
此示例架构不包括对已部署基础设施的监控功能。如果您的使用案例需要监控,请考虑添加 AWS 监控服务。
此示例架构不包括输入验证。如果您的用例需要输入验证并提高安全级别,请考虑使用 AWS WAF 来保护您的 API。
此示例架构不包括应用程序负载均衡器的访问日志记录功能。如果您的使用案例需要访问日志记录,请考虑启用负载均衡器访问日志。
版本
Python 版本 3.11 或更高版本
Terraform 版本 1.6 或更高版本
架构
目标技术堆栈
目标技术堆栈中使用以下 AWS 服务:
Amazon S3 是用于安全地上传、下载和存储文件的核心存储服务。
Amazon API Gateway 公开用于与 S3 存储桶交互的资源和端点。该服务在生成 URLs 用于下载或上传数据的预签名中起着作用。
AWS Lambda生成 URLs 用于从 Amazon S3 下载文件的预签名。通过 API Gateway 调用 Lambda 函数。
Amazon VPC 在 VPC 内部部署资源,以实现网络隔离。VPC 包括用于控制流量的子网和路由表。
应用程序负载均衡器将传入流量路由到 API Gateway 或 S3 存储桶的 VPC 端点。它允许企业网络中的用户在内部访问资源。
Amazon S3 的 VPC 端点在 VPC 和 Amazon S3 中的资源之间实现直接的私有通信,而无需遍历公共互联网。
AWS Identity and Access Management (IAM) 控制对 AWS 资源的访问权限。设置权限旨在确保与 API 及其他服务进行安全的交互。
目标架构

下图说明了以下内容:
企业网络中的用户可通过内部域名访问应用程序负载均衡器。我们假设公司网络和中的内部网子网之间存在连接 AWS 账户 (例如,通过 Direct Connect 连接)。
Application Load Balancer 将传入流量路由到 API Gateway URLs 以生成预签名以下载或上传到 Amazon S3 的数据,或者路由到 S3 存储桶的 VPC 终端节点。在这两种情况下,请求均在内部进行路由,无需遍历互联网。
API Gateway 公开用于与 S3 存储桶交互的资源和端点。在此示例中,我们提供了一个用于从 S3 存储桶下载文件的端点,但也可以对其进行扩展以提供上传功能。
Lambda 函数生成用于从 Amazon S3 下载文件的预签名 URL 时,使用的是应用程序负载均衡器的域名,而非 Amazon S3 的公有域名。
用户收到预签名 URL 后,使用该 URL 通过应用程序负载均衡器从 Amazon S3 下载文件。负载均衡器包含默认路由,用于将非 API 目标的流量发送至 S3 存储桶的 VPC 端点。
VPC 端点将带有自定义域名的预签名 URL 路由到 S3 存储桶。S3 存储桶的名称必须与该域名保持一致。
自动化和扩展
此模式使用 Terraform 将基础设施从代码库部署到 AWS 账户。
工具
工具
Python
是通用的计算机编程语言。 Terraform
是一款基础设施即代码 (IaC) 工具 HashiCorp ,可帮助您创建和管理云和本地资源。 AWS Command Line Interface (AWS CLI) 是一个开源工具,可帮助您通过命令行 shell 中的命令与 AWS 服务进行交互。
代码存储库
此模式的代码可在 private https://github.com/aws-samples/-s
最佳实践
此模式的示例架构使用 IAM 权限来控制对 API 的访问。任何拥有有效 IAM 凭证的用户都可以调用该 API。如果您的使用案例需要更复杂的授权模型,可考虑使用其他访问控制机制。
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
获取 AWS 凭证。 | 查看您的 AWS 凭证和您对账户的访问权限。有关说明,请参阅 AWS CLI 文档中的配置和凭据文件设置。 | AWS DevOps,通用 AWS |
克隆存储库。 | 克隆使用以下模式提供的 GitHub 存储库:
| AWS DevOps,通用 AWS |
配置变量。 |
| AWS DevOps,通用 AWS |
部署解决方案。 |
| AWS DevOps,通用 AWS |
| Task | 说明 | 所需技能 |
|---|---|---|
创建测试文件。 | 向 Amazon S3 上传一个文件,为文件下载场景创建测试方案。您可以使用 Amazon S3 控制台
| AWS DevOps,通用 AWS |
测试预签名 URL 功能。 |
| AWS DevOps,通用 AWS |
清理。 | 当不再需要资源时,请务必将其移除:
| AWS DevOps,通用 AWS |
问题排查
| 问题 | 解决方案 |
|---|---|
包含井号(#)等特殊字符的 S3 对象键名会破坏 URL 参数结构并导致错误 | 对 URL 参数进行正确编码,确保 S3 对象键名符合 Amazon S3 指南。 |
相关资源
Amazon S3:
Amazon API Gateway:
应用程序负载均衡器: