如何使用基于资源的策略解决调用 API Gateway API 时出现的访问被拒绝错误?

2 分钟阅读
0

在使用资源策略调用 Amazon API Gateway API 操作时,我遇到了访问被拒绝错误。

解决方法

对于公有或私有 API Gateway API 操作,请执行以下故障排除步骤。

公有 API 操作

1.    检查 API 操作是否具有允许或阻止基于 IP 地址的请求的资源策略。如果您没有设置访问日志记录,请为 API Gateway 设置访问日志记录。访问日志包含 API 操作的源 IP 地址。确保该 IP 地址不在拒绝列表中。IP 地址或 CIDR 范围必须在资源策略中明确允许访问。

仅允许三个 IP 地址的资源策略示例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:<region>:<account_number>:<api_id>/*"
        },

        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:<region>:<account_number>:<api_id>/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "52.36.146.106",
                        "34.216.36.206/32",
                        "205.251.233.179/32"
                    ]
                }
            }
        }
    ]
}

阻止两个 IP 地址的资源策略示例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:<region>:<account_number>:<api_id>/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
               "arn:aws:execute-api:<region>:<account_number>:<api_id>/*"
            ],
            "Condition" : {
                "IpAddress": {
                    "aws:SourceIp": ["52.36.146.106", "34.216.36.206/32" ]
                }
            }
        }
    ]
}

2.    API 请求的 HTTP 方法(GET、POST)和 API Gateway 资源(/、/foo、/foo/bar)必须明确允许访问。检查类似于以下内容的资源策略属性:

"Resource": [
               "arn:aws:execute-api:<region>:<account_number>:<api_id>/<stage>/<http_method>/<resource_path_specifier>/*"
            ],

3.    检查资源策略是否使用其他类型的身份验证方法或授权方。API Gateway 对资源策略的评估受身份验证类型的影响。示例身份验证类型包括 AWS Lambda AuthorizerAmazon Cognito 身份验证。确保为 API 定义的身份验证类型正确配置了资源策略。

4.    确保重新部署 API 请求以使所有更改生效。要重新部署您的 API 请求,请重复这些步骤以将 REST API 部署到某个阶段

5.    如果您使用的是示例 API Gateway 资源策略,请确保已为环境配置了所有变量。

6.    如果资源策略仅允许访问您的 Amazon Virtual Private Cloud(Amazon VPC)IP 地址,请执行以下操作之一:

在资源策略中允许路由器 IP 地址和 NAT 网关 IP 地址(公有 IP 地址)访问。

-或者-

将公有 API 端点更改为私有 API 端点

私有 API 操作

1.    如果资源策略具有 Amazon VPC 端点,请检查策略中的条件键。如果资源策略使用条件键 aws:SourceVpce,则其值必须是 Amazon VPC 端点 ID,而不是 VPC ID。如果资源策略使用条件键 aws:SourceVpc,则其值必须是 Amazon VPC ID,而不是 VPC 端点 ID。

要检查端点类型,请打开 Amazon VPC 控制台,选择 Endpoints(端点),然后选择您的端点。

2.    确保重新部署 API 请求以使所有更改生效。要重新部署您的 API 请求,请重复这些步骤以将 REST API 部署到某个阶段

3.    如果您使用的是示例 API Gateway 资源策略,请确保为环境配置了所有变量。

4.    API 请求的 HTTP 方法(GET、POST)和 API Gateway 资源(/、/foo、/foo/bar)必须明确允许访问。检查类似于以下内容的资源策略属性:

"Resource": [
               "arn:aws:execute-api:<region>:<account_number>:<api_id>/<stage>/<http_method>/<resource_path_specifier>/*"
            ],

5.    检查资源策略是否使用其他类型的身份验证方法或授权方。API Gateway 对资源策略的评估受身份验证类型的影响。示例身份验证类型包括 AWS Lambda AuthorizerAmazon Cognito 身份验证。确保为 API 定义的身份验证类型正确配置了资源策略。


AWS 官方
AWS 官方已更新 1 年前