原文はこちら
マイクロサービスとサーバレスは、これまでにも増して人気を得てきており、世界中のチームがこれらのパターンとアーキテクチャに非常に迅速に適応してきています。しかし、大規模にマイクロサービスとサーバレスを活用しようとする際にこうしたチームがまず直面するのが、フロントエンドとモバイルAPIのとても多くの、そして複雑なエンドポイントを管理しなければならないという課題です。そのため、多くのチームではバックエンドをシンプルにし、すべてのクライアントからの「シングルポイント・オブ・エントリー」にするために、API Gatewayを採用しています。API Gatewayはまた、アーキテクチャの中の個々のファンクションではなくゲートウェイのレベルで、レート制限やCORS、認証を簡単に実装できるようにしてくれます。
このブログポストではOracle Cloudの最新サービスのひとつであるAPI Gatewayを概覧していきます。
以下の順で進めていきます:
- "Hello World"サーバレスファンクションの作成とデプロイ
- API Gatewayに適したサブネットの作成
- ダイナミックグループの作成とAPI Gatewayに必要なポリシーの適用
- Gatewayの作成
- Gatewayへの仕様のデプロイ
- Gatewayのテスト
"Hello World"サーバレスファンクションの作成とデプロイ
以前にもOracle Functionsについてのブログを書いています→Oracle Functions:開発者のためのクイックスタートガイド。ドキュメントはとてもお役立ちですし、他にもOracleのホステッドサーバレスをどのように使うかについてのたくさんの情報がありますので、ここではサーバレスのための環境をどのようにセットアップするかについての詳細には立ち入りません。あなたはOracle Functionsのことを知っているものとして進めていきますので、必要であればこれらのリンクを参照してくださいね。
ではシンプルなサーバレスアプリケーションとファンクションを作成し、そのファンクションをデプロイしてみましょう。このファンクションの内容は今回関係なくて、ただ後にGatewayのテストで使いたいだけです。なので、ファンクションはサンプルの"Hello World"のままにしておきます。ランタイムもここでは関係ないので、Oracle FunctionsとFn Projectでサポートされているものならなんでもよいです。
この時点でファンクションを
fn
CLIで呼び出しできます:
しかし、HTTP(S)経由やOCI SDKを利用してファンクションを直接呼び出しするにはリクエストへの署名が必要です。ファンクションをインスペクトして呼び出しエンドポイントを取得してみましょう:
注!
fn inspect
コールから id
をコピーしておきましょう。これが後で必要になるファンクションのOCIDです!
呼び出ししようすると
401 Unauthorized
で失敗します:
But once we put our serverless function behind our gateway we can invoke it via HTTPS. Let's move on!
しかし、Gatewayのうしろにサーバレスファンクションを配置することによって、HTTPS経由で呼び出しができるようになります!やってみましょう!
しかし、Gatewayのうしろにサーバレスファンクションを配置することによって、HTTPS経由で呼び出しができるようになります!やってみましょう!
API Gatewayに適したサブネットの作成
API Gateway用にHTTPSトラフィックのためのイングレスルールを設定したリージョナルサブネットが必要になります。ここでゃ既存のVCNの中にこのサブネットを作成していきましょう。
選んだセキュリティリストにポート443へのイングレスルールを追加します:
完了です。続いてもセキュリティについて…
ダイナミックグループの作成とAPI Gatewayに必要なポリシーの適用
API Gatewayではテナンシー内でのアクセス制御にダイナミックグループを使用します。なので、新しくダイナミックグループを作成していくつかのポリシーを設定する必要があります。Gatewayを作成するコンパートメントのOCIDが必要になるので、Identity -> Compartmentsから使うコンパートメントのOCIDをコピーしてください。次に、新規ダイナミックグループを以下の定義(コンパートメントOCIDは適切なものに置き換えて)で作成しましょう:
さて、あなたのテナンシーと新しく作成したダイナミックグループに対応するポリシーを作成します。グループ名とコンパートメント名はご自身のものに置き換えてください:
ご参考まで、わたしのテナンシーでのステートメントは以下のようになりました:
それではGatewayを作成しましょう!
Gatewayの作成
Gatewayを作成するには、まずサイドバーメニューから'Developer Services'の配下の'API Gateway'を選択します。
'Create Gateway'をクリックしてダイアログを埋めていきます。先程作成したリージョナルサブネットを選択することを忘れないでください。
Gatewayはまず'Creating'のステータスになるでしょう。
数分くらいで、Gatewayは'Active'になります。
Gatewayへの仕様のデプロイ
デプロイメントを作成する前に、エンドポイントを定義するためデプロイメント仕様ファイルをJSONフォーマットで記述する必要があります。前述のファンクションOCIDが手元にあることを確認してください。では、
spec.json
というファイルをファンクションのルートに以下の内容で作成しましょう(ファンクションOCIDはご自身のものに置換してください):
このブログポストはLimited Availability期間のやり方で説明しているので手で作成したJSONでエンドポイントを定義する必要がありますが、GA後にはコンソールUIからかんたんに定義することができるようになります。
次に、Gateway詳細ページのサイドバーから'Deployments'をクリック。
そして'Deploy API'をクリック。
デプロイメントに名前をつけて、作成した
spec.json
を選択してパスのプレフィックスを入力します。
'Deploy'をクリックしてちょっと待てばデプロイメントは完了です。
Gatewayのテスト
Gateway詳細のページで、エンドポイントを見てみましょう。
ファンクションをテストするため、このエンドポイントをコピーしたものに
spec.json
で定義したパスを追加して、実行してみましょう!
これはAPI Gatewayを使ってできることのほんのさわりです。デプロイメント仕様を拡張して他のファンクションや(Oracle Cloud上や外部の)HTTPエンドポイントをカバーしたり、レート制限や認証などを行うこともできます。