Help us understand the problem. What is going on with this article?

Apigeeはじめました その1 HelloWorld, API Keyでの認証, Cloud Function, スロットリング, Extensionを使ったCloud Functionとのインテグレーション

はじめに

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を選択します。
image.png

以下の種類から選択できます。チュートリアル通りにReverse proxyを選択します。
image.png
No Targetってどんな時に使うのかよくわからなかったですが、後ほど試すExtension使った構成のときに使いました。

Nameを「getstarted」にして、Targetに「https://mocktarget.apigee.net」」を指定します。
image.png

Pass throughを選択し、認証なしでAPIを実行できるようにします。
image.png

デフォルトのままで次へ。
image.png

Deploy Environmentsの横のtest環境を選択し、Build and Deployをクリックします。
image.png

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

作成済みのAPI proxyクリックします。
image.png

右上になるDeveloperタブをクリックして、Target endpointをクリックして、URLを作成したCloud FunctionsのURLに変更してSaveをクリックします。
image.png

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をクリックします。

image.png

デフォルトだと以下のようなイメージで組まれています。
image.png

Spike Arrestを選択しAddします。
image.png

ちなみに似たような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が追加されていることを確認します。
image.png

レスポンスコードを確認するために右上のTRACEタブをクリックし、GETメソッドをSendします。
image.png

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します。
image.png

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と言うものを作成するのですが、関係性のイメージは以下の様な感じです。
image.png

Publish>Developer>+Developerをクリックし開発者を追加します。
image.png

Publish>API Products+API Productをクリックし、API Productを作成します。
Product Name: getstarted
Display Name: getstarted
Description: getstarted
Environment: test
Access: Private
API Proxies: getstarted

image.png

Publish>Apps>+Appをクリックし、APPを作成します。
Name: getstarted
Display Name: getstarted
Developer: 先程作成した開発者
Product: getstarted

image.png

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を削除します。
image.png

また、任意のサービスアカウントにもしくはユーザアカウントにCloud Functions InvokerのIAMロールを付与します。
image.png

この状態で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をクリックします。
image.png

Google Cloud Functionを選択します。
image.png

名前を入力します。
image.png

Environment Configurationsでtest環境をクリックします。
image.png

Credentialとして、先程ダウンロードしたJSONファイルの内容を入力してSaveします。
image.png

Deployをクリックします。
image.png

数分待つとDeployが完了します。
image.png

テスト用に新規にAPI Proxyを作成します。
Develop>API Proxies>+Proxyをクリックします。
image.png

ターゲット設定は、Extensionのポリシーで定義するためNo Targetで作成します。
image.png

名前を入力します。
image.png

デフォルトのまま次にすすんで、ExtensionがDeployされてるtest環境を選択してCreate and deployします。
image.png

作成したAPI ProxyのDevelopmentタブからPreFlowにExtension Calloutポリシーを追加します。
Extensionは、作成したExtensionを指定し、ActionはInvokeを選択しAddします。
image.png

API Proxyの設定をSaveして、Traceタブでテストします。正しくInvokeできました。

image.png

投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした