使用与静态 IP 地址关联的终端节点整合 Amazon S3 预签名 URL 生成和对象下载 - AWS Prescriptive Guidance

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

使用与静态 IP 地址关联的终端节点整合 Amazon S3 预签名 URL 生成和对象下载

Amazon Web Services 的 Song Jin、Eunhye Jo 和 Jun Soung Lee

摘要

此模式通过创建安全的自定义对象下载 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 服务。有关特定终端节点,请参阅服务终端节点和配额,然后选择服务的链接。

架构

下图显示了此模式的目标架构和工作流程。

用于生成预签名 URL 和下载对象的组件和工作流程。

该图说明了以下概念和工作流程:

  1. 用户使用提供的自定义终端节点、自定义域名和关联的 IP 地址 AWS Global Accelerator,发起生成预签名 URL 的请求。

  2. Lambda 函数生成指向自定义终端节点的预签名 URL。它以 301 重定向进行响应,其中包含生成的预签名 URL。通过重定向的预签名 URL,用户使用通过 Global Accelerator 提供的自定义端点自动下载对象。

预签名 URL 生成和对象下载工作流程的整体架构组成部分如下:

  • 由全球加速器配置静态 IP 地址。

  • 使用自定义域名将加速器的别名作为 A 记录注册到 Amazon Route 53 公共托管区域。

  • 使用与注册的自定义域名匹配的存储桶名称创建 Amazon S3 存储桶。

  • 为 API Gateway 和 Amazon S3 服务创建 VPC 终端节点。

  • 配置面向内部的 Application Load Balancer 以连接到全球加速器。

  • 为附有 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 Cloud 基础架构。

  • 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 来部署此模式。Epics 部分包含两种部署方法的说明。此模式的代码可在以下 GitHub 存储库中找到:

最佳实践

  • 为了增强生产环境的安全性,实施授权机制(例如 Amazon Cognito)来限制对PresignedUrl生成 API 的访问至关重要。

  • 遵循最低权限原则,授予执行任务所需的最低权限。有关更多信息,请参阅 IAM 文档中的授予最低权限安全最佳实践

操作说明

Task描述所需技能

决定域名。

决定统一 Amazon S3 终端节点的公共域名。该域名还用作 Amazon S3 存储桶名称。

AWS 管理员、网络管理员

创建公有托管区域。

在 Amazon Route 53 中@@ 创建公共托管区域。其域名必须与 API Gateway 中使用的域名相匹配。

AWS 管理员、网络管理员

准备一个 SSL 证书。

使用 AWS Certificate Manager (ACM) 为您的 Web 应用程序域请求导入 SSL 证书。

AWS 管理员、网络管理员
Task描述所需技能

设置 Terraform 开发环境。

要设置开发环境,请执行以下操作:

  1. 安装 Terraform 版本 1.0 或更高版本。

  2. 通过在终端窗口中运行以下命令来克隆 s GitHub 3-presignedurl-staticips-endpoint-with-terraform 存储库:

    git clone https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-terraform.git

AWS 管理员、云管理员

修改.tfvarsprovider.tf文件。

  1. 创建所需的.tfvars文件-1.vpc_alb_ga2.apigw_s3_lambda目录中创建apg.tfvars文件。这些文件将包含您的环境特定变量值。

    • 对于1.vpc_alb_ga/apg.tfvars,使用以下模板创建文件:

      hcl environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
    • 对于2.apigw_s3_lambda/apg.tfvars,使用以下模板创建文件(您需要vpc_id在完成步骤 1 后进行更新):

      hcl vpc_id = "vpc-xxxxxxxxx" # Update this with the VPC ID output from step 1 environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
  2. 修改provider.tf文件 -1.vpc_alb_ga2.apigw_s3_lambda文件夹中,编辑provider.tf文件以匹配您的本地 AWS 配置:

    hcl provider "aws" { region = "ap-northeast-2" # Change to your preferred region profile = "apg" # Change to your AWS profile name }

请注意以下几点:

  • .tfvars文件中的占位符值替换为实际值。

  • 完成第一个 Terraform 部署 (1.vpc_alb_ga) 后,2.apigw_s3_lambda/apg.tfvars使用vpc_id输出中的 VPC ID 更新中的值。

  • 确保文件中的个人 AWS 资料名称与provider.tf文件中的现有个人资料相匹配。~/.aws/credentials

  • 域值应与您的 Route 53 托管区域域相匹配。

  • 与域名s3_bucket_prefix组合后将构成您的 Amazon S3 存储桶名称(例如,your-bucket-prefix.your-domain.com)。

  • 如果您进行了更改aws_region,则可能还需要更新main.tf文件中硬编码的可用区以匹配您选择 AWS 区域的可用区。

AWS 管理员、云管理员

配置网络资源。

要配置网络资源,请运行以下命令:

cd ./2.vpc_alb_ga terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars

apply 命令执行过程中,出现提示时键入 yes

AWS 管理员、云管理员

配置 API Gateway、Amazon S3 和 Lambda。

要配置网络资源,请使用以下命令:

cd ./2.apigw_s3_lambda terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars
AWS 管理员、云管理员
Task描述所需技能

设置 AWS CDK 开发环境。

要设置开发环境,请执行以下操作:

  1. 安装 AWS CDK。

  2. 在终端窗口中运行以下命令来presignedurl-staticips-endpoint-with克隆 s GitHub 3--cdk 存储库:

    git clone https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-cdk.git

AWS 管理员、云管理员

config/index.ts文件中配置域设置。

要编辑常量变量的选项,请使用以下命令:

export const options = { certificateArn: '{arn of the acm which created before}', dnsAttr: { zoneName: '{public hosted zone name}', hostedZoneId: 'hosted zone Id', }, domainNamePrefix: '{Prefix for the domain}', presignPath: 'presign', objectsPath: 'objects', };

在命令中,用您自己的信息替换每个占位符:

  • '{arn of the acm which created before}'用您的 ACM 证书替换亚马逊资源名称 (ARN)。

  • '{public hosted zone name}'用您的域名替换。

  • 'hosted zone Id'替换为您的 Route 53 托管区域 ID。

  • '{Prefix for the domain}'替换为您要使用的域名前缀。

  • (可选)根据您的特定用例的需要修改'presign''objects'路径。

AWS 管理员、云管理员

部署堆栈。

要部署两个堆栈,一个用于虚拟私有云 (VPC),另一个用于应用程序,请使用以下命令:

$ npm install $ cdk synth $ cdk deploy --all
AWS 管理员、云管理员
Task描述所需技能

验证端点的 IP 地址。

要验证此模式的域是否具有静态 IP 地址,请使用以下命令:

nslookup ${s3-bucket-prefix}.${domain}
网络管理员

上传测试文件,您可以稍后下载该文件。

将测试文件上传到 Amazon S3 存储桶中的'/objects'文件夹。

AWS 管理员、云管理员

调用 API 生成预签名网址。

要生成预签名网址,请使用以下格式从浏览器或 API 客户端(例如 Postman)调用该网址:

https://${s3-bucket-prefix}.${domain}/presign/objects/${uploaded-filename}

${s3-bucket-prefix}${domain}中的占位符值替换为您在前面的步骤中设置的值。

应用程序所有者

检查结果。

预期的结果是,您应该会收到 301(永久移动)重定向状态码。此响应将包含预签名 URL,该网址应自动启动您的测试文件的下载。

测试工程师
Task描述所需技能

销毁 API Gateway、亚马逊 S3 和 Lambda 资源。

要删除资源,请使用以下命令:

cd ./2.apigw_s3_lambda terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
AWS 管理员、云管理员

销毁网络资源。

要删除网络资源,请使用以下命令:

cd ./1.vpc_alb_ga terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
AWS 管理员、云管理员
Task描述所需技能

摧毁堆栈。

要销毁 VPC 和应用程序堆栈,请使用以下命令:

$ cdk destroy --all
AWS 管理员、云管理员

清空并删除 Amazon S3 存储桶。

清空删除默认情况下未删除的对象 Amazon S3 存储桶和日志 Amazon S3 存储桶。

Amazon S3 存储桶名称为${s3-bucket-prefix}.${domain}${s3-bucket-prefix}.${domain}-logs

如果您更喜欢使用 AWS Command Line Interface (AWS CLI) 来删除存储桶,请使用以下命令:

$ aws s3 rm s3://${s3-bucket-prefix}.${domain} --recursive $ aws s3 rb s3://${s3-bucket-prefix}.${domain} --force $ aws s3 rm s3://${s3-bucket-prefix}.${domain}-logs --recursive $ aws s3 rb s3://${s3-bucket-prefix}.${domain}-logs --force

${domain}用您在之前的步骤中设置的值替换${s3-bucket-prefix}和。 ,/p>

AWS 管理员、云管理员

相关资源

AWS 博客