1つのステージでAPI Gatewayの複数バックエンドを管理する
はじめに
API Gatewayには1つのAPIに複数のステージを作成することで、URLパスによってバックエンドを変えることが可能となります。
本記事ではこの方法ではなく、1つのステージ (1つの接続URL) でバックエンドを変える方法について記載します。
構築するシステム構成図
本記事で紹介するシステムは以下の構成図となっています。
API GatewayのREST APIが受け口となって「Hello from Lambda1!」を返すLambda関数と「Hello from Lambda2!」を返すLambda関数をバックエンドにしています。下図では、API Gatewayから2つのLambda関数に矢印が向いていますが、それらを片方ずつ切り替える、というのが本記事で説明する内容です。
構築
Lambda関数の作成 (バックエンドを2つ用意すればなんでも良いです)
バックエンドとして今回は「test-lambda1」「test-lambda2」と2つのLambda関数を用意します。
関数名以外をデフォルトのまま作成すると以下のコードが作成されるので、両者に違いが出るように"stringify"の文字列を「Hello from Lambda1!」と「Hello from Lambda2!」とします。
export const handler = async (event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
REST APIの作成
API GatewayのサービスコンソールのREST API欄から「構築」を選択します。
API名を「test-apigw」とし他はデフォルトのままで作成します。
1つ目のバックエンドのデプロイ作成
「メソッドを作成」から以下のパラメータでメソッドを作成します。
パラメータ | 値 |
---|---|
メソッドタイプ | GET |
統合タイプ | Lambda関数 |
Lambda関数 | test-lambda1 |
右上の「APIをデプロイ」から先ほど作成したメソッドでデプロイを作成します。
初めてデプロイを作成する場合は、新しいステージを作成する必要があるので今回は「test」とします。
2つ目のバックエンドのデプロイ作成
もう一つのバックエンドについても前項と同じ手順でデプロイを作成します。
左のペインから「リソース」を選択し、右側の詳細画面を下にスクロールして「統合リクエスト」タブを選択します。
そして、右側の「編集」を押下して、1つ目のバックエンドの設定を以下の値に変更します。
パラメータ | 値 |
---|---|
メソッドタイプ | GET |
統合タイプ | Lambda関数 |
Lambda関数 | test-lambda2 |
編集した内容をAPI Gatewayに反映させるため、再度「APIをデプロイ」します。このときステージは新規ではなく、プルダウンから先ほど作成したものと同じステージ名を選択してデプロイします。
検証結果
1つ目のバックエンドにアクセス
※本記事では説明の都合上、バックエンドを1つ目のものに一度切り替えています。
左のペインの「ステージ」から「URLを呼び出す」に表示されているURL(https://[ランダムな文字列].execute-api.ap-northeast-1.amazonaws.com/test)をコピーします。
新しいブラウザでコピーしたURLに接続すると画面に「Hello form Lambda1!」と表示されていることが分かります。
※後ほど、再度このブラウザを用いるのでまだ消さないでください。
バックエンド切り替え
バックエンドを切り替えるために左のペインから「ステージ」を選択します。
右の詳細画面を下にスクロールし、「デプロイ履歴」を選択すると先ほど作成したバックエンド2個の履歴があると思います。(画像では別でデプロイを作成していたため3つ表示されています)
※デプロイIDはデプロイ時にランダムな文字列が与えられています。
ステータスが「アクティブ」になっていないデプロイを選択し、「アクティブなデプロイを変更」を押下します。
ポップアップでも「アクティブなデプロイを変更」を押下します。
ステータスがアクティブとなっているデプロイが切り替わっていることを確認します。
2つ目のバックエンドにアクセス
2つ前の手順でアクセスしたブラウザをリロードすると、画面が「Hello form Lambda1!」から「Hello form Lambda2!」に切り替わっていることが分かります。
※切り替わるまで少しタイムラグがあります。
ユースケース
本記事で紹介した内容は「API Gatewayに接続するユーザーが不特定多数の場合」に適用できると考えられます。
本番環境と開発環境のように、一部の人が異なる環境を試す時は、間違った環境へのアクセスを防止するために、https://XXX.executeapi.amazon.com/prd とhttps://XXX.executeapi.amazon.com/dev などステージを複数用意してステージによって環境を分けるという手段が考えられます。(より厳密に分けたい場合はそもそもAPIを別に用意する方法もあります)
しかし、この例で挙げたように不特定多数が接続するようなものだと「今日まではAのリンクで、明日以降はBのリンクで接続してください」と注意書きしても、全員が対応できるのか分かりません。そこで、本記事で紹介した方法を適用すれば、接続する側は何も気にせずに接続するだけで、バックエンドを変更することができます。Webアプリケーションのメンテナンス時はアプリケーションを動作させず、メンテナンス用の画面が表示されるようにしたい、といった際に有効でしょう。
今回の方法はコンソール上での手動操作が必要となるものの、「アクティブなデプロイを変更する」というシンプルな方法で実現できます。実運用する際には自動で割り当たるデプロイIDを控える、もしくは、デプロイ時に「デプロイメントの説明」で分かるようにしておくとデプロイ履歴欄に表示されるのでそれを活用する、という方法があります。
本記事ではAPI Gatewayの統合タイプとしてどちらもLambda関数を使用しましたが、VPCリンクとLambda関数など異なるバックエンドにしても切り替えることができるので、大変便利な方法だと思います。
まとめ
本記事では、API Gatewayにおいて1つのステージでバックエンドを切り替える方法について説明いたしました。API Gatewayには他にも様々な機能があるので、別の記事で説明いたします。
Discussion