AWS API Gateway:用户anonymous未被授权执行API。

63

尝试在我创建的API网关中发布内容:

{
    "Message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-west-2:***********:jrr7u1ekrr/v0/POST/user"
}

如何更新CloudFormation中的策略以使POST端点公开可用?我正在使用AWS::ApiGateway::RestApi资源类型声明API。

API策略属性为:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "execute-api:/*/POST/user"
        }
    ]
} 

9
请注意,如果您看到此信息,则需要更新您的API网关上的资源策略。 - tgk
谢谢!这就是我的问题。现在已经解决了。再次感谢。 - idig
1
对于CORS的使用者:请注意,即使您在资源策略中只有“允许”,它也会拒绝其他所有内容。因此,如果您的资源策略中有任何内容,即使端点上禁用了身份验证,您也需要添加一个OPTIONS端点的允许。 - JacksonHaenchen
8个回答

64

6
重新部署后,我的API变得可用。这个解决方案对我有效。这个答案应该标记为正确答案。 - Ryan Lyu
2
此外,在按下部署按钮后,似乎需要几秒钟才能生效。 - Tim Ludwinski
5
AWS应该在任何更改配置的选项处提供部署按钮,以便用户不必花费数小时来弄清楚为什么某些东西无法正常工作。 - VGupta

19

即使您的OPTIONS方法的授权设置为NONE,它仍将检查资源策略(如果有)。

您可以通过设置以下API网关资源策略来使您的OPTIONS方法可公开访问。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:{REGION}:{AWS_ACCOUNT}:{YOUR_API_ID}/{YOUR_API_STAGE}/OPTIONS/*"
        }
    ]
}

查看API网关资源策略如何影响授权工作流程


7

政策变化后,您需要重新部署应用程序以使更改生效。 重新部署的方法如下 -

  1. 进入API网关。
  2. 找到资源。
  3. 点击“操作”下拉菜单。点击“部署API”。

3

正如其他人所指出的,这个问题很可能是由于API上没有正确的资源策略引起的。我建议您使用AWS文档中的示例Example: Allow private API traffic based on source VPC or VPC endpoint policy

使用VPC端点版本,并将SourceVpce设置为您的API网关VPC端点的ID。保存后,API网关将自动填充端点详细信息,请刷新页面以查看更新的策略。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-1a2b3c4d"
                }
            }
        }
    ]
}

正如其他人所指出的,任何对资源策略的更改都需要您重新部署 API。在部署后等待至少 30 秒钟,然后再进行测试。


2
问题可能出在方法声明部分。您需要在AWS::ApiGateway::Method声明中将authorizationType设置为NONE

感谢roxxypoxxy,我确实将方法auth设置为无: "Type": "AWS :: ApiGateway :: Method",       "Properties": { ... "AuthorizationType": "NONE", - tgk
既然我看到了你的编辑帖子,你能否试着按照这里记录的文档https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-resource-policies-examples.html来调整资源呢?你现在的资源声明似乎不符合文档中提到的模式。 - roxxypoxxy
2
你错了。这个错误信息不是关于方法授权的。 - Akim Kelar

1

这不是对问题的回答,而是针对那些遇到相同错误信息的人。

我正在使用资源策略尝试通过IP白名单请求AWS API Gateway,但我遇到了OP提到的错误:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:eu-west-1:{ACCCOUNT_ID}:{API_GW_ID}/{STAGE}/{METHOD}/{PATH}",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "{SOME_IP_ADDRESS}/32"
                }
            }
        },
        {
            "Sid": "",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:eu-west-1:{ACCCOUNT_ID}:{API_GW_ID}/{STAGE}/{METHOD}/{PATH}"
        }
    ]
}

我学到的:

  • 一方面,没有资源策略意味着允许所有请求。

  • 另一方面,Deny 语句优先于 Allow 语句。(这意味着所有请求都被拒绝了)

  • 最后,如果存在资源策略,则任何不符合语句的请求将被拒绝。

因此,为了仅允许来自特定 IP 的 API GW 请求,我最终使用了以下策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:eu-west-1:{ACCCOUNT_ID}:{API_GW_ID}/{STAGE}/{METHOD}/{PATH}",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "{SOME_IP_ADDRESS}/32"
                }
            }
        }
    ]
}

1

In

"Resource": "execute-api:/*/POST/user"

请将*替换为您的帐户ID,然后重新部署。Kr,

我工作中的另一个团队也使用通配符进行了类似的设置,并且他们成功了。就像这样 - "Resource": !Join ["", ["execute-api:/", !Ref EnvironmentSuffix, "/"]], - ennth

0
请检查以下内容:
步骤1:确保IAM用户已附加AmazonAPIGatewayInvokeFullAccess策略。
步骤2:确保API Gateway已在资源策略中将AWS帐户列入白名单。
步骤3:如果IAM用户是最近创建的,则需要大约5-10分钟才能反映策略,请耐心等待。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接