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

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

要允许用户通过调用 API 执行服务访问您的 API,您必须创建 API Gateway 资源策略,并将该策略附加到 API。当您将策略附加到 API 时,它会将该策略中的权限应用于 API 中的方法。如果您更新资源策略,您将需要部署 API。

先决条件

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

对于边缘优化的 API 或区域 API,您可以在创建 API 时或者在部署 API 后,将资源策略附加到该 API。对于私有 API,如果没有资源策略,就无法部署 API。有关更多信息,请参阅 API Gateway 中的私有 REST API

将资源策略附加到 API Gateway API

以下过程说明如何将资源策略附加到 API Gateway API。

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

  2. 选择一个 REST API。

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

  4. 选择创建策略

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

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

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

  7. 选择 Save changes(保存更改)

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

AWS CLI

要使用 AWS CLI 创建新的 API 并向其附加资源策略,请按以下所示调用 create-rest-api 命令:

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

要使用 AWS CLI 将资源策略附加到现有 API,请按以下所示调用 update-rest-api 命令:

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

也可以将资源策略作为单独的 policy.json 文件附加,并将其包含在 create-rest-api 命令中。以下示例 create-rest-api 创建一个新的 API:

aws apigateway create-rest-api \ --name "api-name" \ --policy file://policy.json

policy.json 是一项 API Gateway 资源策略,例如示例:基于源 IP 地址或范围拒绝 API 流量

AWS CloudFormation

您可以使用 AWS CloudFormation 通过资源策略创建 API。以下示例使用示例资源策略示例:基于源 IP 地址或范围拒绝 API 流量创建 REST 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

排除资源策略故障

以下故障排除指南可能有助于解决资源策略问题。

我的 API 返回 {"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:********/****/****/"}

在资源策略中,如果您将主体设置为 AWS 主体,如下所示:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", ""Principal": { "AWS": [ "arn:aws:iam::account-id:role/developer", "arn:aws:iam::account-id:role/Admin" ] }, "Action": "execute-api:Invoke", "Resource": [ "execute-api:/*" ] }, ... }

您必须对 API 中的每个方法使用 AWS_IAM 授权,否则 API 会返回之前的错误消息。有关如何为方法开启 AWS_IAM 授权的更多说明,请参阅 API Gateway 中用于 REST API 的方法

我的资源策略未更新

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

我的资源策略返回以下错误:策略文档无效。请检查策略语法并确保主体有效。

要纠正此错误,我们首先建议您检查策略语法。有关更多信息,请参阅 Amazon API Gateway 的访问策略语言概述。我们还建议您检查指定的所有主体是否有效且未被删除。

此外,如果您的 API 位于某个选择加入的区域,请确认资源政策中的所有账户都启用了该区域。