API Gateway REST API でデプロイした一部のステージやリソースへのアクセスのみ制限する方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

API Gateway REST API でデプロイした一部のリソースのパスやメソッド、もしくは特定のステージ全体を制限して、ユーザからアクセスできないようにしたいです。
コンソール上からだとそのようなことができるボタンなど確認できませんでした。
そのような方法が別にありましたら教えてください。

どう対応すればいいの?

API Gateway のリソースポリシーを利用して、アクセス制限できます。
リソースポリシーの設定次第で、特定のリソースのパスやステージ、メソッドに対して、アクセス制御を行うことが可能です。

注意点として、リソースポリシーの変更を API ステージに反映するには、API の再デプロイが必要です。

API Gateway コンソールから REST API をデプロイする - Amazon API Gateway

設定方法

リソースポリシーの設定例を以下に記載します。

ステージ全体へのアクセスを制限する場合

例えば、API ステージ /prod 全体のリクエストをアクセス制限させる場合、リソースポリシーは以下の様になります。

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

実際に curl でリクエストを送ると以下のエラーがレスポンスされます。

$ curl -i https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/pets
HTTP/2 403
date: Thu, 12 May 2022 01:11:20 GMT
content-type: application/json
content-length: 186
x-amzn-requestid: bfb5f7ff-9e8f-4ead-ba59-xxxxxxxxxxxx
x-amzn-errortype: AccessDeniedException
x-amz-apigw-id: xxxxxxxxxxxx

{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:************:xxxxxxxxxxxx/prod/GET/pets with an explicit deny"}

特定のステージのリソースパスへのアクセスを制限する場合

例えば、API ステージ /dev のリソースパス /pets の GET メソッドに対してのみアクセスを制限させる場合、リソースポリシーは以下の様になります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "execute-api:/dev/GET/pets"
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "execute-api:/*"
        }
    ]
}

実際に curl でリクエストを送ると以下のエラーがレスポンスされます。

$ curl -i https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/pets
HTTP/2 403
date: Thu, 12 May 2022 01:08:09 GMT
content-type: application/json
content-length: 185
x-amzn-requestid: 94484f4d-9b8d-4bb4-a156-xxxxxxxxxxxxxx
x-amzn-errortype: AccessDeniedException
x-amz-apigw-id: xxxxxxxxxxxxxxxx

{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:********:xxxxxxxxxx/dev/GET/pets with an explicit deny"}

参考資料