创建 API Gateway 资源策略并将其附加到 API - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

创建 API Gateway 资源策略并将其附加到 API

要允许用户通过调用 API 执行服务访问您的 API,您必须创建 API Gateway 资源策略以控制对 API Gateway 资源的访问,并将该策略附加到 API。

重要

要更新 API Gateway 资源策略,您将需要具有 apigateway:UpdateRestApiPolicy 权限以及 apigateway:PATCH 权限。

创建 API 时即可将资源策略附加到 API,也可以日后附加。对于私有 API,请注意,在您将资源策略附加到私有 API 之前,对该 API 的所有调用都将失败。

重要

如果在创建 API 后更新资源策略,您将需要附加更新的策略,然后部署 API 以传播更改。单独更新或保存策略不会更改 API 的运行时行为。有关部署 API 的更多信息,请参阅在 Amazon API Gateway 中部署 REST API

您可以通过 IAM 条件元素控制访问权限,包括源 VPC Amazon Web Services 账户、源 VPC 终端节点或 IP 范围。如果您在策略中将 Principal 设置为 "*",则可以随资源策略一起使用其他授权类型。但是,如果您将 Principal 设置为 "AWS",则对于未使用 AWS_IAM 授权保护的所有资源(包括不安全的资源),授权将失败。

下面几节介绍如何创建自己的 API Gateway 资源策略并将其附加到 API。如果附加一个策略,则会将该策略中的权限应用于 API 中的方法。

重要

如果您使用 API Gateway 控制台将资源策略附加到已部署的 API,或者更新现有的资源策略,则需要在控制台中重新部署 API 以使更改生效。

附加 API Gateway 资源策略(控制台)

您可以使用 Amazon 管理控制台将资源策略附加到 API Gateway API。

将资源策略附加到 API Gateway API
  1. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  2. 选择一个 REST API。

  3. 在主导航窗格中,选择资源策略

  4. 选择 创建策略

  5. (可选)选择选择模板以生成示例策略。

    在策略示例中,占位符括在双大括号 ("{{placeholder}}") 内。将每个占位符(包括大括号)替换为必要的信息。

  6. 如果您没有使用任何一个模板示例,则输入您的资源策略。

  7. 选择 ‬保存更改

如果先前已在 API Gateway 控制台中部署了 API,则需要重新进行部署以使资源策略生效。

附加 API Gateway 资源策略 (Amazon CLI)

要使用创建新 API 并 Amazon CLI 向其附加资源策略,请按如下方式调用create-rest-api命令:

aws apigateway create-rest-api \ --name "api-name" \ --policy "{\"jsonEscapedPolicyDocument\"}"

要使用将资源策略附加 Amazon CLI 到现有 API,请按如下方式调用update-rest-api命令:

aws apigateway update-rest-api \ --rest-api-id api-id \ --patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"'

附加 API Gateway 资源策略 ()Amazon CloudFormation

您可以使用 Amazon CloudFormation 创建带有资源策略的 API。以下示例使用示例资源策略创建了一个 REST API 示例:基于源 IP 地址或范围拒绝 API 流量

AWSTemplateFormatVersion: 2010-09-09 Resources: Api: Type: 'AWS::ApiGateway::RestApi' Properties: Name: testapi Policy: Statement: - Action: 'execute-api:Invoke' Effect: Allow Principal: '*' Resource: 'execute-api/*' - Action: 'execute-api:Invoke' Effect: Deny Principal: '*' Resource: 'execute-api/*' Condition: IpAddress: 'aws:SourceIp': ["192.0.2.0/24", "198.51.100.0/24" ] Version: 2012-10-17 Resource: Type: 'AWS::ApiGateway::Resource' Properties: RestApiId: !Ref Api ParentId: !GetAtt Api.RootResourceId PathPart: 'helloworld' MethodGet: Type: 'AWS::ApiGateway::Method' Properties: RestApiId: !Ref Api ResourceId: !Ref Resource HttpMethod: GET ApiKeyRequired: false AuthorizationType: NONE Integration: Type: MOCK ApiDeployment: Type: 'AWS::ApiGateway::Deployment' DependsOn: - MethodGet Properties: RestApiId: !Ref Api StageName: test