本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用与静态 IP 地址关联的端点整合 Amazon S3 预签名 URL 生成和对象下载
Song Jin、Eunhye Jo 和 Jun Soung Lee,Amazon Web Services
Summary
此模式通过创建安全的自定义对象下载 URLs 预签名,简化了对亚马逊简单存储服务 (Amazon S3) Simple Service 的访问。该解决方案提高了一个具有唯一域和静态 IP 地址的单个端点。如果客户需要将 API 和 Amazon S3 端点整合到具有静态 IP 地址的统一域,则该解决方案就非常合适。在该使用案例中,用户需要遵守 IP 和域允许列表防火墙策略,即限制 API 访问权限仅限于特定的域和 IP 地址。
该架构采用密钥 AWS 服务,包括 AWS Global Accelerator Amazon API Gateway AWS Lambda、Application Load Balancer 和 Amazon S3。 AWS PrivateLink此设计将用于生成预签名的 API URLs 和 Amazon S3 终端节点集中到一个域下,该域链接到具有两个静态 IP 地址的加速器。因此,用户可以通过具有静态 IP 地址的统一域终端节点毫不费力地请求 URLs 和下载 Amazon S3 对象。
此架构特别适合具有严格策略或合规要求的客户,例如公共、医疗和金融领域的客户。
先决条件和限制
先决条件
活跃的 AWS 账户
您的自定义域名的公有托管区
在您选择的 AWS Certificate Manager (ACM) 中导入 AWS 区域 的域名
限制
Amazon S3 存储桶名称必须与端点的域名匹配。这一要求是为了确保可以通过单个 API 端点为 Amazon S3 端点提供服务。
API Gateway 中使用的自定义域名应与单个 API 端点的域名保持一致。
有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅按区域划分的AWS 服务
。有关特定端点,请参阅服务端点和配额,然后选择相应服务的链接。
架构
下图显示了此模式的目标架构和工作流。

该图阐释了以下概念和工作流:
用户使用提供的自定义终端节点、自定义域名和关联的 IP 地址 AWS Global Accelerator,发起生成预签名 URL 的请求。
Lambda 函数生成指向自定义端点的预签名 URL。它使用 301 重定向进行响应,其中包含生成的预签名 URL。通过重定向的预签名 URL,用户可以使用通过 Global Accelerator 提供的自定义端点,进而自动下载对象。
预签名 URL 生成和对象下载工作流的整体架构组件如下所示:
由 Global Accelerator 预调配的静态 IP 地址。
使用自定义域,将加速器以 A 记录为别名注册到 Amazon Route 53 公有托管区中。
创建一个 Amazon S3 存储桶,且该存储桶的名称与注册的自定义域名匹配。
为 API Gateway 和 Amazon S3 服务创建 VPC 端点。
配置面向内部的应用程序负载均衡器,以连接到 Global Accelerator。
为附有 ACM 证书的 API Gateway 分配自定义域名。
部署与 Lambda 函数集成的私有 API Gateway。
Lambda 函数配备了一个附加的 AWS Identity and Access Management (IAM) 角色(具有GetObject权限)。
工具
AWS 服务
Amazon API Gateway 可帮助您创建、发布、维护、监控和保护任何规模的 RES WebSocket APIs T、HTTP。
应用程序负载均衡器将传入的应用程序流量分配到多个可用区域中的多个目标,例如亚马逊弹性计算云 (Amazon EC2) 实例。
AWS Certificate Manager (ACM) 可帮助您创建、存储和续订 X.509 公有和私有 SSL/TLS X.509 证书和密钥,以保护您的 AWS 网站和应用程序。
AWS Cloud Development Kit (AWS CDK)是一个软件开发框架,可帮助您在代码中定义和配置 AWS 云 基础架构。
AWS Global Accelerator 是一项全球服务,可支持多个 AWS 区域中的端点。您可以创建加速器,通过 AWS 全球网络将流量引导到最佳端点。这可提高全球受众使用的 Internet 应用程序的可用性和性能。
AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用 AWS 资源,从而帮助您安全地管理对资源的访问权限。
AWS Lambda 是一项计算服务,可帮助您运行代码,无需预调配或管理服务器。它只在需要时运行您的代码,并自动进行扩展,因此您只需为使用的计算时间付费。
AWS PrivateLink帮助您创建从您的虚拟私有云 (VPCs) 到 VPC 外部服务的单向私有连接。
Amazon Route 53 是一种可用性高、可扩展性强的 DNS Web 服务。
Amazon Simple Storage Service(Amazon S3)是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。
其他工具
Terraform
是一款基础设施即代码 (IaC) 工具 HashiCorp ,可帮助您创建和管理云和本地资源。
代码存储库
您可以根据自己的喜好使用 AWS CDK 或 Terraform 来部署此模式。操作说明部分包含两种部署方法的说明。此模式的代码可在以下 GitHub 存储库中找到:
Terraform — s3
-terraform presignedurl-staticips-endpoint-with
最佳实践
为了增强生产环境的安全性,务必要实施授权机制(例如 Amazon Cognito),以限制对
PresignedUrl生成 API 的访问。
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
设置 Terraform 开发环境。 | 要设置开发环境,请执行以下操作:
| AWS 管理员、云管理员 |
修改 |
请注意以下几点:
| AWS 管理员、云管理员 |
预调配网络资源。 | 要预调配网络资源,请运行以下命令:
在 | AWS 管理员、云管理员 |
预调配 API Gateway、Amazon S3 和 Lambda。 | 要预调配网络资源,请使用以下命令:
| AWS 管理员、云管理员 |
| Task | 说明 | 所需技能 |
|---|---|---|
设置 AWS CDK 开发环境。 | 要设置开发环境,请执行以下操作:
| AWS 管理员、云管理员 |
在 | 要编辑常量变量的选项,请使用以下命令:
在以下命令中,将每个占位符替换为您自己的信息:
| AWS 管理员、云管理员 |
部署堆栈。 | 要部署两个堆栈,一个用于虚拟私有云(VPC),另一个用于应用程序,请使用以下命令:
| AWS 管理员、云管理员 |
| Task | 说明 | 所需技能 |
|---|---|---|
验证端点的 IP 地址。 | 要验证此模式的域是否具有静态 IP 地址,请使用以下命令:
| 网络管理员 |
上传测试文件,且之后您可下载该文件。 | 将测试文件上传到 Amazon S3 存储桶中的 | AWS 管理员、云管理员 |
调用 API 以生成预签名 URL。 | 要生成预签名 URL,请采用以下格式,从浏览器或 API 客户端(例如 Postman
将 | 应用程序所有者 |
检查结果。 | 预期结果是,您应该会收到 301(永久移动)重定向状态码。此响应将包含预签名 URL,而 URL 应会自动启动测试文件的下载。 | 测试工程师 |
| Task | 说明 | 所需技能 |
|---|---|---|
销毁 API Gateway、Amazon S3 和 Lambda 资源。 | 要删除资源,请使用以下命令:
| AWS 管理员、云管理员 |
销毁网络资源。 | 要删除网络资源,请使用以下命令:
| AWS 管理员、云管理员 |
| Task | 说明 | 所需技能 |
|---|---|---|
部署堆栈。 | 要销毁 VPC 和应用程序堆栈,请使用以下命令:
| AWS 管理员、云管理员 |
清空和删除 Amazon S3 存储桶。 | 清空和删除默认情况下不会删除的对象 Amazon S3 存储桶和日志 Amazon S3 存储桶。 Amazon S3 存储桶名称为 如果您偏好使用 AWS Command Line Interface (AWS CLI)来删除存储桶,请使用以下命令:
将 | AWS 管理员、云管理员 |
相关资源
AWS 博客