如何通过 API Gateway 将镜像文件上传到 Amazon S3?

上次更新时间:2021 年 6 月 1 日

我想通过 Amazon API Gateway 将一个镜像文件上传到 Amazon Simple Storage Service(Amazon S3)。

简短描述

要使用 API Gateway 将二进制文件(镜像)上传到 S3 存储桶,您必须为 API Gateway API 启用二进制支持。要允许 API 访问 S3 存储桶,您必须创建一个AWS Identity and Access Management(IAM)角色。该 IAM 角色必须具有可让 API Gateway 在您的 S3 存储桶上执行 PUT 操作的权限。

解决方法

为 API Gateway 创建一个 IAM 角色

  1. 打开 IAM 控制台
  2. 在导航窗格中,选择 Roles(角色)。
  3. 选择 Create role(创建角色)。
  4. Select type of trusted entity(选择可信实体类型)部分,选择 AWS service(AWS 服务)。
  5. Choose a use case(选择一个使用案例)部分),选择 API Gateway
  6. Select your use case(选择您的使用案例)部分),选择 API Gateway
  7. 选择 Next: Permissions(下一步:权限)。
    注意:这一部分会显示允许 API Gateway 将日志推送到用户账户的 AWS 托管服务。稍后您将为 S3 添加权限。现在选择 Next: Tags(下一步:标签)。
  8. 添加标签(可选),然后选择 Next: Review(下一步:检查)。
  9. 对于 Role name(角色名称),为您的角色输入一个名称。例如:api-gateway-upload-to-s3
  10. 选择 Create role(创建角色)。

创建一个 IAM 策略并将其附加到该 API Gateway 角色

  1. 打开 IAM 控制台
  2. 在导航窗格中,选择 Roles(角色)。
  3. 在搜索框中,输入您创建的新 API Gateway 角色的名称。然后从 Role name(角色名称)列中选中该角色 。
  4. Permissions(权限)选项卡中,选择 Attach policies(附加策略)。
  5. 选择 Create policy(创建策略)。
  6. Visual editor(可视化编辑器)选项卡的 Select a service(选择服务)部分,选择 Choose a service(选择服务)。
  7. 输入 S3,然后选择 S3
  8. Specify the actions allowed in S3(指定 S3 中允许的操作)框中,输入 PutObject,然后选择 PutObject
  9. 展开 Resources(资源),然后选择 Specific(特定)。
  10. 选择 Add ARN(添加 ARN)。
  11. 对于 Bucket name(存储桶名称),输入存储桶的名称。如果适用,请包括前缀。
  12. 对于 Object name(对象名称),输入对象的名称。
    注意:存储桶名称指定了上传文件的位置。对象名称指定了对象(即文件名)为了符合策略而必须遵循的模式。
  13. 选择 Add(添加)。
  14. 选择 Next: Tags(下一步:标签)并添加标签(可选),然后选择 Next: Review(下一步:检查)。
  15. 对于 Name(名称),输入策略的名称。
  16. 选择 Create policy(创建策略)。
  17. 在策略搜索栏中,输入您刚刚创建的策略的名称,然后选择该策略。
  18. 选择 Policy actions(策略操作),然后选择 Attach(附加)。
  19. 在导航窗格中,选择 Roles(角色)。
  20. 搜索然后选择您之前创建的 API Gateway 角色。
  21. 选择 Policy actions(策略操作),然后选择 Attach(附加)。
    注意:策略权限允许 API Gateway 通过 PutObject API 调用将对象上传到存储桶。

创建 API Gateway API

创建一个 API 来服务您的请求:

  1. 打开 API Gateway 控制台
  2. 从导航窗格中,选择 APIs(API)。
  3. 选择 Create API(创建 API)。
  4. Choose an API type(选择 API 类型)部分,对于 REST API 选择 Build(构建)。
  5. 对于 API Name(API 名称),输入 API 的名称,然后选择 Next(下一步)。
  6. 选择 Create API(创建 API)。

为您的 API 创建资源:

  1. 在 API 页面的 Resources(资源)面板上,选择 /
  2. 对于 Actions(操作),选择 Create Resource(创建资源)。
  3. 对于 Resource Name(资源名称),输入 folder
  4. 对于 Resource Path(资源路径),输入 {folder}
  5. 选择 Create Resource(创建资源)。
  6. Resources 面板上,选择您刚刚创建的 /{folder} 资源。
  7. 选择 Actions(操作),然后选择 Create Resource(创建资源)。
  8. 对于 Resource Name(资源名称),输入 object
  9. 对于 Resource Path(资源路径),输入 {object}
  10. 选择 Create Resource(创建资源)。

为您的 API 设置 PUT 方法:

  1. 在 API 页面的 Resources(资源)面板上,选择 /{object}
  2. 选择 Actions(操作),然后选择 Create Method(创建方法)。
  3. 从下拉菜单中,选择 PUT,然后选择勾号图标。
  4. 对于 Integration type(集成类型),选择 AWS Service(AWS 服务)。
  5. 对于 AWS Region(AWS 区域),选择 us-west-2
  6. 对于AWS Service(AWS 服务),选择 Simple Storage Service (S3)
  7. AWS Subdomain(AWS 子域)留空。
  8. 对于 HTTP method(HTTP 方法),选择 PUT
  9. 对于 Action Type(操作类型),选择 Use path override(使用路径覆盖)。
  10. 对于 Path override (optional)(路径覆盖(可选)),输入 {bucket}/{key}
  11. 对于 Execution role(执行角色),输入您之前创建的 IAM 角色的 Amazon Resource Name(ARN)。
  12. 对于 Content Handling(内容处理),选择 Passthrough(直通式)。
  13. 选择 Save(保存)。

为您的 API 设置 PUT 方法

  1. 在 API 页面的 Resources(资源)面板上,选择 PUT
  2. 选择 Integration Request(集成请求)。
  3. 展开 URL Path Parameters(URL 路径参数)。
  4. 选择 Add path(添加路径)。
  5. 对于 Name (名称),输入 bucket
  6. 对于Mapped from(映射来源),输入 method.request.path.folder
  7. 选择行尾的勾号图标。
  8. 重复第 4 步到第 7 步。在第 5 步中,将 Name(名称)设置为 key。在第 6 步中,将 Mapped from((映射来源))设置为 method.request.path.object

为 API 设置二进制媒体类型

  1. 在 API 页面的导航窗格中,选择Settings(设置)。
  2. Binary Media Types(二进制媒体类型)部分,选择 Add Binary Media Type(添加二进制媒体类型)。
  3. 在文本框中,添加以下字符串:*/*
    注意:不要在字符串两端添加引号。您还可以将通配符替换为要作为二进制媒体类型的特定 MIME 类型。例如,选择 "image/jpeg" 会让 API Gateway 将 JPEG 图像视为二进制媒体类型。如果您添加 */*,则 API Gateway 会将所有媒体类型视为二进制媒体类型。
  4. 选择 Save Changes(保存更改)。

部署您的 API

  1. 在 API 页面的导航窗格中,选择Resources(资源)。
  2. Resources(资源)窗格中,选择 Actions(操作),然后选择 Deploy API(部署 API)。
  3. Deploy API(部署 API)窗口中,对于 Deployment stage(部署阶段),选择 [New Stage]([新阶段])。
  4. 对于 Stage name(阶段名称),输入 v1
  5. 选择 Deploy(部署)。
  6. 在导航窗格中,选择 Stages(阶段)。
  7. 选择 v1 阶段。

现在,您可以看到用于向已部署的 API 快照发出请求的调用 URL。

复制该调用 URL 并附加对象的存储桶名称和文件名,以使用客户端发出 PUT HTTP 请求。您可以使用自己选择的客户端。例如,您可以使用 Postman。

考虑下面的 HTTP 请求示例。该示例假设您的 API ID 为 abc,您的 S3 存储桶为 mybucket,您正在上传的本地文件为 myobject.jpeg。在此示例中,将 mybucket 替换为 {folder} 并映射到 {bucket},而 myobject.jpeg 被替换为 {object} 并映射到 {key}

https://abc.execute-api.ap-southeast-1.amazonaws.com/v1/mybucket/myobject.jpeg

注意: 如果二进制列表中包含 */*,则可以发出 PUT 请求来上传文件。如果二进制列表中包含 image.jpeg,则必须为您的 PUT 请求添加 Content-Type header(内容类型标头)。您必须将 Content-Type header(内容类型标头)设置为 image/jpeg


这篇文章对您有帮助吗?


您是否需要账单或技术支持?