Amazon API Gateway
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

管理 API Gateway API 的 IAM 策略示例

以下示例策略文档展示了各种使用案例以设置访问许可,管理 API Gateway 中的 API 资源。有关许可模型和其他背景信息,请参阅 控制谁可以使用 IAM 策略创建和管理 API Gateway API

简单读取许可

以下策略语句将为用户提供获取 AWS 区域 us-east-1 内带 a123456789 标识符的 API 中的所有资源、方法、模型和阶段相关信息的许可。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "apigateway:GET" ], "Resource": [ "arn:aws:apigateway:us-east-1::/restapis/a123456789/*" ] } ] }

以下示例策略语句将为 IAM 用户提供列出任何区域内的所有资源、方法、模型和阶段相关信息的许可。该用户还有权在 AWS 区域 us-east-1 内对带 a123456789 标识符的 API 执行所有可用的 API Gateway 操作:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "apigateway:GET" ], "Resource": [ "arn:aws:apigateway:*::/restapis/*" ] }, { "Effect": "Allow", "Action": [ "apigateway:*" ], "Resource": [ "arn:aws:apigateway:us-east-1::/restapis/a123456789/*" ] } ] }

对任何 API 的只读许可

以下策略文档将允许关联实体 (用户、组或角色) 检索调用方 AWS 账户中的任意 API。这包括 API 的任何子资源,例如方法、集成等。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1467321237000", "Effect": "Deny", "Action": [ "apigateway:POST", "apigateway:PUT", "apigateway:PATCH", "apigateway:DELETE" ], "Resource": [ "arn:aws:apigateway:us-east-1::/*" ] }, { "Sid": "Stmt1467321341000", "Effect": "Deny", "Action": [ "apigateway:GET" ], "Resource": [ "arn:aws:apigateway:us-east-1::/", "arn:aws:apigateway:us-east-1::/account", "arn:aws:apigateway:us-east-1::/clientcertificates", "arn:aws:apigateway:us-east-1::/domainnames", "arn:aws:apigateway:us-east-1::/apikeys" ] }, { "Sid": "Stmt1467321344000", "Effect": "Allow", "Action": [ "apigateway:GET" ], "Resource": [ "arn:aws:apigateway:us-east-1::/restapis/*" ] } ] }

第一个 Deny 语句会显式禁止对 API Gateway 中任何资源的任何 POSTPUTPATCHDELETE 调用。这将确保此类许可不会被同样挂载到该调用方的其他策略文档覆盖。第二个 Deny 语句将阻止调用方查询根 (/) 资源、账户信息 (/account)、客户端证书 (/clientcertificates)、自定义域名 (/domainnames) 和 API 密钥 (/apikeys)。这三个语句结合起来,可确保调用方仅能查询 API 相关资源。在 API 测试中,当您不想要测试人员修改任何代码时,这种做法将非常有用。

要限制上述对指定 API 的只读访问许可,请将 Resource 语句的 Allow 属性替换成以下内容:

"Resource": ["arn:aws:apigateway:us-east-1::/restapis/restapi_id1/*", "arn:aws:apigateway:us-east-1::/restapis/restapi_id2/*"]

对所有 API Gateway 资源的完全访问许可

以下示例策略文档将授予对 AWS 账户的所有 API Gateway 资源的完全访问许可。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1467321765000", "Effect": "Allow", "Action": [ "apigateway:*" ], "Resource": [ "*" ] } ] }

一般而言,您应该避免使用此类广泛而开放的标准访问策略。您的 API 核心开发团队可能有必要这样做,以便能够创建、部署、更新和删除任何 API Gateway 资源。

管理 API 阶段的完全访问许可

以下示例策略文档将授予对调用方 AWS 账户中任意 API 的阶段相关资源的完全访问许可。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "apigateway:*" ], "Resource": [ "arn:aws:apigateway:us-east-1::/restapis/*/stages", "arn:aws:apigateway:us-east-1::/restapis/*/stages/*" ] } ] }

上述策略文档仅授予了对 stages 集合及其所含全部 stage 资源的完全访问许可,前提是未对调用方挂载其他任何授予更多访问许可的策略。否则,您必须明确拒绝所有其他访问许可。

使用上述策略时,由于用户无法调用 GET /restapis 查询可用 API,调用方必须事先找到 REST API 的标识符。此外,如果 arn:aws:apigateway:us-east-1::/restapis/*/stages 列表中指定 Resource,阶段资源将不可访问。在这种情况下,如果阶段名称已知,调用方将无法创建阶段或获取现有阶段,虽然他或她仍然可以查看、更新或删除阶段。

要对特定 API 阶段授予许可,只需将 Resource 规范的 restapis/* 部分替换为 restapis/restapi_id 即可,其中 restapi_id 是对应 API 的标识符。

阻止特定用户删除任何 API 资源

以下示例 IAM 策略文档将阻止特定用户删除 API Gateway 中的任何 API 资源。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1467331998000", "Effect": "Allow", "Action": [ "apigateway:GET", "apigateway:PATCH", "apigateway:POST", "apigateway:PUT" ], "Resource": [ "arn:aws:apigateway:us-east-1::/restapis/*" ] }, { "Sid": "Stmt1467332141000", "Effect": "Allow", "Action": [ "apigateway:DELETE" ], "Condition": { "StringNotLike": { "aws:username": "johndoe" } }, "Resource": [ "arn:aws:apigateway:us-east-1::/restapis/*" ] } ] }

此 IAM 策略将为挂载的用户、组或角色授予创建、部署、更新和删除 API 的完全访问许可,不可删除任何 API 资源的特定用户 (johndoe) 除外。它假定未向调用方挂载其他任何对根、API 密钥、客户端证书或自定义域名授予 Allow 许可的策略文档。

要阻止特定用户删除特定的 API Gateway 资源,例如特定的 API 或 API 资源,请将上述 Resource 规范替换为以下内容:

"Resource": ["arn:aws:apigateway:us-east-1::/restapis/restapi_id_1", "arn:aws:apigateway:us-east-1::/restapis/restapi_id_2/resources"]