API Gateway のデフォルトエンドポイントを無効化しても反映されない場合の対処方法

API Gateway のデフォルトエンドポイント https://{api-id}.execute-api.{region}.amazonaws.com の無効化後にステージに再デプロイ

困っていた内容

作成した API Gateway にカスタムドメインは設定しました。
また、デフォルトで発行された以下のような REST API 用のエンドポイントにユーザがアクセスできてしまうため、無効化を行いました。

デフォルトエンドポイント:「 https://{restapi_id}.execute-api.{region}.amazonaws.com 」

しかしながら、まだユーザがデフォルトエンドポイントへアクセスできてしまいます。
どのようにすれば、デフォルトエンドポイント無効化を反映することができますか。

どう対応すればいいの?

デフォルトエンドポイントの無効化を設定後に、API Gateway のステージへ再デプロイすることで無効化を反映することができます。
なお、以下 2 つの手順で無効化の反映までを行うことができます。

設定手順

  • デフォルトエンドポイントの無効化
  • API Gateway のステージへデプロイして反映

こちらの設定手順について、実際にやってみました。

やってみた

前提

前提として、ステージを作成済み (ステージ名:「test」) で、API Gateway のバックエンドには簡単な挨拶をレスポンス (「Hello Nakano!」) する Lambda 関数を作成しています。
それでは、デフォルトエンドポイントへリクエストしてみます。

$ curl -i https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/test/hello
HTTP/2 200
date: Thu, 09 Sep 2021 08:07:10 GMT
content-type: application/json
content-length: 15
x-amzn-requestid: 790e1f2c-xxxx-xxx-xxxx-xxxxxxxxxxx
x-amz-apigw-id: XXXXXXXXXXX
x-amzn-trace-id: Root=1-6139c0ae-xxxxxxxxxxxx;Sampled=0

"Hello Nakano!"%

AWS CLI の場合

デフォルトエンドポイントの無効化

それでは、以下のupdate-rest-apiのコマンドを実行して、デフォルトエンドポイントを無効化してみます。

$ aws apigateway update-rest-api \
    --rest-api-id  xxxxxxxxxx\
    --patch-operations op=replace,path=/disableExecuteApiEndpoint,value='True'
{
    "id": "xxxxxxxxxx",
    "name": "testNakanoHTTPCustomAPI",
    "description": "testNakanoHTTPCustomAPI",
    "createdDate": "2021-05-13T14:22:54+09:00",
    "apiKeySource": "HEADER",
    "endpointConfiguration": {
        "types": [
            "REGIONAL"
        ]
    },
    "tags": {},
    "disableExecuteApiEndpoint": true
}

update-rest-api によるデフォルトエンドポイント無効化は完了しました。
レスポンスを確認すると、disableExecuteApiEndpoint が true になっています。

無効化が反映されていないことを確認

この状態で API Gateway のデフォルトエンドポイントへリクエストを送ってみます。

$ curl -i https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/test/hello
HTTP/2 200
date: Thu, 09 Sep 2021 08:12:19 GMT
content-type: application/json
content-length: 15
x-amzn-requestid: 3e48bf4b--xxxx-xxx-xxxx-xxxxxxxxxxx
x-amz-apigw-id: XXXXXXXXXXX
x-amzn-trace-id: Root=1-6139c1e3-xxxxxxxxxxxx;Sampled=0

"Hello Nakano!"%

やはり、デフォルトエンドポイントの無効化は反映されていません。
次に、ステージへ再デプロイして無効化を反映してみましょう。

デプロイしてデフォルトエンドポイント無効化を反映

以下のcreate-deploymentのコマンドで、API Gateway のステージへデプロイを行います。

$ aws apigateway create-deployment \
    --rest-api-id abcdef123 \
    --stage-name test
{
    "id": "xxxxxx",
    "createdDate": "2021-09-09T17:14:19+09:00"
}

これで、無効化がステージへ反映されました。
デプロイが反映されるまで暫く待ってから、もう一度 API Gateway へリクエストを送ってみます。

$ curl -i https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/test/hello
HTTP/2 403
date: Thu, 09 Sep 2021 08:14:46 GMT
content-type: application/json
content-length: 23
x-amzn-requestid: cbbc689a-c735-4f31-a2b7-8419dc2d9831
x-amzn-errortype: ForbiddenException
x-amz-apigw-id: XXXXXXXXXXX

{"message":"Forbidden"}%

レスポンスを確認すると 403 Forbbiden が返ってきています。
このように、デフォルトエンドポイントへリクエストを行うと権限エラーとしてレスポンスされます。

デフォルトエンドポイントの有効化

無効化したデフォルトエンドポイントを有効化し直すことも可能です。
以下のコマンドの通り、disableExecuteApiEndpoint を False にすることでデフォルトエンドポイントを再度、有効にすることができます。

$ aws apigateway update-rest-api \
    --rest-api-id  xxxxxxxxxx\
    --patch-operations op=replace,path=/disableExecuteApiEndpoint,value='False'

無効化時と同様に、ステージへデプロイを行います。

$ aws apigateway create-deployment \
    --rest-api-id xxxxxxxxxx \
    --stage-name test

マネージメントコンソールの場合

API Gateway のマネージメントコンソール上でも、デフォルトエンドポイントを無効化することができます。

以下の設定のページでデフォルエンドポイントを無効化にして保存します。

その後、ステージへデプロイを実行することで、AWS CLI の時と同様の設定が可能です。

注意点

なお、ステージとして今回は「test」のみにデプロイを行いましたが、1つの API Gateway に複数のステージがある場合に、全てのステージにデフォルトエンドポイントの無効化・有効化の設定は影響は及ぶので注意が必要です。

特に、1つの API Gateway で本番環境(prod)、開発環境(dev)をステージでわけていて、1つの環境のみ無効化したつもりが、すべてのステージのエンドポイントが無効化されてしまい意図せずアクセスできないなどの影響が出る可能性があるので注意しましょう。

注記
デフォルトのエンドポイントを無効にすると、API のすべてのステージに影響します。

参考資料