Google Cloud Platform には、お使いの App Engine インスタンスに関する詳細、たとえばこのインスタンスに含まれるプロジェクト ID、サービス アカウント、サービス アカウントで使用されるトークンなどの情報が格納されたメタデータ サーバーが用意されています。このデータには、シンプルな HTTP リクエストでアクセスでき、クライアント ライブラリは必要ありません。
このページでは、適切なメタデータ サーバーのエンドポイントに HTTP 呼び出しを実行して、デプロイ済みの Java 8 ランタイム アプリケーションからインスタンス メタデータにアクセスする方法について説明します。
この API の便利な使い方として、サービス アカウントのトークンを取得し、これを署名なしトークンとして Google Cloud API のいずれかの認証ヘッダーに指定し、特定の API サービスに対し、お使いのアプリケーションを認証させる方法があります。 この署名なしトークンの使用例については、Google Cloud Translation API のドキュメントをご覧ください。
使用するメタデータ エンドポイントの識別
次の表は、特定のメタデータに対して HTTP リクエストを行うことができるエンドポイントを示しています。メタデータ サーバーには、http://metadata.google.internal
でアクセスできます。
メタデータ エンドポイント | 説明 |
---|---|
/computeMetadata/v1/project/numeric-project-id |
プロジェクトに割り当てられているプロジェクト番号。 |
/computeMetadata/v1/project/project-id |
プロジェクトに割り当てられているプロジェクト ID。 |
/computeMetadata/v1/instance/zone |
インスタンスが実行されているゾーン。 |
/computeMetadata/v1/instance/service-accounts/default/aliases |
|
/computeMetadata/v1/instance/service-accounts/default/email |
プロジェクトに割り当てられているデフォルトのサービス アカウントのメール。 |
/computeMetadata/v1/instance/service-accounts/default/ |
プロジェクトのすべてのデフォルトのサービス アカウントを一覧表示します。 |
/computeMetadata/v1/instance/service-accounts/default/scopes |
デフォルトのサービス アカウントでサポートされているすべてのスコープを一覧表示します。 |
/computeMetadata/v1/instance/service-accounts/default/token |
アプリケーションを他の Google Cloud APIs に認証させるための認証トークンを返します。 |
たとえば、プロジェクト ID を取得するには、リクエストを http://metadata.google.internal/computeMetadata/v1/project/project-id
に送信します。
メタデータ リクエストの実行
次のサンプルコードを実行すると、サービス アカウントのトークンを除き、インスタンスについて利用可能なメタデータがすべて取得されて表示されます。
このサンプルコードでは、アプリケーションが本番環境で実行されていることが確認されます。アプリケーションがローカルで実行されている場合、リクエストから戻るメタデータはありません。
また、Google Gson JSON シリアライザ / デシリアライザ、OkHttp HTTP および HTTP2 クライアント、Thymeleaf テンプレート生成システムを使用していることにも注意してください。これらは必須ではありませんが、独自のプロジェクトに役立つライブラリです。
ローカルでの実行
メタデータ サーバーは、デプロイされているアプリケーションを対象に利用するもので、ローカルの開発用サーバー上での実行には対応していません。上記のサンプルコードで示されるように、アプリケーションが本番環境で実行されている場合に限りメタデータ結果を待ち受けるように、コードに環境チェックを追加できます。
String environment =
(String) System.getProperties().get("com.google.appengine.runtime.environment");
ctx.setVariable("production", environment);
// The metadata server is only on a production system
if (environment.equals("Production")) {
... //show metadata results
}