#はじめに
APIの開発と管理を行うためのプラットフォームであるApigeeを試してみます。
#試したこと
以下の項目を試してみました。公式のドキュメントURLも貼っておきます。
1.チュートリアル通りHello world!
https://docs.apigee.com/api-platform/get-started/get-started?hl=ja
2.ターゲットをCloud Functionsに変更
https://cloud.google.com/functions/docs/tutorials/http?hl=ja
3.スロットリング
https://docs.apigee.com/api-platform/reference/policies/spike-arrest-policy
4.APIキーで認証
https://docs.apigee.com/api-platform/reference/policies/verify-api-key-policy
5.ターゲットのCloud Functionsに認証を追加
https://docs.apigee.com/api-platform/reference/endpoint-properties-reference
6.ターゲットのCloud Functionsに認証を追加 w/Extensions
https://docs.apigee.com/api-platform/tutorials/add-extension/intro?hl=ja
https://docs.apigee.com/api-platform/reference/extensions/google-cloud-functions/google-cloud-functions-extension-105
#1.チュートリアルでHello world!
以下のチュートリアル通りやってみたいと思います。
https://docs.apigee.com/api-platform/get-started/get-started?hl=ja
評価版を選択してサインアップしたあと、API Proxyを作成します。
左のペインからAPI Proxiesを選択します。
以下の種類から選択できます。チュートリアル通りにReverse proxyを選択します。
No Targetってどんな時に使うのかよくわからなかったですが、後ほど試すExtension使った構成のときに使いました。
Nameを「getstarted」にして、Targetに「https://mocktarget.apigee.net」」を指定します。
Pass throughを選択し、認証なしでAPIを実行できるようにします。
Deploy Environmentsの横のtest環境を選択し、Build and Deployをクリックします。
API Proxyが作成されます。
curlコマンドを実行し「Hello, Guest!」が表示されることを確認します。
$ curl https://*****.apigee.net/getstarted
Hello, Guest!
#2.ターゲットをCloud Functionsに変更
以下を参考にCloud Functionを作成します。テストなので未認証でInvokeできるようにします。
https://cloud.google.com/functions/docs/tutorials/http?hl=ja
curlコマンドで確認するとHellow world!が返されます。
$ curl https://***.cloudfunctions.net/helloGET
Hello World!
先ほど作成したAPI ProxyのターゲットをCloud Functionに変更します。
https://docs.apigee.com/api-platform/get-started/change-endpoint?hl=ja
右上になるDeveloperタブをクリックして、Target endpointをクリックして、URLを作成したCloud FunctionsのURLに変更してSaveをクリックします。
curlコマンドを実行し「Hello, World!」が表示されることを確認します。
$ curl https://***.apigee.net/getstarted
Hello World!
#3.スロットリング
https://docs.apigee.com/api-platform/reference/policies/spike-arrest-policy
Proxy EndpointののPreFlowでHookするため、Proxy EndpointののPreFlowをクリックし右上の+Stepをクリックします。
ちなみに似たようなPoicyが3つあります。
*QuotaとSpike ArrestとConcurrent Rate Limitの使い分け
https://docs.apigee.com/api-platform/develop/comparing-quota-spike-arrest-and-concurrent-rate-limit-policies
以下の記事がわかりやすかったです!ありがとうございます!
https://apps-gcp.com/apigee-traffic-management-policy/
今回はテストなので、Rateを1psにします。これは1分間に1リクエストに制限する設定になります。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SpikeArrest async="false" continueOnError="false" enabled="true" name="Spike-Arrest-1">
<DisplayName>Spike Arrest-1</DisplayName>
<Rate>1ps</Rate>
</SpikeArrest>
Saveします。
Proxy EndpointのXMLに、Spike Arrest-1が追加されていることを確認します。
レスポンスコードを確認するために右上のTRACEタブをクリックし、GETメソッドをSendします。
5回くらいSENDすると429 Too Many Requestsが返されます。
*マニュアルだと500が返るってことになってるが、、🤔
- Quota ポリシーと SpikeArrest ポリシーの場合、レート上限を超えていることを表すデフォルトの HTTP ステータス コードは汎用の 500 Internal Server Error になります。このポリシーのステータス コードを 429 Service Unavailable に変更するには、組織レベルのプロパティ(features.isHTTPStatusTooManyRequestEnabled)を追加します。クラウドをご利用のお客様は、Apigee サポートに連絡してプロパティの有効化を依頼してください
#4.APIキーで認証
https://docs.apigee.com/api-platform/reference/policies/verify-api-key-policy
API EndpointのPreFlowをクリックして、Verify API KeyをクリックしてAddします。
Saveして新しいRevisionを作成し、Test環境にデプロイします。
curlコマンドで確認するとAPI keyが指定されていないためエラーになります。
$ curl https://***.apigee.net/getstarted
{"fault":{"faultstring":"Failed to resolve API Key variable request.queryparam.apikey","detail":{"errorcode":"steps.oauth.v2.FailedToResolveAPIKey"}}}
##APIキーを発行します。
DeveloperとApp productとAppと言うものを作成するのですが、関係性のイメージは以下の様な感じです。
Publish>Developer>+Developerをクリックし開発者を追加します。
Publish>API Products+API Productをクリックし、API Productを作成します。
Product Name: getstarted
Display Name: getstarted
Description: getstarted
Environment: test
Access: Private
API Proxies: getstarted
Publish>Apps>+Appをクリックし、APPを作成します。
Name: getstarted
Display Name: getstarted
Developer: 先程作成した開発者
Product: getstarted
curlでAPI Keyを追加して確認してみるとエラーなくレスポンスが取得できます。
$ curl https://***.apigee.net/getstarted/?apikey=el0eZGCgx4ms5xJPrAAYN**********
Hello World!
#5.バックエンドのCloud Functionsに認証を追加
そもそものCloud Functionsにおける認証はIAMで管理できます。
まずは、既存の関数で認証を必須にします。
Google cloud consoleで対象のCloud Functionsを選択し、Cloud Functions InvokerからallUserを削除します。
また、任意のサービスアカウントにもしくはユーザアカウントにCloud Functions InvokerのIAMロールを付与します。
この状態でAuthorizationなしでアクセスするとエラーになります。
$ curl https://***.cloudfunctions.net/helloGET
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>403 Forbidden</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Forbidden</h1>
<h2>Your client does not have permission to get URL <code>/helloGET</code> from this server.</h2>
<h2></h2>
</body></html>
Authorizationありでアクセスすると成功します。
$ curl https://***.cloudfunctions.net/helloGET -H "Authorization: bearer $(gcloud auth print-identity-token )"
Hello World!
もちろん現状のままAPI ProxyのEndpointにアクセスするとTarget Endpoint(=Cloud Functions)のエラーが返ります。
$ curl https://***.apigee.net/getstarted/?apikey=el0eZGCgx4ms5***********
<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>403 Forbidden</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Forbidden</h1>
<h2>Your client does not have permission to get URL <code>/helloGET?apikey=el0eZGCgx4ms5xJPrAA*******</code> from this server.</h2>
<h2></h2>
</body></html>
API Proxyの設定を変更します。対象のAPI Proxyを選択し、Target EndpointのRequest Header設定でAuthorizationをターゲット サービスへの送信リクエストに引き継ぐ設定します。
###Extension使えば簡単に設定できますが、勉強のためやってみます。
https://docs.apigee.com/api-platform/reference/endpoint-properties-reference
Property name="request.retain.headersを設定します。
<HTTPTargetConnection>
<URL>https://***.cloudfunctions.net/helloGET</URL>
<Properties>
<Property name="request.retain.headers">Authorization</Property>
</Properties>
</HTTPTargetConnection>
</TargetEndpoint>
Authorizationヘッダーを指定してcurlコマンドを実行すると、ターゲット(=Cloud Function)まで認証情報が連携され成功します。
curl https://***.apigee.net/getstarted/?apikey=el0eZGCgx4ms5xJPrAAYN******* -H "Authorization: bearer $(gcloud auth print-identity-token )"
Hello World!
#6. バックエンドのCloud Functionsに認証を追加 w/Extension
先ほどは、request.retain.headersで認証情報を渡してましたが、ApigeeにGCPの認証情報を保持してターゲットにアクセスする際にその認証情報を使う構成の方がスマートです。Google Cloud Functions 拡張機能を使うと、Apigee側に認証情報を保持できます。
https://docs.apigee.com/api-platform/reference/extensions/google-cloud-functions/google-cloud-functions-extension-105
設定方法は以下のマニュアルに記載があります。
https://docs.apigee.com/api-platform/tutorials/add-extension/intro?hl=ja
前提作業として、Cloud Function Invoker roleが付与されたサービスアカウントを作成して、Create Keyして認証用のJOSNファイルをダウンロードします。
次にExtensionを作成します。Extensionbは連携したいGCPやAWSサービスのクレデンシャル情報などの設定情報を保持します。
Admin>Extensions>+ Add Extensionをクリックします。
Environment Configurationsでtest環境をクリックします。
Credentialとして、先程ダウンロードしたJSONファイルの内容を入力してSaveします。
テスト用に新規にAPI Proxyを作成します。
Develop>API Proxies>+Proxyをクリックします。
ターゲット設定は、Extensionのポリシーで定義するためNo Targetで作成します。
デフォルトのまま次にすすんで、ExtensionがDeployされてるtest環境を選択してCreate and deployします。
作成したAPI ProxyのDevelopmentタブからPreFlowにExtension Calloutポリシーを追加します。
Extensionは、作成したExtensionを指定し、ActionはInvokeを選択しAddします。
API Proxyの設定をSaveして、Traceタブでテストします。正しくInvokeできました。
#投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。