Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何使用 Amazon S3 托管使用 API Gateway 作为代理的静态网站?
我想使用 Amazon API Gateway 创建 API 作为我的静态网站的代理。然后,我想在 Amazon Simple Storage Service (Amazon S3) 上托管该网站。
解决方法
要使用 Amazon S3 托管以 API Gateway 作为代理的静态网站,请使用 HTTP 集成或 AWS 服务集成。
使用 HTTP 集成
如果您的静态网站可公开访问,请使用 HTTP 集成并为 API 提供 Amazon S3 静态网站 URL。
在 Amazon S3 上配置静态网站。接下来,使用 API Gateway 控制台为根资源创建 REST API 和方法,然后部署 REST API。
创建 REST API
完成以下步骤:
- 打开 API Gateway 控制台。
- 选择 Create API(创建 API)。
- 在 REST API 下,选择 Build(构建)。
- 对于 API name(API 名称),输入您的 REST API 的名称。
- 从 API endpoint type(API 端点类型)下拉列表中,选择您的端点类型,然后选择 Create API(创建 API)。
- 在导航窗格中,从 API 下方选择 Resources(资源)。
- 选择 Create resource(创建资源)。
- 对于 Resource path(资源路径),保留为 /。
- 对于 Resource name(资源名称),输入一个名称。例如 key。
- 选择 Create resource(创建资源)。
为根资源创建方法
完成以下步骤:
- 在 Resources(资源)下,选择您创建的资源。例如 /key。
- 在 Methods(方法)下,选择 Create method(创建方法)。
- 从 Method type(方法类型)下拉列表中,选择 GET。
- 对于 Integration type(集成类型),选择 HTTP。
- 选择 HTTP 代理集成。
- 从 HTTP method(HTTP 方法)下拉列表中,选择 GET。
- 对于 Endpoint URL(端点 URL),输入 http://BUCKET_NAME.s3-website.REGION.amazonaws.com/key。<br id=hardline_break/> **注意:**请将 BUCKET_NAME 替换为您的存储桶名称,将 REGION 替换为存储桶所在区域,并将 key 替换为您的资源名称。
- 选择 Create method(创建方法)。
部署 REST API
完成以下步骤:
- 选择 Deploy API(部署 API)。
- 从 Stage(阶段)下拉列表中,选择 *New Stage*。
- 对于 Stage name(阶段名称),输入一个名称。例如,STAGE_NAME。
- 选择 Deploy(部署)。
- 在 Stage details(阶段详细信息)下,记下用于测试 API 的调用 URL。
- 要测试您的 S3 网站的 API 代理,请运行以下 curl 命令:
**注意:**请将 API_ID 替换为您的 API ID,将 REGION 替换为您的区域,并将 STAGE_NAME 替换为您的阶段名称。curl -X GET https://API_ID.execute-api.REGION.amazonaws.com/STAGE_NAME/index.html
使用 AWS 服务集成
配置 S3 静态网站
如果 S3 静态网站被禁止公开访问,请配置该网站,以便仅通过 API 代理进行访问。
完成以下步骤:
- 在 Amazon S3 上配置静态网站。<br id=hardline_break/> 注意:配置静态网站时,请跳过步骤 3: 编辑屏蔽公共访问权限设置部分。保持默认的 Block all public access(屏蔽所有公共访问权限)设置为启用状态。
- 修改存储桶策略以使存储桶内容可公开访问,仅允许 API 代理访问 S3 存储桶。存储桶策略示例:
**注意:**请将 BUCKET_NAME 替换为您的存储桶名称,将 REGION 替换为您的区域,将 ACCOUNT_ID 替换为您的 AWS 账户 ID,并将 API_ID 替换为您的 API ID。{ "Version": "2012-10-17", "Statement": [{ "Sid": "APIProxyBucketPolicy", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::BUCKET_NAME/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:execute-api:REGION:ACCOUNT_ID:API_ID/*/GET/" } } }] } - 创建 AWS Identity and Access Management (IAM) 策略,允许 GetObject API 访问 S3 存储桶。IAM 策略示例:
**注意:**请将 BUCKET_NAME 替换为您的存储桶名称。{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": [ "arn:aws:s3:::BUCKET_NAME/*" ] }] } - 创建 IAM 角色,然后附加上述 IAM 策略。
- 记下 IAM 角色的 Amazon 资源名称 (ARN)。<br id=hardline_break/>
**注意:**IAM 角色必须包含以下信任策略,API Gateway 才能代入该角色:
{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRole" }] }
为 S3 服务创建 REST API 代理
完成以下步骤:
- 打开 API Gateway 控制台。
- 选择 Create API(创建 API)。
- 对于 REST API,选择 Build(构建)。
- 对于 API name(API 名称),输入您的 REST API 的名称。
- 从 API endpoint type(API 端点类型)下拉列表中,根据大多数客户端流量的来源选择端点类型。<br id=hardline_break/> **注意:对于客户端流量从互联网访问的公共服务,**最佳做法是使用边缘优化端点。如果您的客户端流量仅从同一 AWS 区域内访问您的 API,则使用区域端点。
- 选择 Create API(创建 API)。
为根资源创建 GET 方法
完成以下步骤:
- 选择根资源 /。
- 选择 Create method(创建方法)。
- 从 Method type(方法类型)下拉列表中,选择 GET。
- 对于 Integration type(集成类型),选择 AWS service(AWS 服务)。
- 从 AWS Region(AWS 区域)下拉列表中,选择您的区域。
- 从 AWS service(AWS 服务)下拉列表中,选择 Simple Storage Service (S3)。
- 对于 AWS Subdomain(AWS 子域),请将该字段留空。
- 从 HTTP method(HTTP 方法)下拉列表中,选择 GET。
- 对于 Action type(操作类型),选择 Use path override(使用路径覆盖)。
- 对于 Path override(路径覆盖),输入您的 S3 存储桶路径。例如,BUCKET_NAME/index.html。
- 对于 Execution role(执行角色),输入 IAM 角色的 ARN。
- 选择 Create method(创建方法)。
**注意:**此设置可将前端 API 请求 GET https://your-api-host/stage/ 集成到 S3 后端 GET https://your-s3-host/index.html。
创建 API 资源对象
完成以下步骤:
- 选择 Create resource(创建资源)。
- 对于 Resource Path(资源路径),保留为 /。
- 对于 Resource name(资源名称),输入一个名称。例如 object。
- 选择 Create resource(创建资源)。
为资源配置 GET 方法
完成以下步骤:
- 在 Resources(资源)下,选择您创建的资源。例如 /object。
- 完成为根资源创建 GET 方法部分中的步骤 2-12。
- 选择 GET,然后选择 Integration request(集成请求)。<br id=hardline_break/> **注意:**请将 object 替换为您的资源名称。
- 选择 Edit(编辑)。
- 展开 URL path parameters(URL 路径参数),然后选择 Add path parameter(添加路径参数)。
- 在 Name(名称)下,输入您的资源名称。
- 在 Mapped from(映射自)下,将值输入为 method.request.path.object。<br id=hardline_break/> **注意:**请将 object 替换为您的资源名称。
- 选择 Save(保存)。
为 GET 方法设置响应标头映射
您必须将后端内容类型标头参数值映射到前端对应项,以便浏览器可以处理内容类型的响应。
完成以下步骤:
- 在 Resources(资源)下,选择 /。
- 选择 GET,然后选择 Method response(方法响应)。
- 在 Response 200(响应 200)下,选择 Edit(编辑)。
- 在 Header name(标头名称)下,选择 Add header(添加标头)。
- 将 Name(名称)设置为 Content-Type。
- 选择 Save(保存)。
- 选择 Integration response(集成响应),然后选择 Edit(编辑)。
- 在 Header mappings(标头映射)下的 Content-Type 旁边,将 Mapping value(映射值)输入为 integration.response.header.Content-Type。
- 对 /object 资源下的 GET 方法重复步骤 2-8。<br id=hardline_break/> **注意:**请将 object 替换为您的资源名称。
部署 REST API
完成以下步骤:
- 选择 Deploy API(部署 API)。
- 从 Stage(阶段)下拉列表中,选择 *New Stage*。
- 对于 Stage name(阶段名称),输入一个名称。例如,STAGE_NAME。
- 选择 Deploy(部署)。
- 在 Stage details(阶段详细信息)下,记下用于测试 API 的调用 URL。
要测试您的 S3 静态网站的 API 代理,请运行 curl 命令。
**注意:**对于以下示例,请将 API_ID 替换为您的 API ID,将 REGION 替换为您的区域,并将 STAGE_NAME 替换为您的阶段名称。
要测试根资源,请运行以下 curl 命令:
curl -X GET https://API_ID.execute-api.REGION.amazonaws.com/STAGE_NAME/
要测试对象资源,请运行以下 curl 命令:
curl -X GET https://API_ID.execute-api.REGION.amazonaws.com/STAGE_NAME/home.html

