 
始める前に
- ラボでは、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 の開発と管理を行うためのプラットフォームで、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] に移動します。
左側のナビゲーション メニューで、[プロキシ開発] > [API プロキシ] を選択します。
[+ Create] をクリックし、プロキシ ウィザードを使用して新しいプロキシを作成します。
バックエンド サービスのリバース プロキシを作成します。この API プロキシは、OpenAPI 仕様を使用して API のスケルトンを作成します。
[Proxy template] ボックスの [OpenAPI spec template] で、[Reverse proxy (Most common)] を選択します。
OpenAPI ファイルの場合は、ブラウザで URL を開くと、OpenAPI 仕様の YAML ファイルがパソコンにダウンロードされます。
[Browse] をクリックし、パソコンから OpenAPI ファイルを選択して [Next] をクリックします。
[Proxy details] で次のように指定します。
| プロパティ | 値 | 
|---|---|
| Proxy name | bank-v1 | 
| Base path | /bank/v1 | 
| Description | SimpleBank read-only API | 
| Target(Existing API) | backend URL | 
ターゲットには、このタスクですでに取得したバックエンド URL を指定する必要があります。ターゲットは、次のようになります。
[Next] をクリックします。
その他の設定はデフォルトのままにして、[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] をクリックします。
デフォルトのプロキシ エンドポイントの request 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] をクリックし、[Navigator] メニューの [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 というホスト名を使用して呼び出すことができます。このホスト名の DNS エントリはプロジェクト内に作成されており、Apigee ランタイム インスタンスの IP アドレスに解決します。この DNS エントリは限定公開ゾーンに作成されているため、内部ネットワークのみで表示されます。
Cloud Shell は内部ネットワークに存在しないため、Cloud Shell コマンドではこの DNS エントリを解決できません。組織内の仮想マシン(VM)は限定公開ゾーンの DNS にアクセス可能で、apigeex-test-vm という名前の VM が自動的に作成されています。このマシンを使用して API プロキシを呼び出すことができます。
Cloud Shell でテスト VM への SSH 接続を開きます。
承認するよう求められた場合は、[承認] をクリックします。
Cloud Shell で確認されるすべての項目について、Enter キー(リターンキー)を押してデフォルトの入力を指定します。
プロジェクトのオーナーとしてログインしているため、このマシンへの 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 プロダクト] を選択します。
[+Create] をクリックして、新しい API プロダクトを作成します。
[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] をクリックして、オペレーションを保存します。
[Products Detail] ページの上部で [Save] をクリックし、API プロダクトを保存します。
[配布] > [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] の横にある 表示 アイコンをクリックします。
この 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 ポリシーのこの制限は、すべてのトラフィックに適用されます。
false に設定された UseEffectiveCount は、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 プロキシのトラブルシューティングとモニタリングを行うためのツールです。このツールを使用すると、API 呼び出しの各ステップの詳細を調べることができます。
左側のナビゲーション メニューで、[プロキシ開発] > [API プロキシ] を選択し、[bank-v1] をクリックします。
[Debug] タブをクリックします。
[Start debug session] ペインで [Start debug session] をクリックし、環境のプルダウンで [eval] を選択します。
[Start] をクリックします。
デバッグ セッションでリクエストのキャプチャが開始されるまでに、少し時間がかかる場合があります。
API リクエストを行ってからデバッグ セッションを確認します。
Cloud Shell でテスト VM への SSH 接続を開きます。
承認するよう求められた場合は、[承認] をクリックします。
これで、Cloud Shell セッションが VM 内で実行されます。
次のコマンドを実行し、アプリケーションのトークンを取得します。
API に次のリクエストを送信します。
[Apigee] ページに戻ります。
[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] の左側のナビゲーション メニューで [プロキシ開発] > [API プロキシ] を選択し、[bank-v1] をクリックします。
[Debug] タブをクリックします。
[Start debug session] ペインで、環境のプルダウンから [eval] を選択します。
[Start] をクリックします。
Cloud Shell で SSH 接続が閉じている場合は、テスト VM への SSH 接続を開きます。
トークンを取得して、再度 API リクエストを送信します。
[Apigee] の [Debug] ページに戻り、GET リクエストをクリックします。
AM-GetSecret ポリシーをクリックします。
propertyset.oauth.secret 変数がマスクされます。
バックエンド レスポンスの [Proxy Response Flow Started] をクリックします。
balance フィールドがすべてマスクされています。
このタスクでは、特定のバックエンド リソースに対する呼び出しを制限するためのデフォルトの条件フローを作成し、バックエンド エラー メッセージを書き換えます。
Cloud Shell で SSH 接続が閉じている場合は、テスト 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] のデプロイ ステータスに示されるまで待ちます。
Cloud Shell で SSH 接続が閉じている場合は、テスト VM への SSH 接続を開きます。
トークンを取得して、/users に GET リクエストを送信します。
レスポンスが書き換えられて次のようになります。
レスポンスで JSON が使用されるようになっています。faultname ヘッダーの値が ErrorResponseCode であることに注目してください。これは、ターゲットからエラーコードが返されたときに指定される fault.name 変数の値です。バックエンド サービスから 404 レスポンスが返されるとすぐにエラーが生成されます。ターゲット エンドポイントの障害ルールが評価され、404 障害ルールによってレスポンスが書き換えられています。
予期しないリクエストが送信された際に、バックエンドからレスポンスが返されるのを待つ代わりに、プロキシ エンドポイントの条件フローの最後に新しい条件フローを追加して、他の条件フローの条件がいずれも満たされなかった場合にエラーが生成されるようにすることができます。こうすることで、条件フローにリストされているオペレーションのみがバックエンドに渡されるようになります。このパターンを利用して、特定のバックエンド サービス リソースのみにアクセスを許可できます。
プロキシの [Navigator] メニューで [Proxy Endpoint: default] に移動し、[Flow] セクションで [/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] のデプロイ ステータスに示されるまで待ちます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud Shell で SSH 接続が閉じている場合は、テスト VM への SSH 接続を開きます。
トークンを取得して、/users に GET リクエストを送信します。
レスポンスが書き換えられて次のようになります。
faultname ヘッダーの値が RaiseFault になっています。これは、RaiseFault ポリシーによってエラーが生成されたときに使用される fault.name の値です。これで、404NotFound 条件フローの RaiseFault ポリシーによってレスポンスが生成されました。
このラボでは、JWT OAuth トークンを要求することで API を保護し、SpikeArrest ポリシーを追加してトラフィックを制限しました。また、プライベート変数とデータ マスキングを使用して、デバッグ セッションで機密データを非表示にしました。さらに、バックエンド エラー メッセージを書き換え、404 条件フローを使用してバックエンドへの呼び出しを特定のリソースに限定しました。
マニュアルの最終更新日: 2025 年 8 月 6 日
ラボの最終テスト日: 2025 年 8 月 6 日
Copyright 2025 Google LLC. All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。
 
 
 
 
このコンテンツは現在ご利用いただけません
利用可能になりましたら、メールでお知らせいたします
 
ありがとうございます。
利用可能になりましたら、メールでご連絡いたします
 
 
1 回に 1 つのラボ
既存のラボをすべて終了して、このラボを開始することを確認してください
