API Gatewayでステージへアップロードする前のテスト呼び出しをCLIから使ってみる

2022.06.10

いわさです。

API GatewayではmTLSやWAFなどでアクセス時の制限を行うことが出来ます。
一方で外部からの制限を行うと、テストを行う際にも考慮が必要となります。

これを回避する簡易的な方法を探していて、REST APIのメソッドテスト画面では認証など不要でテストを実行することが出来ることを知りました。
ステージへアップされたものではなく、リソース画面で構成中のリソースに対して実行されるため、ステージに対して設定するmTLSやカスタムドメイン、WAFなどが設定されないからです。
また、テスト呼び出しを行うと、API Gatewayは承認をスキップし、メソッドを直接呼び出します

そして、このテスト機能はAWS CLIからも実行することが出来ます。

本日はAWS CLIからこのテスト機能を使ってみて、何が出来るのかを確認してみました。

環境を用意

前提となる環境ですが、この記事では、mTLSを設定しカスタムドメインを無効化したREST APIを用意します。
以下の記事を参考にクライアント証明書を発行し、API Gatewayをデプロイします。

デプロイ後に動作確認してみると、クライアント証明書なしではアクセスに失敗します。
また、カスタムドメインでのアクセスも出来なくなっています。

$ curl https://hogemtls.tak1wa.com                                         
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to hogemtls.tak1wa.com:443 

$ curl https://c1a54jlunl.execute-api.ap-northeast-1.amazonaws.com/iwasa-stage
{"message":"Forbidden"}%

test-invoke-method を使う

ステージへアップされたAPIへはクライアント証明書がなければ認証エラーとなりますが、アップ前の構成中のAPIはクライアント証明書なしでアクセスすることが出来ます。
まずはポータルでアクセスしてみます。

API IDとリソースIDが必要になりますので、APIあるいはポータルから情報を取得しておきます。

$ aws apigateway test-invoke-method --rest-api-id c1a54jlunl --resource-id xcp9yh1th0 --http-method GET
{
    "status": 200,
    "body": "203.0.113.1\n",
    "headers": {
        "Connection": "keep-alive",
        "Content-Length": "14",
        "Date": "Fri, 10 Jun 2022 04:40:36 GMT",
        "Server": "lighttpd/1.4.53"
    },
    "multiValueHeaders": {
        "Connection": [
            "keep-alive"
        ],
        "Content-Length": [
            "14"
        ],
        "Date": [
            "Fri, 10 Jun 2022 04:40:36 GMT"
        ],
        "Server": [
            "lighttpd/1.4.53"
        ]
    },

:

}

アクセスすることが出来ました。

JSON形式でbodyheadersにもアクセスしやすくなっているので自動でテストをする際に扱いやすそうですね。

よりステージに近い設定でテストするためにステージ変数を使う

一点注意事項があって、このコマンドはステージに対して実行されるので、本番環境用に構成を変更してステージへデプロイする場合などは注意が必要です。
この、test-invoke-methodではステージ変数をパラメータで設定してテスト実行することが可能なのです。
変数の設定くらいの違いの差であれば、本番環境の設定や開発環境用の設定など、ステージ変数をうまく使っておくと、近い環境で実行することが出来ます。

ここではステージ変数に統合先のURLを設定しました。
そして、統合リクエストではステージ変数を参照するように変更しています。(http://${stageVariables.url}

コマンド側では、stage-variablesでパラメータを渡すことが出来ます。

$ aws apigateway test-invoke-method --rest-api-id c1a54jlunl --resource-id xcp9yh1th0 --http-method GET --stage-variables url="checkip.amazonaws.com"
{
    "status": 200,
    "body": "203.0.113.1\n",
    "headers": {
        "Connection": "keep-alive",
        "Content-Length": "14",
        "Date": "Fri, 10 Jun 2022 04:54:02 GMT",
        "Server": "lighttpd/1.4.53"
    },
    "multiValueHeaders": {
        "Connection": [
            "keep-alive"
        ],
        "Content-Length": [
            "14"
        ],
        "Date": [
            "Fri, 10 Jun 2022 04:54:02 GMT"
        ],
        "Server": [
            "lighttpd/1.4.53"
        ]
    },

:

    "latency": 417
}

これでステージと同じ状態のバックエンドへテストすることが出来ました。
逆にステージとは異なる開発用のバックエンドへ統合してテスト呼び出しすることも出来そうです。

さいごに

本日はAPI Gatewayのテスト呼び出し機能をAWS CLIから使ってみました。

使い所は選びそうですが、簡易的にテストを行う際に利用出来そうです。
ただし、ステージを対象にテスト出来るわけではないのでE2Eテストの代わりになるものではないですね。
ステージ変数の他にクエリパラメータやヘッダーも様々なパラメータが使えるので、パターン別のテストなども出来ないことはなさそうですね。