本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
设置通过VPC终端节点对 Amazon S3 存储桶的私有访问权限
由马丁·马里奇 (AWS)、加布里埃尔·罗德里格斯·加西亚 ()、舒赫拉特·霍贾耶夫 (AWS)、尼古拉斯·雅各布·贝尔 ()、Mohan Gowda Purushotham AWS a () 和华金·里纳多 (AWS) 创作 AWS AWS
摘要
在 Amazon Simple Storage Service (Amazon S3) 中,URLs预签名允许您与目标用户共享任意大小的文件。默认情况下,预签名URLs的 Amazon S3 可以在到期时间窗口内从互联网访问,这使得它们使用起来很方便。但是,企业环境通常要求对预先签名URLs的 Amazon S3 的访问权限仅限于私有网络。
这种模式提供了一种无服务器解决方案,通过使用URLs来自私有网络的预签名与 S3 对象进行安全交互,无需遍历互联网。在该架构中,用户通过内部域名访问 Application Load Balancer。流量通过 Amazon API Gateway 和 S3 存储桶的虚拟私有云 (VPC) 终端节点在内部路由。该 AWS Lambda 函数URLs为通过私有VPC端点下载文件生成预签名,这有助于增强敏感数据的安全性和隐私性。
先决条件和限制
先决条件
包括部署在与公司网络 AWS 账户 相连的子网(例如,通过 AWS Direct Connect)。VPC
限制
S3 存储桶必须与域名同名,因此我们建议您查看 Amazon S3 存储桶命名规则。
此示例架构不包括对已部署基础架构的监控功能。如果您的用例需要监控,请考虑添加AWS 监控服务。
此示例架构不包括输入验证。如果您的用例需要输入验证和更高的安全级别,请考虑使用 AWS WAF 来保护您的API。
此示例架构不包括使用 Application Load Balancer 进行访问日志记录。如果您的用例需要访问日志记录,请考虑启用负载均衡器访问日志。
版本
Python 版本 3.11 或更高版本
Terraform 版本 1.6 或更高版本
架构
目标技术堆栈
目标技术堆栈中使用以下AWS服务:
Amazon S3 是用于安全上传、下载和存储文件的核心存储服务。
Amazon API Gateway 公开了用于与 S3 存储桶交互的资源和终端节点。该服务在生成URLs用于下载或上传数据的预签名中起着作用。
AWS Lambda生成URLs用于从 Amazon S3 下载文件的预签名。Lambda 函数由网关调用。API
Amazon 在中VPC部署资源VPC以提供网络隔离。VPC包括用于控制流量的子网和路由表。
Application Load Balan cer 将传入流量路由到API网关或 S3 存储桶的VPC终端节点。它允许来自公司网络的用户在内部访问资源。
VPCAmazon S3 的终端节点允许在VPC和 Amazon S3 中的资源之间进行直接、私密的通信,而无需通过公共互联网。
AWS Identity and Access Management (IAM) 控制对 AWS 资源的访问权限。权限的设置是为了确保与服务API和其他服务的安全交互。
目标架构

该图阐释了以下内容:
企业网络中的用户可以通过内部域名访问 Application Load Balancer。我们假设公司网络和中的内部网子网之间存在连接 AWS 账户 (例如,通过 AWS Direct Connect 连接)。
Application Load Balancer 将传入流量路由到API网关URLs以生成预签名以下载或上传到 Amazon S3 的数据,或者路由到 S3 存储桶的VPC终端节点。在这两种情况下,请求都是在内部路由的,不需要通过互联网。
API网关公开资源和端点以与 S3 存储桶进行交互。在此示例中,我们提供了一个用于从 S3 存储桶下载文件的终端节点,但也可以对其进行扩展以提供上传功能。
Lambda 函数使用应用程序负载均衡器的域名而不是公有 Amazon S3 域名生成从 Amazon S3 下载文件的预签URL名。
用户收到预签名文件,URL并使用应用程序负载均衡器使用它从 Amazon S3 下载文件。负载均衡器包括一条默认路由,用于将不打算发送的流量发送到 S3 存储桶的VPC终端节点。API
终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. 如果您的用例需要更复杂的授权模型,则可能需要使用不同的访问控制机制。
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
获取 AWS 证书。 | 查看您的 AWS 凭证和您对账户的访问权限。有关说明,请参阅 AWS CLI 文档中的配置和凭据文件设置。 | AWS DevOps,一般 AWS |
克隆存储库。 | 克隆使用以下模式提供的 GitHub 存储库:
| AWS DevOps,一般 AWS |
配置变量。 |
| AWS DevOps,一般 AWS |
部署解决方案。 |
| AWS DevOps,一般 AWS |
任务 | 描述 | 所需技能 |
---|---|---|
创建测试文件。 | 将文件上传到 Amazon S3,为文件下载创建测试方案。您可以使用 Amazon S3 控制台
| AWS DevOps,一般 AWS |
测试预签名URL功能。 |
| AWS DevOps,一般 AWS |
清理。 | 当不再需要资源时,请务必将其删除:
| AWS DevOps,一般 AWS |
故障排除
事务 | 解决方案 |
---|---|
带有特殊字符(例如数字符号 (#))的 S3 对象密钥名称会破坏URL参数并导致错误。 | 正确编码URL参数,并确保 S3 对象密钥名称符合 Amazon S3 指南。 |
相关资源
亚马逊 S3:
亚马逊API网关:
Application 负载均衡器: