
始める前に
- ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
- ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
- 画面左上の [ラボを開始] をクリックして開始します
Create the API proxy
/ 20
Add policies to verify tokens
/ 10
Add policies to generate tokens
/ 10
Deploy the API proxy
/ 10
Add the API product and create an app
/ 20
Add the SpikeArrest policy
/ 10
Add error handling
/ 20
Apigee は API の開発と管理を行うためのプラットフォームです。Apigee では、API へのアクセスを保護し、アクセスのレート制限を行うことができます。また、API データへの内部アクセスを保護するための機能も備わっています。
このラボでは、アクセスに対して OAuth トークンを要求する API を作成します。SpikeArrest ポリシーを使用してアプリケーション別に API 呼び出しのレートを制限し、プライベート変数とデータ マスキングを使用して、API トラフィックをデバッグするユーザーに機密データが表示されないようにします。
このラボでは、次のタスクの実行方法について学びます。
こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは、Google Cloud のリソースを利用できる時間を示しており、[ラボを開始] をクリックするとスタートします。
このハンズオンラボでは、シミュレーションやデモ環境ではなく実際のクラウド環境を使って、ラボのアクティビティを行います。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。 左側の [ラボの詳細] ペインには、以下が表示されます。
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
[ラボの詳細] ペインでもユーザー名を確認できます。
[次へ] をクリックします。
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
[ラボの詳細] ペインでもパスワードを確認できます。
[次へ] をクリックします。
その後次のように進みます。
その後、このタブで Google Cloud コンソールが開きます。
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン をクリックします。
ウィンドウで次の操作を行います。
接続した時点で認証が完了しており、プロジェクトに各自の Project_ID、
gcloud
は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
出力:
出力:
gcloud
ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。
Apigee コンソールを開くには、次の手順に沿って操作します。
Apigee
」と入力し、検索結果で [Apigee API Management] をクリックします。Apigee コンソールが開き、よく使用される場所へのクイックリンクがランディング ページに表示されます。
Apigee がナビゲーション メニューに固定されます。
このタスクでは、バックエンド サービスのファサードとして機能する Apigee API プロキシを作成します。API プロキシでは、サービス アカウントを使用して、Cloud Run サービスに OpenID Connect ID トークンを提示できるようにします。
simplebank-rest
という名前のバックエンド サービスがすでに作成され、Cloud Run にデプロイされています。サービス アカウントもすでに作成されています。
Cloud Shell で、バックエンド サービスの URL を取得するために次のコマンドを実行します。
API プロキシを作成する際に使用するため、この URL を保存します。
Cloud コンソールで Apigee UI に移動します。
左側のナビゲーション メニューで、[プロキシ開発] > [API プロキシ] を選択します。
プロキシ ウィザードを使用して新しいプロキシを作成するには、[+Create] をクリックします。
バックエンド サービスのリバース プロキシを作成します。この API プロキシは、OpenAPI 仕様を使用して API のスケルトンを作成します。
[Proxy template] ボックスの [OpenAPI spec template] で、[Reverse proxy (Most common)] を選択します。
OpenAPI ファイルの場合は、ブラウザで URL を開くと、OpenAPI 仕様 YAML ファイルがパソコンにダウンロードされます。
[参照] をクリックし、パソコンから [OpenAPI ファイル] を選択して [次へ] をクリックします。
[Proxy details] で次のように指定します。
プロパティ | 値 |
---|---|
Proxy name | bank-v1 |
Base path | /bank/v1 |
Description | SimpleBank read-only API |
Target (Existing API) | バックエンド URL |
ターゲットには、このタスクですでに取得したバックエンド URL を指定する必要があります。ターゲットは、次のようになります。
[次へ] をクリックします。
[Flows(Optional)] で、すべての GET オペレーションを選択し、[次へ] をクリックします。
その他の設定はデフォルトのままにして、[Create] をクリックします。
[Develop] タブをクリックします。
バックエンド サービスは認証アクセスを必要とするようにデプロイされているため、有効な OpenID Connect の ID トークンがなければサービスを呼び出すことができません。
HTTPTargetConnection でサービスのバックエンド ターゲットを指定します。
プロキシの [Navigator] メニューで、[Target Endpoints] セクションの [PreFlow] をクリックします。
次のコードを探します(URL は異なります)。
URL の下に、次のような Authentication セクションを追加します。
AUDIENCE は、HTTPTargetConnection セクションにすでにある URL 値に置き換えます。コードは、URL 要素と Audience 要素の独自の URL を除いて、次のようになります。
[Save] をクリックします。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
このタスクでは、OAuthV2 ポリシーを API プロキシに追加します。VerifyJWTAccessToken オペレーションを使用する OAuthV2 ポリシーは、実行時にアクセス トークンの検証を強制的に適用して、有効な OAuth アクセス トークンを持つアプリケーションのみが API にアクセスできるようにします。
OAuthV2 ポリシーでは、opaque トークンと JSON ウェブトークン(JWT)の両方を作成して検証できます。この API プロキシは、アクセス トークンに JWT を使用します。
プロパティ セットに、JWT を作成および検証する際に使用される署名シークレットが格納されます。
JWT の署名には、ハッシュベースのメッセージ認証コード(HMAC)が使用されます。この種の暗号署名にはシークレットが必要です。
プロキシの [Navigator] メニューで、[Resources] の横にある [+] をクリックします。
[Resource Type] のプルダウンで [Property Set
] を選択します。
[Resource Name] に oauth.properties
を指定して、[Add] をクリックします。
oauth.properties コードペインで、次のプロパティを追加します。
フロー変数 propertyset.oauth.secret を使用して、コード内でこの値にアクセスできます。
署名シークレットはプライベート変数に入れて OAuth ポリシーに提供する必要がありますが、propertyset.oauth.secret 変数はプライベートではありません。この AssignMessage ポリシーは、プロパティ セット変数からプライベート変数を作成します。
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [default] の下にある [PreFlow] をクリックします。
デフォルトのプロキシ エンドポイントのリクエスト PreFlow が、API プロキシにリクエストが届いたときに最初に実行されるフローです。
OAuthV2 ポリシーはシークレットを必要とし、API プロキシで非常に早い段階で実行されます。
[Flow] ペインで、リクエスト フローの [PreFlow] のすぐ横にある [+] ボタンをクリックします。
[Create new Policy] を選択し、[Select policy] プルダウンで [Mediation] セクションの [Assign Message] を選択し、[Display Name] と [Name] を AM-GetSecret
に設定します。
[Add] をクリックします。ナビゲーション メニューの [Policies] で [AM-GetSecret
] をクリックします。
AssignMessage ポリシー構成が [Code] ペインに表示されます。
ポリシー構成を次のように変更します。
AssignVariable 設定により、propertyset.oauth.secret 変数が private.secretkey 変数にコピーされます。
propertyset.oauth.secret が解決できない場合は、IgnoreUnresolvedVariables 設定により AssignMessage ポリシーからエラーが生成されます。
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [default] の下にある [PreFlow] をクリックします。
OAuthV2 ポリシーは AssignMessage ポリシーより後に実行する必要があります。
[Flow] ペインで、リクエスト フローの [PreFlow] のすぐ横にある [+] ボタンをクリックします。
[Create new policy] を選択し、[Select policy] プルダウンで [Security] セクションの [OAuth v2.0] を選択し、[Display Name] と [Name] を OA-VerifyToken
に設定します。
[Add] をクリックし、ナビゲーター メニューの [Policies] から [OA-VerifyToken] をクリックします。
OAuthV2 ポリシー構成が [Code] ペインに表示されます。
OAuthV2 ポリシー構成を次のように変更します。
この構成は、JWT アクセス トークンが HS256(HMAC-SHA256)アルゴリズムを使用し、AssignMessage ポリシーで作成されたプライベート変数をシークレット キーとして使用することを指定します。
[Save] をクリックします。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
ここではさらに、JWT トークンの作成を許可するために独立したプロキシ エンドポイントを API プロキシに追加します。
本番環境では通常、トークンを生成するために別個のプロキシが作成されます。このラボでは、同じ API プロキシ内の別のプロキシ エンドポイントにトークン生成フローを作成します。
プロキシの [Navigator] メニューで、[Proxy Endpoints] 行の [+] ボタンをクリックします。
新しい JWT の作成時に使用される新しいプロキシ エンドポイントが作成されます。
[Name] に「token
」と指定し、[Add] をクリックします。
token という名前の新しいプロキシ エンドポイントが [Code] ペインに表示されます。
token フロー構成全体を変更します。元の構成は次のようになっています。
これを、次のように変更します。
[Save] をクリックします。
更新されたこの構成により、次の 2 つの変更が行われます。
/token
に設定されます。これが、トークンの作成時に使用されるベースパスです。プロキシのフローで、[Proxy Endpoints: token] セクションの [/token] のすぐ横にある [+] をクリックします。
新しい条件フローに、次の値を指定します。
プロパティ | 値 |
---|---|
Flow Name | generateToken |
Condition Type | [Custom] を選択 |
[Condition] で、次の値を指定します。
有効なクライアント認証情報トークン リクエストのみが許可されます。
[Add] をクリックします。
トークンを生成する OAuthV2 ポリシーは、private.secretkey 変数へのアクセスも必要とします。
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [token] の下にある [generateToken] をクリックします。
[Flow] ペインで、リクエスト フローの [generateToken] の横にある右側の [+] ボタンをクリックします。
[Select Policy] で [Select Existing policy] を選択し、[AM-GetSecret] をクリックします。
[Add] をクリックします。
同じ AssignMessage ポリシーがトークン プロキシ エンドポイント PreFlow に接続されます。
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [token] の下にある [generateToken] をクリックします。
[Flow] ペインで、リクエスト フローの [generateToken] の横にある右側の [+] ボタンをクリックします。
[Select Policy] で [Create new policy] を選択し、[Security] セクションで [OAuth v2.0] を選択した後、[Display Name] と [Name] を OA-GenerateToken
に設定します。
[Add] をクリックし、[Policies] から [OA-GenerateToken] をクリックします。
OAuthV2 ポリシー構成が [Code] ペインに表示されます。
OAuthV2 ポリシー構成を次のように変更します。
この構成によって、30 分間で有効期限が切れる JWT OAuth トークンを作成できるようになります。
プロキシのフローで、[Proxy Endpoints: token] セクションの [/token] のすぐ横にある [+] をクリックします。
新しい条件フローに、次の値を指定します。
プロパティ | 値 |
---|---|
Flow Name | invalidRequest |
Condition Type | [Custom] を選択 |
Condition | DELETETHIS |
無効な generateToken リクエストはすべてこのフローを通過する必要があるため、フローが追加されると条件が削除されます。
[Add] をクリックします。
invalidRequest フローで、次の行を削除します。
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [token] の下にある [invalidRequest] をクリックします。
[Flow] ペインで、リクエスト フローの [invalidRequest] のすぐ横にある [+] ボタンをクリックします。
[Create new policy] を選択し、[Mediation] セクションで [Raise Fault] を選択した後、[Display Name] と [Name] を RF-InvalidTokenRequest
に設定します。
[Add] をクリックし、[Policies] から [RF-InvalidTokenRequest] をクリックします。
RaiseFault ポリシー構成が [Code] ペインに表示されます。
RaiseFault ポリシー構成を次のように変更します。
この変更により、リクエストが無効だった場合に 400 Bad Request レスポンスが返されるようになります。
[Save] をクリックします。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
このタスクでは、API プロキシをデプロイして、アクセスの際に OAuth トークンが要求されるようにします。
Cloud Shell で、次のコマンドセットを貼り付けて実行します。
この一連のコマンドでは、Apigee API を使用して、Apigee ランタイム インスタンスが作成されて eval 環境がアタッチされたことを確認します。
インスタンスが使用可能になるまで待ちます。
***ORG IS READY TO USE***
というテキストが表示されたら、インスタンスは使用可能です。ラボを開始する前にすでに Apigee 組織が作成されていることがあります。その場合はインスタンスが作成されるまで待つ必要はありません。
組織の準備が整うまで待つ場合は、その間に、OAuth、SpikeArrest ポリシー、データのマスキングと非表示、opaque トークンと JWT の詳細をご覧ください。
Cloud コンソールで Apigee に移動します。
左側のナビゲーション メニューで、[プロキシ開発] > [API プロキシ] を選択し、[bank-v1] をクリックします。
[Develop] タブをクリックします。
[Deploy] をクリックし、[Environment] で [eval] を選択します。
デプロイの確認を求めるダイアログが表示されます。
[Service Account] に、サービス アカウントのメールアドレスを指定します。
[Deploy]、[Confirm] の順にクリックします。
[Overview] タブをクリックして eval のデプロイ ステータスを確認し、プロキシがデプロイされたと示されるまで待ちます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Apigee 組織の eval 環境は、eval.example.com というホスト名を使用して呼び出すことができます。このホスト名を Apigee ランタイム インスタンスの IP アドレスに解決する DNS エントリは、すでにプロジェクト内に作成されています。この DNS エントリは限定公開ゾーンに作成されているため、内部ネットワーク上でのみ表示されます。
Cloud Shell は内部ネットワークに存在しないため、Cloud Shell コマンドではこの DNS エントリを解決できません。組織内の仮想マシン(VM)であれば限定公開ゾーンの DNS にアクセスでき、apigeex-test-vm という名前の VM が自動的に作成されています。このマシンを使用して API プロキシを呼び出すことができます。
Cloud Shell で、テスト VM への SSH 接続を開きます。
承認するよう求められた場合は、[承認] をクリックします。
Cloud Shell で確認されるすべての項目について、Enter キーまたは Return キーを押して、デフォルトの入力を指定します。
プロジェクトのオーナーとしてログインしているため、このマシンへの SSH は許可されます。
これで、Cloud Shell セッションが VM 内で実行できるようになります。
eval 環境にデプロイした bank-v1 API プロキシを呼び出します。
-k
オプションを指定すると、curl は TLS 証明書の検証をスキップします。このラボの Apigee ランタイムでは、信頼できる認証局(CA)によって作成された証明書ではなく、自己署名証明書を使用します。
-k
オプションを使用して証明書の検証を省略することは避けてください。
この API は、顧客リストを取得しようとします。次のような 401 Unauthorized レスポンスが表示されます。
このレスポンスは、アクセス トークンが提供されなかったためにバックエンド サービスへのアクセスが API プロキシによってブロックされたことを示しています。
コマンド exit
を入力して SSH セッションを終了し、Cloud Shell に戻ります。
このタスクでは、API へのアクセスを提供する API プロダクトを追加します。また、デベロッパーと、API プロダクトに関連付けるアプリケーションも作成します。
Cloud コンソールで Apigee に移動します。
ナビゲーション メニューで、[配布] > [API プロダクト] を選択します。
新しい API プロダクトを作成するには、[+Create] をクリックします。
[Product details] ペインで、以下を指定します。
プロパティ | 値 |
---|---|
Name | bank-readonly |
Display Name | bank (read access) |
Environment | [eval] を選択 |
Access | [Public] を選択 |
[Automatically approve access requests] は選択したままにします。
[Operations] セクションで、[+Add an Operation] をクリックします。
オペレーションは、API プロダクトに関連付けられているアプリケーションに対してどの API プロキシのどのリクエストを許可するかを指定するために使用されます。
以下を指定します。
プロパティ | 値 |
---|---|
API Proxy | bank-v1 API プロキシを選択 |
Path | /** |
Methods | GET を選択 |
パス式 /\*\*
は、ベースパスに一致するすべてのリクエストが許可されることを示します。
本番環境では、このワイルドカード パス式を使用せずに、許可する各オペレーションを個別に追加することもできます。
[Save] をクリックして、オペレーションを保存します。
API プロダクトを保存するには、[Products Detail] ページの上部で [Save] をクリックします。
[配布] > [API プロダクト] ページに戻ります。
API プロダクトがリストに表示されます。
アプリを作成する前に、アプリ デベロッパーを作成する必要があります。
左側のナビゲーション メニューで [配布] > [デベロッパー] をクリックします。
新しいアプリ デベロッパーを作成するには、[+Create] をクリックします。
以下を指定します。
プロパティ | 値 |
---|---|
First Name | Joe |
Last Name | Developer |
Username | joe |
joe@example.com |
[Add] をクリックしてアプリ デベロッパーを作成します。
左側のナビゲーション メニューで [配布] > [アプリ] をクリックします。
新しいアプリを作成するには、[+Create] をクリックします。
[App details] ペインで、以下を指定します。
プロパティ | 値 |
---|---|
Name | readonly-app |
Developer | joe@example.com を選択 |
[Credentials] ペインで、[Add credentials > Add products] をクリックし、プルダウンから [bank (read access)] を選択し、[Add] をクリックして追加します。
右上の [Create] をクリックしてアプリを作成します。
これで、アプリのキーとシークレットが構成されました。
[Key] と [Secret] の隣にある [Show] アイコンをクリックします。
この API には OAuth アクセス トークンが必要です。キーとシークレットは、アプリに OAuth アクセス トークンの作成を許可する、アプリの認証情報として使用されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud Shell で、テスト VM への SSH 接続を開きます。
承認するよう求められた場合は、[承認] をクリックします。
これで、Cloud Shell セッションが VM 内で実行されます。
アプリケーションのコンシューマ キーとシークレットを取得するには、次のコマンドを実行します。
最初のコマンドでは、gcloud 構成を読み取って現在のプロジェクトを取得します。2 番目と 3 番目のコマンドは、Apigee API を使用してコンシューマ キーとシークレットを取得します。ログインしているユーザーのアクセス許可を持つアクセス トークンを送信するため、リクエストは承認されます。
OAuth クライアント認証情報付与タイプの場合は、アクセス トークンを生成するために、クライアント アプリケーションが Authorization ヘッダーでコンシューマ キーとシークレットを送信する必要があります。
JWT アクセス トークンを生成するには、次のコマンドを実行します。
最初のコマンドは、トークン エンドポイントを呼び出して、そのレスポンスを保存します。トークンは JSON レスポンスから抽出されて、JWT_TOKEN に保存されます。
JWT トークンを使用してリクエストをテストするには、次のコマンドを使用します。
API 呼び出しから顧客のリストが返されます。
コマンド exit
を入力して SSH セッションを終了し、Cloud Shell に戻ります。
このタスクでは、API プロダクトの割り当て構成を使用する SpikeArrest ポリシーを追加して、API 呼び出しのレートを制限します。
SpikeArrest ポリシーで、許可される最大トラフィック レートを指定することによって、トラフィックの急増から API とバックエンドを保護します。このポリシーによって、処理しきれないほど大量のトラフィックがバックエンドに到達するのを防ぐことができます。
この SpikeArrest ポリシーは、/token API への呼び出しのトラフィックに対する全般的なレート制限を指定します。
Cloud コンソールで Apigee に移動します。
左側のナビゲーション メニューで、[プロキシ開発] > [API プロキシ] を選択し、[bank-v1] をクリックします。
[Develop] タブをクリックします。
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [token] の下にある [PreFlow] をクリックします。
SpikeArrest ポリシーは、条件フローポリシーより前に実行される必要があります。
[Flow] ペインで、リクエスト フローの [PreFlow] のすぐ横にある [+] ボタンをクリックします。
[Create new policy] を選択し、[Traffic Management] セクションから [Spike Arrest] を選択した後、[Display Name] と [Name] を SA-LimitTokenRate
に設定します。
[Add] をクリックし、[Policies] セクションの SA-LimitTokenRate をクリックします。
SpikeArrest ポリシー構成が [Code] ペインに表示されます。
SpikeArrest ポリシー構成を次のように変更します。
この構成では、許可されるリクエストの最大レートが 1 分あたり 5 件と指定されています。すべてのトラフィックに、この SpikeArrest ポリシーの制限が適用されます。
UseEffectiveCount が false に設定されているため、SpikeArrest ポリシーでトークン バケット アルゴリズムを使用するように指定されています。トラフィックは、レートをより短い間隔に分割することで平滑化されます。1 分あたり 5 件のリクエストとは、1/5 分あたり 1 件のリクエスト、つまり 12 秒ごとに 1 件のリクエストということです。2 番目のリクエストが前のリクエストから 12 秒経過しないうちに Message Processor に到達した場合、そのリクエストは拒否されることがあります。
この SpikeArrest ポリシーは、/bank/v1 API への呼び出しのトラフィックに対するレート制限を指定します。このレートはアプリケーションごとに適用されます。
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [default] の下にある [PreFlow] をクリックします。
SpikeArrest ポリシーは呼び出しの初期に実行されますが、アプリケーションに応じてレートを制限するために、OAuthV2 VerifyJWTAccessToken ポリシーより後に実行される必要があります。
[Flow] ペインで、リクエスト フローの [PreFlow] のすぐ横にある [+] ボタンをクリックします。
[Create new policy] を選択し、[Traffic Management] セクションから [Spike Arrest] を選択した後、[Display Name] と [Name] を SA-LimitRateByApp
に設定します。
[Add] をクリックし、[Policies] セクションの SA-LimitRateByApp をクリックします。
SpikeArrest ポリシー構成が [Code] ペインに表示されます。
SpikeArrest ポリシー構成を次のように変更します。
前のポリシーと同様に、この構成では、許可されるリクエストの最大レートが 1 分あたり 5 件と指定されています。ただし、このポリシーでは Identifier が指定されているため、SpikeArrest のレートは client_id ごとに個別に維持されます。クライアント ID は OA-VerifyToken ポリシーによって設定され、デベロッパー アプリケーションごとに一意です。
UseEffectiveCount が true に設定されているため、リージョン内のすべてのトラフィックについてレート数が維持されます。このポリシーは、各期間に受け取ったリクエストのカウンタを保持します。期間は、1 分あたりのリクエスト数のレートを使用している場合、1 分です。レートの計算は、スライディング ウィンドウに基づきます。
上記の例で、1 分あたり 50 件のリクエストというレートを使用しているとします。カウンタは 1 分の期間を使用します。ただし、レートが 1 秒あたりで指定されている場合は、カウンタ期間は 1 秒になります。矢印で示されているように、現時点でこの 1 分の期間のうち 10 秒が経過しているとします。前の 1 分の期間には 48 件のリクエストがあり、現在の期間ではこれまでに 5 件のリクエストがありました。
新たなリクエストを許可するには、レートが 1 分あたり 50 件未満のリクエストである必要があります。計算されたレートは次のようになります。
request_rate = (48 × (60-10)/60) + 6 = 46
現在の期間では 60 秒のうち 10 秒しか経過していないので、残りの 50 秒については前の期間のレートを使用して計算されます。48 の 5/6 は 40 です。リクエストが許可されたとすると、現在の期間のカウントは 5 + 1、つまり 6 になります。リクエスト レートの計算結果は 46 となり、これは 1 分あたり 50 件未満のリクエスト レートなので、リクエストは許可されることがわかります。
[Save] > [Save as new revision] を選択します。
[Deploy] をクリックし、[Environment] で [eval] を選択します。
[Service Account] に、サービス アカウントのメールアドレスを指定します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud Shell で、テスト VM への SSH 接続を開きます。
承認するよう求められた場合は、[承認] をクリックします。
これで、Cloud Shell セッションが VM 内で実行されます。
アプリケーションのコンシューマ キーとシークレットを取得するには、次のコマンドを実行します。
次のコマンドを繰り返し実行して、複数のアクセス トークンを生成します。
すぐに、レートを超過したことを示す 429 Too Many Requests レスポンスを受け取ります。このポリシーでは UseEffectiveCount が false なので、トークン バケット アルゴリズムを使用してトラフィックが平滑化されます。5 番目のリクエストの前に、Spike Arrest の違反が発生するでしょう。
JWT アクセス トークンを保存するには、次のコマンドを実行します。
API 呼び出しに対して SpikeArrest ポリシーをテストするには、次のコマンドを繰り返し送信します。
UseEffectiveCount が true なので、このポリシーではスライディング ウィンドウ アルゴリズムが使用されます。リクエストがブロックされるまでに、5 件のリクエストに成功するはずです。
コマンド exit
を入力して SSH セッションを終了し、Cloud Shell に戻ります。
このタスクでは、データマスクを作成して、デバッグ セッションで特定の項目を非表示にします。
Debug は、Apigee で動作している API プロキシのトラブルシューティングとモニタリングを行うためのツールです。Debug ツールを使用すると、API 呼び出しの各ステップの詳細を調べることができます。
左側のナビゲーション メニューで、[プロキシ開発] > [API プロキシ] を選択し、[bank-v1] をクリックします。
[Debug] タブをクリックします。
[Start debug session] ペインで [Start debug session] をクリックし、環境のプルダウンで [eval] 環境を選択します。
[Start] をクリックします。
デバッグ セッションでリクエストのキャプチャが開始されるまで少し時間がかかる場合があります。
API リクエストを行ってからデバッグ セッションを確認します。
Cloud Shell で、テスト VM への SSH 接続を開きます。
承認するよう求められた場合は、[承認] をクリックします。
これで、Cloud Shell セッションが VM 内で実行されます。
アプリケーションのトークンを取得するには、次のコマンドを実行します。
API に次のリクエストを送信します。
Apigee UI ページに戻ります。
[Debug] ページには、POST(トークンの生成)と GET(ユーザーのアカウントの取得)の 2 つのリクエストが表示されているはずです。
GET リクエストをクリックします。
GET リクエストの詳細が表示されます。
最初のポリシーをクリックします。これは、propertyset.oauth.secret 変数を private.secretkey 変数にコピーする AM-GetSecret ポリシーです。
デバッグ セッションでは「private」の接頭辞が付いた変数が非表示になるため、[Phase Details] にはプライベート変数が表示されません。ただし、プロパティ セット変数にも同じ機密データが格納されているので、トラフィックをデバッグするユーザーに対してプロパティ セット変数を非表示にすることをおすすめします。
バックエンドからのレスポンスをクリックします。これは、工場アイコンの左側にある円で示されています。
レスポンスには、アカウント残高を含むユーザーのアカウント情報が含まれています。
同じブラウザ ウィンドウで新しいタブを開いて、Apigee API リファレンスにアクセスします。
Apigee API リファレンスには、Apigee の管理や Apigee API の呼び出しに使用できるさまざまな API 呼び出しの詳細が記載されています。このページには、organization.environments API 呼び出しが示されています。
ページの下部までスクロールして、[updateDebugmask] をクリックします。
この API 呼び出しは、環境のデバッグマスクを更新します。
[Try this API] ペインの name リクエスト パラメータには、次の値を使用します。
リクエスト本文には、次の本文を入力します。
このペイロードによって propertyset.oauth.secret 変数がマスクされ、さらに、レスポンス ペイロードのオブジェクト配列の各 balance 項目もマスクされます。
[Execute] をクリックします。
アカウントの選択を求めるポップアップ ボックスが表示されたら、受講者アカウントを選択します。
[Allow] をクリックして、ページに対して受講者認証情報の使用を許可します。
Apigee UI の左側のナビゲーション メニューで [プロキシ開発] > [API プロキシ] を選択し、[bank-v1] をクリックします。
[Debug] タブをクリックします。
[Start debug session] ペインで、環境のプルダウンから [eval] を選択します。
[Start] をクリックします。
SSH 接続が閉じている場合は、Cloud Shell でテスト VM への SSH 接続を開きます。
トークンを取得して、再度 API リクエストを送信します。
Apigee UI の [Debug] ページに戻り、GET リクエストをクリックします。
AM-GetSecret ポリシーをクリックします。
propertyset.oauth.secret 変数がマスクされます。
バックエンド レスポンスの [Proxy Response Flow Started] をクリックします。
balance 項目がすべてマスクされています。
このタスクでは、特定のバックエンド リソースに対する呼び出しを制限するためのデフォルトの条件フローを作成し、バックエンド エラー メッセージを書き換えます。
SSH 接続が閉じている場合は、Cloud Shell でテスト VM への SSH 接続を開きます。
「Y」と入力して続行し、ENTER キーを 2 回押してパスフレーズを空白のままにします。
トークンを取得して、/users に GET リクエストを送信します。
バックエンド サービスは GET /users リクエストを認識しないため、次のような 404 レスポンスを返します。
レスポンスから HTML ペイロードが返されますが、これは RF-InvalidTokenRequest ペイロードの形式と一致していません。また、バックエンド レスポンスには機密データが含まれている可能性があります。このような理由から、バックエンド サービスからのエラー レスポンスを書き換えることがベスト プラクティスです。
障害ルールを使用して、エラーを検出し、エラー メッセージを書き換えることができます。
RaiseFault ポリシーを使用して、新しいレスポンスを設定します。
Cloud コンソールで Apigee に移動します。
左側のナビゲーション メニューで、[プロキシ開発] > [API プロキシ] を選択し、[bank-v1] をクリックします。
[Develop] タブをクリックします。
プロキシの [Navigator] メニューで、[Policies] の横にある [+] をクリックします。
[Mediation] セクションで [Raise Fault] を選択した後、[Display Name] と [Name] を RF-404NotFound
に設定します。
[Create] をクリックします。[Policies] セクションで [RF-404NotFound] をクリックします。
RaiseFault ポリシー構成を次のように変更します。
まず、Remove セクションによって、バックエンド サービスから取得された可能性のあるヘッダーがすべて削除され、次に Set セクションによってレスポンスが作成されます。エラーが発生したときに fault.name 変数の値を表示するために、FaultName ヘッダーが追加されています。fault.name 変数はエラーの名前を指定します。
プロキシの [Navigator] メニューで、[Target Endpoints] セクションの [default] をクリックします。
デフォルトのターゲット エンドポイントには、404 レスポンスを返すバックエンド ターゲット呼び出しが含まれています。404 はエラーコードとして扱われます。エンドポイントからエラーが返されると、ターゲット エンドポイントに指定された FaultRule を使用して API レスポンスを書き換えることができます。
TargetEndpoint 構成の TargetEndpoint タグの直下に、次の FaultRules セクションを追加します。
これで、TargetEndpoint の先頭は次のようになります。
[Save] > [Save as new revision] を選択します。
[Deploy] をクリックし、[Environment] で [eval] を選択します。
[Service Account] に、サービス アカウントのメールアドレスを指定します。
[Deploy]、[Confirm] の順にクリックします。
[Overview] タブをクリックして eval のデプロイ ステータスを確認し、プロキシがデプロイされたと示されるまで待ちます。
SSH 接続が閉じている場合は、Cloud Shell でテスト VM への SSH 接続を開きます。
トークンを取得して、/users に GET リクエストを送信します。
レスポンスが書き換えられ、次のようになっています。
レスポンスで JSON が使用されるようになっています。faultname ヘッダーの値が ErrorResponseCode であることに注目してください。これは、ターゲットからエラーコードが返されたときに指定される fault.name 変数の値です。バックエンド サービスから 404 レスポンスが返されるとすぐにエラーが生成され、ターゲット エンドポイントの障害ルールが評価されて、404 障害ルールによってレスポンスが書き換えられています。
予期しないリクエストが送信されたときに、バックエンドからレスポンスが返されるのを待つ代わりに、プロキシ エンドポイントの条件フローの最後に新しい条件フローを追加して、他の条件フローの条件がいずれも満たされなかった場合にエラーが生成されるようにすることができます。こうすることで、条件フローにリストされているオペレーションのみがバックエンドに渡されるようになります。このパターンを利用して、特定のバックエンド サービス リソースのみにアクセスを許可できます。
プロキシの [Navigator] メニューで [Proxy Endpoint: default] に移動し、フロー セクションで [/bank/v1
] の横にある [+] をクリックします。
新しい条件フローに、次の値を指定します。
プロパティ | 値 |
---|---|
Flow name | 404NotFound |
Condition type | [Custom] を選択 |
Condition | DELETETHIS |
[Add] をクリックします。
404NotFound フローで、次の行を削除します。
前の条件フローの条件がいずれも満たされない場合、404NotFound フローが実行されます。
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [default] の下にある [404NotFound] をクリックします。
[Flow] ペインで、404NotFound リクエスト フローのすぐ横にある [+] ボタンをクリックします。
[Select Policy] で [Select existing policy] を選択し、[RF-404NotFound] をクリックします。
[Add] をクリックします。
[Save] > [Save as new revision] を選択します。
[Deploy] をクリックし、[Environment] で [eval] を選択します。
[Service Account] に、サービス アカウントのメールアドレスを指定します。
[Deploy]、[Confirm] の順にクリックします。
[Overview] タブをクリックして eval のデプロイ ステータスを確認し、プロキシがデプロイされたと示されるまで待ちます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
SSH 接続が閉じている場合は、Cloud Shell でテスト VM への SSH 接続を開きます。
トークンを取得して、/users に GET リクエストを送信します。
レスポンスが書き換えられ、次のようになっています。
faultname ヘッダーの値が RaiseFault になっています。これは、RaiseFault ポリシーによってエラーが生成されたときに使用される fault.name の値です。404NotFound 条件フローの RaiseFault ポリシーによって、レスポンスが生成されました。
このラボでは、JWT OAuth トークンを要求することで API を保護しました。SpikeArrest ポリシーを追加して、トラフィックを制限しました。プライベート変数とデータ マスキングを使用して、デバッグ セッションで機密データを非表示にしました。また、バックエンド エラー メッセージを書き換え、404 条件フローを使用して、バックエンドへの呼び出しを特定のリソースに限定しました。
マニュアルの最終更新日: 2025 年 1 月 28 日
ラボの最終テスト日: 2025 年 1 月 28 日
Copyright 2025 Google LLC. All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。
このコンテンツは現在ご利用いただけません
利用可能になりましたら、メールでお知らせいたします
ありがとうございます。
利用可能になりましたら、メールでご連絡いたします
1 回に 1 つのラボ
既存のラボをすべて終了して、このラボを開始することを確認してください