さくらのクラウドの「APIゲートウェイ」を使ってみた

さくらのクラウドの「APIゲートウェイ」を使ってみた

Clock Icon2025.03.25

いわさです。

最近さくらのクラウドでマネージドサービスがいくつかβリリースされており、興味があり色々と試しています。
先日はコンテナアプリケーションのホスティングサービスである AppRun を触ってみました。

https://dev.classmethod.jp/articles/sakura-apprun-beta/

本日は API ゲートウェイを触ってみたいと思います。
他のクラウドサービスにも類似のマネージドサービスがあるのでイメージしやすいと思いますが、Web API として公開する際に必要になる認証・認可やリクエスト・レスポンス変換などの機能を備えています。

https://manual.sakura.ad.jp/cloud/appliance/api-gateway/index.html

リソースの作成

まずはさくらのクラウドのコントロールパネル上からリソースの作成を行ってみます。
ダッシュボードの以下から作成ができます。

122AAFF6-78BB-4F79-B7A5-9395FC8532D5.png

まず最初にプランを選択するのですが、β期間である本日時点で選択できるのは「Trial」のみとなっています。
利用料金は無料ですが、作成できるサービスは 1 つまで、1 秒あたり 10 リクエストまでという制限があります。

17C9AA2D-6107-4297-BFD4-54EDB6D5272E.png

プランを選択したら API Gateway のコンソールが利用可能になるのですが、ここからはサービスとユーザー・グループが操作できます。
API Gateway リソース本体をサービスと呼ぶようです。ユーザーとグループについては後述しますが認証・認可のコントロールに使います。

4B01E4C0-AA7C-46D9-96BF-23FB41188FBF.png

新しくサービスを作成してみます。
どうやらサービスごとにバックエンドホストを指定する感じになるので、API Gateway の後ろのバックエンドを先に用意しておきます。
今回は AWS の API Gateway でサンプル API を用意しました。

image.png

 % curl https://6ry6wzc7bk.execute-api.ap-northeast-1.amazonaws.com/hoge/pets
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]%    

以下のようにホストに API Gateway のエンドポイントを、パスにはステージを設定しました。
認証設定はここでは特に設定せず、後ほど機能確認の際に設定してみます。

D7249AD6-F325-45E5-951C-70D67C6F89E4.png

なるほど、本日時点ではひとつのサービスにバックエンドホストはひとつみたいですね。
運用時には複数のバックエンドをひとつの API Gateway でまとめたくなりそうなのです。今後の機能追加でできるようになると良いですね。

ルートの設定

サービスを作成すると、その中にルートを作成することができます。

132F4600-BA6A-4FB7-85B1-9AF59CBB4521.png

先ほど cURL で使ったリソースを今回は検証してみます。/petsの GET メソッドですね。
次のように指定します。将来的にカスタムドメインなどの機能も欲しくなりそうです。

D5E2B629-0C85-4994-BF44-C329900315A3.png

また、ルートごとに詳細設定や IP 制限を行うことができます。
ルートごとに IP 制限できるの良いですね。管理者 API は IP アドレス制限するとか、使いたいところが多そうです。

7E8DAEA1-C01C-442E-92AD-BADEBC8D61C5.png

作成出来ました。即時反映されています。

9AE72E27-547E-40BE-A8D0-089F9AA6FE0A_4_5005_c.jpeg

 % curl https://site-nkl0usm0unjq499p.tk1.apigw.sakura.ne.jp/pets -i
HTTP/2 200 
content-type: application/json
content-length: 184
ratelimit-limit: 10
ratelimit-remaining: 9
ratelimit-reset: 1
x-ratelimit-limit-second: 10
x-ratelimit-remaining-second: 9
date: Mon, 24 Mar 2025 21:30:57 GMT
x-amzn-requestid: a42b8021-bdc1-406c-be47-e25d8d48d6c4
access-control-allow-origin: *
x-amz-apigw-id: H81KyEnnNjMEm8w=
x-amzn-trace-id: Root=1-67e1cf11-1fd8b5822bdc74b2698b8dc3
server: kong/3.8.0.0-enterprise-edition
x-kong-upstream-latency: 29
x-kong-proxy-latency: 246
via: 1.1 kong/3.8.0.0-enterprise-edition
x-kong-request-id: 1c2c736ed173fc0557e7cc514946db34

[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]

ヘッダーを観察する限り、どうやら内部的には OSS の API Gateway である「Kong Gateway」を使ってるみたいです。

https://docs.konghq.com/gateway/latest/

今回/petsのルートを追加しましたが、それ以外のパスについてはアクセスが出来ませんんでした。
そうしたい場合もありますが、一方でワイルドカードとかで広く指定したい場合もたまにあるので、今後そういったことができるようになると嬉しいかもしれない。

 % curl https://site-nkl0usm0unjq499p.tk1.apigw.sakura.ne.jp/
{
  "message":"no Route matched with those values",
  "request_id":"a897301b802bbd052a99800f1c0b2573"
}

リクエスト・レスポンス設定

以下からルートごとにリクエストとレスポンス情報の変換や削除・追加などが出来ます。

545D7EDD-A56E-46CB-B069-C1D631A214D5.png

今回バックエンドが Amazon API Gateway だったので、先ほどのレスポンスには AWS のカスタムヘッダーがいくつか含まれていました。これを消してみます。

レスポンス設定の Remove セクションでヘッダーキーを指定しました。

D12ECEAF-42F8-4BE9-AD57-B2FEF3086DE8.png

 % curl https://site-nkl0usm0unjq499p.tk1.apigw.sakura.ne.jp/pets -i 
HTTP/2 200 
content-type: application/json
content-length: 184
ratelimit-limit: 10
ratelimit-remaining: 9
ratelimit-reset: 1
x-ratelimit-limit-second: 10
x-ratelimit-remaining-second: 9
date: Mon, 24 Mar 2025 21:33:45 GMT
access-control-allow-origin: *
server: kong/3.8.0.0-enterprise-edition
x-kong-upstream-latency: 19
x-kong-proxy-latency: 3
via: 1.1 kong/3.8.0.0-enterprise-edition
x-kong-request-id: 4a1c305effdf3f25c7590805718e770c

[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]

AWS が出力するカスタムヘッダーが出力されなくなりました。
Body の編集などもできるみたいで、本当はpriceキーを削除するというのも試してみたかったのですが、配列レスポンスにおける指定の方法がわからなかった。今度また試してみます。

認証・認可

続いて認証・認可周りも軽く触ってみました。
個人的にこの機能非常に良いなと思ってます。

前提としてまず認証設定をサービスにしておきます。Basic 認証、HMAC 認証、JWT が選択できるようで、運用時には JWT を使うことが多いと思いますが、検証時あるいは一部 API ルートについては別の認証を使いたい場合もあります。

21CDC9B9-A1B2-49F5-AF12-616173CA1DD5.png

個人的におもしろいと思ったのが、API Gateway の中でユーザー管理をすることが出来て、ユーザーごとに認証情報を設定することができるという点です。ベーシック認証とかってつい一括で情報使い回してしまうことが多いと思うのですが、ユーザーごとに管理できるのが良いですね。

FAA657CE-CD34-4EC1-A9A4-83CC571D28A8.png

以下はユーザーごとのベーシック認証の様子です。管理されたユーザーだけが許可されていることがわかります。

 % curl https://site-nkl0usm0unjq499p.tk1.apigw.sakura.ne.jp/pets -u hoge0325user1:password
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]
 % curl https://site-nkl0usm0unjq499p.tk1.apigw.sakura.ne.jp/pets -u hoge0325user2:password
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]
 % curl https://site-nkl0usm0unjq499p.tk1.apigw.sakura.ne.jp/pets -u hoge0325user3:password
{"message":"Unauthorized"}

ルートごとに認可設定をする

で、先程のルートごとに認可設定を行うことが出来ます。
使い方としてはルートごとに認可するグループを指定する形です。

image.png

ユーザーごとに複数のグループに所属することが出来まして、今回はユーザー1のみ認可されたグループに所属させてみました。

DCEF12D8-3A1E-4BF0-9AEB-CE662A66552D.png

cURL でリクエストしてみましょう。先程はユーザー1もユーザー2も許可されていましたが、どうかな。

 % curl https://site-nkl0usm0unjq499p.tk1.apigw.sakura.ne.jp/pets -u hoge0325user1:password
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]
 % curl https://site-nkl0usm0unjq499p.tk1.apigw.sakura.ne.jp/pets -u hoge0325user2:password
{
  "message":"You cannot consume this service",
  "request_id":"53208d3721b45e137360a746ba73d565"
}

先ほどまで許可されていたユーザー2が拒否されましたね。認可されたグループに所属していないためです。
この認証認可周りの設定や機能、直感的で使いやすいです。

さいごに

本日はさくらのクラウドの「APIゲートウェイ」を使ってみたので基本的な使い方を紹介しました。

まずユーザーインターフェースがシンプルで使いやすいですね。コントロールパネルの操作性も良くてストレスを感じる部分がありませんでした。

リクエスト・レスポンス設定のあたりの設定方法に少し迷ったり、ユースケースによっては追加の機能が欲しいなという部分もあるのでそういった点はβ期間中なのでどんどんフィードバックしていきたいですね。今後の機能改善が非常に楽しみです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.