すべての仮想マシン(VM)は、メタデータをメタデータ サーバーのディレクトリに保存します。VM からこのメタデータ サーバーの API にアクセスするのに追加の承認は必要ありません。自動的にアクセスできるようになります。このドキュメントの次のセクションで説明するメソッドを使用して、VM メタデータ値を表示してクエリを実行できます。
準備
- Windows Server VM の場合は、PowerShell 3.0 以降を使用します。コピーしたコードブロックを貼り付ける場合は
ctrl+v
の使用をおすすめします。 - Compute Engine の VM メタデータを定義、分類、配置する方法の基本を確認します。詳細については、VM メタデータについてをご覧ください。
-
まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。
このページのサンプルをどのように使うかに応じて、タブを選択してください。
コンソール
Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。
gcloud
-
Google Cloud CLI をインストールし、次のコマンドを実行して初期化します。
gcloud init
- デフォルトのリージョンとゾーンを設定します。
Python
このページの Python サンプルをローカル開発環境から使用するには、gcloud CLI をインストールして初期化し、自身のユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定してください。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
-
Google アカウントのローカル認証情報を作成します。
gcloud auth application-default login
詳細については、 ローカル開発環境の認証の設定 をご覧ください。
REST
このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。
-
必要なロール
Google Cloud コンソール、Google Cloud CLI、または REST を使用して VM の外部からカスタム メタデータを表示するには、次のロールと権限が必要です。VM 内からメタデータをプログラムでクエリする場合は、VM に接続するためのロールと権限のみが必要です。
VM の外部からカスタム メタデータを表示するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
-
VM またはプロジェクトに対する Compute インスタンス管理者(v1)(
roles/compute.instanceAdmin.v1
) - VM でサービス アカウントを使用する場合: サービス アカウントまたはプロジェクトに対するサービス アカウント ユーザー(
roles/iam.serviceAccountUser
)
ロールの付与の詳細については、アクセスの管理をご覧ください。
これらの事前定義ロールには、VM の外部からカスタム メタデータを表示するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
VM の外部からカスタム メタデータを表示するには、次の権限が必要です。
- プロジェクトのカスタム メタデータを表示する: プロジェクトに対する
compute.projects.get
- カスタム ゾーン メタデータを表示する: プロジェクトの必要なゾーンのインスタンス設定に対する
compute.instanceSettings.get
-
VM インスタンスのカスタム メタデータを表示する: VM に対する
compute.instances.get
-
VM でサービス アカウントを使用する場合: サービス アカウントまたはプロジェクトに対する
iam.serviceAccounts.actAs
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
プログラムによるメタデータのクエリ
VM 内から、Linux では curl
ツール、Windows では Invoke-RestMethod
などのツールを使用して、デフォルトまたはカスタム メタデータ値をプログラムでクエリできます。
メタデータ リクエストの部分
次の表に、メタデータ クエリ リクエストの主要部分を示します。
コンポーネント | 説明 |
---|---|
ルート URL | すべてのメタデータ値は、次のルート URL のサブパスとして定義されます。
|
リクエスト ヘッダー |
このヘッダーにより、そのリクエストがメタデータ値を取得する目的で送信されたものであり、安全でないソースから意図せず送信されたものではないことが示されるため、リクエストしたデータがメタデータ サーバーから返されるようになります。このヘッダーが含まれていないリクエストはメタデータ サーバーで拒否されます。 Metadata-Flavor: Google |
単一のメタデータ エントリに対してクエリを実行する
次のコマンドを使用して、単一のメタデータ エントリをクエリします。
Linux
- Linux VM に接続します。
Linux VM から、
curl
ツールを使用してクエリを実行します。VM インスタンスのメタデータ エントリをクエリするには、次のコマンドを実行します。
curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY" -H "Metadata-Flavor: Google"
プロジェクトのメタデータ エントリをクエリするには、次のコマンドを実行します。
curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY" -H "Metadata-Flavor: Google"
METADATA_KEY
は、値をクエリするインスタンスまたはプロジェクトのメタデータキーに置き換えます。たとえば、VM のブートイメージにクエリを実行するには、次のクエリを実行します。
user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/image" -H "Metadata-Flavor: Google"
出力は次のようになります。
projects/rhel-cloud/global/images/rhel-8-v20210122
Windows
- Windows VM に接続します。
Windows VM から、
Invoke-RestMethod
コマンドを使用してクエリを実行します。VM インスタンスのメタデータ エントリをクエリするには、次のコマンドを実行します。
$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY") $value
プロジェクトのメタデータ エントリをクエリするには、次のコマンドを実行します。
$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY") $value
METADATA_KEY
は、値をクエリするインスタンスまたはプロジェクトのメタデータキーに置き換えます。たとえば、VM のブートイメージにクエリを実行するには、次のクエリを実行します。
PS C:\> $value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/image") $value
出力は次のようになります。
projects/windows-cloud/global/images/windows-server-2019-dc-v20210112
メタデータのディレクトリ リスティングをクエリする
メタデータのディレクトリ リスティングに対してクエリを実行するには、次のコマンドを使用します。ディレクトリ リスティングは、他のメタデータキーを含むメタデータ エントリです。末尾にスラッシュが付いているメタデータ エントリがディレクトリ リスティングです。
Linux
Linux VM に接続します。
Linux VM から、次のコマンドを実行します。
VM インスタンスのメタデータ ディレクトリをクエリするには、次のコマンドを実行します。
curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_DIRECTORY_NAME/" -H "Metadata-Flavor: Google"
プロジェクトのメタデータ ディレクトリをクエリするには、次のコマンドを実行します。
curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_DIRECTORY_NAME/" -H "Metadata-Flavor: Google"
METADATA_DIRECTORY_NAME
は、リスティングをクエリするインスタンスまたはプロジェクトのメタデータ ディレクトリの名前に置き換えます。たとえば、VM にアタッチされているディスクのディレクトリである
disks/
エントリについて考えてみましょう。disks/
エントリをクエリするには、次の手順を完了します。ディスク ディレクトリで
curl
ツールコマンドを実行します。user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/" -H "Metadata-Flavor: Google"
出力は次のようになります。
0/ 1/ 2/
ディスクの
0/
ディレクトリに関する詳細情報が必要な場合は、そのディレクトリの特定の URL をクエリで取得できます。user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/0/" -H "Metadata-Flavor: Google"
出力は次のようになります。
device-name index mode type
次に、ディスク
0/
のディスクタイプ(type
)をクエリするために、次のコマンドを実行します。user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/0/type" -H "Metadata-Flavor: Google"
出力は次のようになります。
PERSISTENT
Windows
disks/
というエントリは、その VM にアタッチされているディスクのディレクトリです。ディスク エントリをクエリするには、次の手順を完了します。
Windows VM に接続します。
Windows VM から、次のコマンドを実行します。
VM インスタンスのメタデータ ディレクトリをクエリするには、次のコマンドを実行します。
$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_DIRECTORY_NAME/") $value
プロジェクトのメタデータ ディレクトリをクエリするには、次のコマンドを実行します。
$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_DIRECTORY_NAME/") $value
METADATA_DIRECTORY_NAME
は、リスティングをクエリするインスタンスまたはプロジェクトのメタデータ ディレクトリの名前に置き換えます。たとえば、VM にアタッチされているディスクのディレクトリである
disks/
エントリについて考えてみましょう。disks/
エントリをクエリするには、次の手順を完了します。ディスク ディレクトリで
Invoke-RestMethod
コマンドを実行します。PS C:\> $value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/disks/") $value
出力は次のようになります。
0/ 1/ 2/
ディスク
0/
ディレクトリに関する詳細情報が必要な場合は、そのディレクトリの特定の URL をクエリで取得できます。PS C:\> $value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/disks/0/") $value
出力は次のようになります。
device-name index mode type
次に、ディスク
0/
のディスクタイプ(type
)をクエリするために、次のコマンドを実行します。PS C:\> $value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/disks/0/type") $value
出力は次のようになります。
PERSISTENT
ディレクトリ リスティングを再帰的にクエリする
ディレクトリ以下のすべての内容が返されるようにするには、リクエストで recursive=true
クエリ パラメータを使用します。
Linux
Linux VM に接続します。
Linux VM から、
curl
ツールを使用してクエリを実行します。VM インスタンスのメタデータ ディレクトリ リスティングを再帰的にクエリするには、次のコマンドを実行します。
curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_DIRECTORY_NAME/?recursive=true" -H "Metadata-Flavor: Google"
プロジェクトのメタデータ ディレクトリ リスティングを再帰的にクエリするには、次のコマンドを実行します。
curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_DIRECTORY_NAME/?recursive=true" -H "Metadata-Flavor: Google"
METADATA_DIRECTORY_NAME
は、リスティングを再帰的にクエリするインスタンスまたはプロジェクトのメタデータ ディレクトリの名前に置き換えます。たとえば、次のコマンドを実行すると、
disks/
ディレクトリのインスタンス メタデータ リスティングを再帰的にクエリします。user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true" -H "Metadata-Flavor: Google"
出力は次のようになります。
[{"deviceName":"boot","index":0,"mode":"READ_WRITE","type":"PERSISTENT"}, {"deviceName":"persistent-disk-1","index":1,"mode":"READ_WRITE","type":"PERSISTENT"}, {"deviceName":"persistent-disk-2","index":2,"mode":"READ_ONLY","type":"PERSISTENT"}]
デフォルトでは、再帰クエリの結果は JSON 形式で返されます。これらの内容をテキスト形式で返されるようにするには、
alt=text
クエリ パラメータを追加します。user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true&alt=text" -H "Metadata-Flavor: Google"
出力は次のようになります。
0/device-name boot 0/index 0 0/mode READ_WRITE 0/type PERSISTENT 1/device-name persistent-disk-1 1/index 1 1/mode READ_WRITE 1/type PERSISTENT 2/device-name persistent-disk-1 2/index 2 2/mode READ_ONLY 2/type PERSISTENT
Windows
Windows VM に接続します。
Windows VM から、
Invoke-RestMethod
コマンドを使用してクエリを実行します。VM インスタンスのメタデータ ディレクトリ リスティングを再帰的にクエリするには、次のコマンドを実行します。
$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_DIRECTORY_NAME/?recursive=true") $value
プロジェクトのメタデータ ディレクトリ リスティングを再帰的にクエリするには、次のコマンドを実行します。
$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_DIRECTORY_NAME/?recursive=true") $value
METADATA_DIRECTORY_NAME
は、リスティングを再帰的にクエリするインスタンスまたはプロジェクトのメタデータ ディレクトリの名前に置き換えます。たとえば、次のコマンドを実行すると、
disks/
ディレクトリのインスタンス メタデータ リスティングを再帰的にクエリします。PS C:\> $value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true") $value
出力は次のようになります。
[{"deviceName":"boot","index":0,"mode":"READ_WRITE","type":"PERSISTENT"}, {"deviceName":"persistent-disk-1","index":1,"mode":"READ_WRITE","type":"PERSISTENT"}, {"deviceName":"persistent-disk-2","index":2,"mode":"READ_ONLY","type":"PERSISTENT"}]
デフォルトでは、再帰クエリの結果は JSON 形式で返されます。これらの内容をテキスト形式で返されるようにするには、
alt=text
クエリ パラメータを追加します。PS C:\> $value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/disks/?recursive=true&alt=text") $value
出力は次のようになります。
0/device-name boot 0/index 0 0/mode READ_WRITE 0/type PERSISTENT 1/device-name persistent-disk-1 1/index 1 1/mode READ_WRITE 1/type PERSISTENT 2/device-name persistent-disk-1 2/index 2 2/mode READ_ONLY 2/type PERSISTENT
クエリ出力を書式設定する
デフォルトでは、エンドポイントごとにレスポンスの形式があらかじめ定義されています。データを JSON 形式で返すエンドポイントもあれば、文字列として返すエンドポイントもあります。指定されているデフォルトのデータ形式をオーバーライドするには、クエリ パラメータの alt=json
(データを JSON 文字列形式で返す)または alt=text
(データの平文表現を返す)を使用します。
Linux
- Linux VM に接続します。
Linux VM から、
curl
ツールを使用してクエリを実行します。VM インスタンスのメタデータ エントリのクエリ レスポンス データ形式を変更するには、次のコマンドを実行します。
curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?alt=DATA_FORMAT" -H "Metadata-Flavor: Google"
プロジェクトのメタデータ エントリのクエリ レスポンス データ形式を変更するには、次のコマンドを実行します。
curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?alt=DATA_FORMAT" -H "Metadata-Flavor: Google"
次のように置き換えます。
METADATA_KEY
: 値をクエリするインスタンスまたはプロジェクトのメタデータキー。DATA_FORMAT
: クエリ レスポンス データ形式(例:text
、json
)。
例
たとえば、tags
キーではデータが自動的に JSON 形式で返されますが、これをテキスト形式で返されるように変更するには、alt=text
クエリ パラメータを指定します。
デフォルトのキーワード
user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/tags" -H "Metadata-Flavor: Google"
出力は次のようになります。
["http-server", "db-client", "app-server", "mysql-server"]
書式設定を使用したクエリ
user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/tags?alt=text" -H "Metadata-Flavor: Google"
出力は次のようになります。
http-server db-client app-server mysql-server
Windows
- Windows VM に接続します。
Windows VM から、
Invoke-RestMethod
コマンドを使用してクエリを実行します。VM インスタンスのメタデータ エントリのクエリ レスポンス データ形式を変更するには、次のコマンドを実行します。
$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?alt=DATA_FORMAT") $value
プロジェクトのメタデータ エントリのクエリ レスポンス データ形式を変更するには、次のコマンドを実行します。
$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?alt=DATA_FORMAT") $value
次のように置き換えます。
METADATA_KEY
: 値をクエリするインスタンスまたはプロジェクトのメタデータキー。DATA_FORMAT
: クエリ レスポンス データ形式(例:text
、json
)。
例
たとえば、tags
キーではデータが自動的に JSON 形式で返されますが、これをテキスト形式で返されるように変更するには、alt=text
クエリ パラメータを指定します。
デフォルトのキーワード
PS C:>
$value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
-Uri "http://metadata.google.internal/computeMetadata/v1/instance/tags")
$value
出力は次のようになります。
["http-server", "db-client", "app-server", "mysql-server"]
書式設定を使用したクエリ
PS C:>
$value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
-Uri "http://metadata.google.internal/computeMetadata/v1/instance/tags?alt=text")
$value
出力は次のようになります。
http-server db-client app-server mysql-server
wait-for-change
機能を使用してメタデータの変更をクエリする
メタデータ値は VM の実行中に変更される可能性があるため、メタデータ サーバーでは、wait-for-change
機能を使用して、メタデータの変更について通知を受けることができます。このオプションを使用すると、指定したメタデータが変更された場合にのみリクエストが返されます。
この機能は、カスタム メタデータやサーバー定義メタデータでも使用できます。したがって、VM やプロジェクトに変更が加えられた場合でも、カスタム メタデータ エントリが更新された場合でも、プログラムでその変更に対処できます。
たとえば、tags
キーに対するリクエストを実行すると、tags メタデータの内容が変更されていた場合にのみ結果が返されます。返される結果には、そのメタデータキーの新しい値が含まれます。
wait-for-change
機能では、リクエストとの照合やタイムアウトの設定もできます。
wait-for-change
機能を使用する場合は、次の点を考慮してください。
wait-for-change
リクエストを実行できるのは、メタデータ エンドポイントに対してか、ディレクトリの内容に対してだけです。ディレクトリ リストに対してwait-for-change
リクエストを実行することはできません。これを行うと、リクエストが失敗し、メタデータ サーバーが 400 Invalid Request エラーを返します。サービス アカウント トークンに
wait-for-change
リクエストを実行することはできません。サービス アカウント トークン URL にwait-for-change
リクエストを行うと、リクエストは直ちに失敗し、400 Invalid Request エラーが返されます。
wait-for-change
リクエストを実行するには、メタデータキーのクエリを実行し、?wait_for_change=true
クエリ パラメータを追加します。
Linux
- Linux VM に接続します。
Linux VM から、
curl
ツールを使用してクエリを実行します。VM インスタンスのメタデータ エントリに
wait-for-change
リクエストを実行するには、次のコマンドを実行します。curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true" -H "Metadata-Flavor: Google"
プロジェクトのメタデータ エントリに
wait-for-change
リクエストを実行するには、次のコマンドを実行します。curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY" -H "Metadata-Flavor: Google"
METADATA_KEY
は、値をクエリするインスタンスまたはプロジェクトのメタデータキーに置き換えます。指定したメタデータキーが変更されると、クエリで新しい値が返されるようになります。
例
この例では、setInstanceTags method
にリクエストが送信されると新しい値が返されるようになります。
user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true" -H "Metadata-Flavor: Google"
出力は次のようになります。
http-server db-client
wait-for-change
リクエストは、ディレクトリの内容に対して再帰的に実行することもできます。
user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true&wait_for_change=true" -H "Metadata-Flavor: Google"
変更があった場合は、新しい内容が返されます。
{"foo":"bar","baz":"bat"}
Windows
- Windows VM に接続します。
Windows VM から、
Invoke-RestMethod
コマンドを使用してクエリを実行します。PS C:> $value = (Invoke-RestMethod
-Headers @{'Metadata-Flavor' = 'Google'}
-Uri "http://metadata.google.internal/computeMetadata/v1/METADATA_KEY?wait_for_change=true") $valueVM インスタンスのメタデータ エントリに
wait-for-change
リクエストを実行するには、次のコマンドを実行します。$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true") $value
プロジェクトのメタデータ エントリに
wait-for-change
リクエストを実行するには、次のコマンドを実行します。$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?wait_for_change=true") $value
METADATA_KEY
は、wait-for-change
リクエストを実行するインスタンスまたはプロジェクトのメタデータキーに置き換えます。指定したメタデータキーが変更されると、クエリで新しい値が返されるようになります。
例
指定したメタデータキーが変更されると、クエリで新しい値が返されるようになります。この例では、setInstanceTags method
にリクエストが送信されると新しい値が返されるようになります。
PS C:>
$value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
-Uri "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true")
$value
出力は次のようになります。
http-server db-client
wait-for-change
リクエストは、ディレクトリの内容に対して再帰的に実行することもできます。
PS C:>
$value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
-Uri "http://metadata.google.internal/computeMetadata/v1/instance/attributes?recursive=true&wait_for_change=true")
$value
変更があった場合は、新しい内容が返されます。
{"foo":"bar","baz":"bat"}
ETag を使用する
単純な wait-for-change
クエリを送信すると、そのメタデータの内容が変更されていた場合にレスポンスが返されます。しかし、メタデータの更新と wait-for-change
リクエストの送信の間には固有の競合状態があるため、取得するメタデータ値が最新であることを確認できる確実な方法があると便利です。
その方法として使用できるのが last_etag
クエリ パラメータです。このクエリ パラメータは、リクエストで指定された ETag 値と、メタデータ サーバーに保存されている ETag 値を比較します。ETag 値が一致した場合は、wait-for-change
リクエストが受け入れられます。ETag 値が一致しない場合は、前回 ETag 値を取得してからメタデータの内容が変更されていることになります。この場合は、その最新の値が直ちに返されます。
Linux VM
メタデータキーの最新の ETag 値を取得するには、次の操作を行います。
- Linux VM に接続します。
そのキーに対するリクエストを送信してヘッダーを出力します。これを行うには、
-v
フラグを指定してcurl
ツールを使用します。VM インスタンスのメタデータ エントリの現在の ETag を取得するには、次のコマンドを実行します。
curl -v "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY" -H "Metadata-Flavor: Google"
プロジェクトのメタデータ エントリの現在の ETag を取得するには、次のコマンドを実行します。
curl -v "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY" -H "Metadata-Flavor: Google"
METADATA_KEY
は、値をクエリするインスタンスまたはプロジェクトのメタデータキーに置き換えます。たとえば、次のコマンドを実行すると、
tags
インスタンスのメタデータキーの現在の ETag 値を取得します。user@myinst:~$ curl -v "http://metadata.google.internal/computeMetadata/v1/instance/tags" -H "Metadata-Flavor: Google"
出力は次のようになります。
* About to connect() to metadata port 80 (#0) * Trying 169.254.169.254... connected * Connected to metadata (169.254.169.254) port 80 (#0) > GET /computeMetadata/v1/instance/tags HTTP/1.1 > User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15 > Host: metadata > Accept: */* > < HTTP/1.1 200 OK < Content-Type: application/text < ETag: 411261ca6c9e654e < Date: Wed, 13 Feb 2013 22:43:45 GMT < Server: Metadata Server for VM < Content-Length: 26 < X-XSS-Protection: 1; mode=block < X-Frame-Options: SAMEORIGIN < http-server db-client
その ETag 値を使用するには、
wait-for-change
リクエストのcurl
ツールコマンドを使用します。インスタンスのメタデータの
wait-for-change
リクエストに ETag 値を使用するには、次のコマンドを実行します。curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true&last_etag=ETAG" -H "Metadata-Flavor: Google"
プロジェクトのメタデータの
wait-for-change
リクエストに ETag 値を使用するには、次のコマンドを実行します。curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?wait_for_change=true&last_etag=ETAG" -H "Metadata-Flavor: Google"
次のように置き換えます。
METADATA_KEY
: 値をクエリするインスタンスまたはプロジェクトのメタデータキー。ETAG
: メタデータキーの ETag 値。
この例では、次のコマンドで
tags
キーに ETag 値を使用し、インスタンスのメタデータ エントリをクエリします。user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true&last_etag=411261ca6c9e654e" -H "Metadata-Flavor: Google"
指定した ETag 値がメタデータ サーバーで照合され、値が変更されていた場合は、メタデータキーの新しい内容が返されます。
Windows VM
メタデータキーの最新の ETag 値を取得するには、次の操作を行います。
- Windows VM に接続します。
そのキーに対するリクエストを送信してヘッダーを出力します。Windows では、
Invoke-WebRequest
コマンドを使用します。VM インスタンスのメタデータ エントリの現在の ETag を取得するには、次のコマンドを実行します。
$value = (Invoke-WebRequest -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY) $value.Headers.ETag
プロジェクトのメタデータ エントリの現在の ETag を取得するには、次のコマンドを実行します。
$value = (Invoke-WebRequest -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY) $value.Headers.ETag
METADATA_KEY
は、値をクエリするインスタンスまたはプロジェクトのメタデータキーに置き換えます。たとえば、次のコマンドを実行すると、
tags
インスタンスのメタデータキーの現在の ETag 値を取得します。PS C:> $value = (Invoke-WebRequest -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri http://metadata.google.internal/computeMetadata/v1/instance/tags)
$value.Headers.ETag
出力は次のようになります。
* About to connect() to metadata port 80 (#0) * Trying 169.254.169.254... connected * Connected to metadata (169.254.169.254) port 80 (#0) > GET /computeMetadata/v1/instance/tags HTTP/1.1 > User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15 > Host: metadata > Accept: / > < HTTP/1.1 200 OK < Content-Type: application/text < ETag: 411261ca6c9e654e < Date: Wed, 13 Feb 2013 22:43:45 GMT < Server: Metadata Server for VM < Content-Length: 26 < X-XSS-Protection: 1; mode=block < X-Frame-Options: SAMEORIGIN < http-server db-client
これで、この ETag 値を
wait-for-change
リクエストで使用できます。インスタンスのメタデータの
wait-for-change
リクエストに ETag 値を使用するには、次のコマンドを実行します。$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true&last_etag=ETAG") $value
プロジェクトのメタデータの
wait-for-change
リクエストに ETag 値を使用するには、次のコマンドを実行します。$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?wait_for_change=true&last_etag=ETAG") $value
次のように置き換えます。
METADATA_KEY
: 値をクエリするインスタンスまたはプロジェクトのメタデータキー。ETAG
: メタデータキーの ETag 値。
この例では、次のコマンドで
tags
キーに ETag 値を使用し、インスタンスのメタデータ エントリをクエリします。PS C:> $value = (Invoke-RestMethod
-Headers @{'Metadata-Flavor' = 'Google'}
-Uri "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true&last_etag=411261ca6c9e654e") $value指定した ETag 値がメタデータ サーバーで照合され、値が変更されていた場合は、メタデータキーの新しい内容が返されます。
Python
次の Python サンプルは、メタデータ サーバーの変更をプログラムで監視する方法を示しています。
このサンプルでは、最初の ETag が 0
に設定されています。メタデータ サーバーは、ETag 値が 0
のレスポンスを返しません。リクエストで前回の ETag として 0
を指定すると、メタデータ サーバーから最新の値と ETag が返されます。これにより、最初の値と ETag を取得するために必要なコードを省略できます。
タイムアウトを設定する
wait-for-change
リクエストで、一定の秒数が経過するとリクエストがタイムアウトになるようにするには timeout_sec
パラメータを設定します。timeout_sec
パラメータは、リクエストの待機時間を指定の秒数に制限します。その上限に達すると、メタデータキーの現在の内容が返されます。
timeout_sec
パラメータを設定した場合、指定の秒数が経過すると、メタデータ値が実際に変更されているかどうかに関係なく、常に結果が返されます。タイムアウトに設定できるのは整数値だけです。
Linux
- Linux VM に接続します。
Linux VM から、
curl
ツールを使用してクエリを実行します。VM インスタンスのメタデータ エントリにタイムアウト値を指定して
wait-for-change
リクエストを実行するには、次のコマンドを実行します。curl "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true&timeout_sec=TIMEOUT" -H "Metadata-Flavor: Google"
プロジェクトのメタデータ エントリにタイムアウト値を指定して
wait-for-change
リクエストを実行するには、次のコマンドを実行します。curl "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?wait_for_change=true&timeout_sec=TIMEOUT" -H "Metadata-Flavor: Google"
次のように置き換えます。
METADATA_KEY
: 値をクエリするインスタンスまたはプロジェクトのメタデータキー。TIMEOUT
: タイムアウト値。
たとえば、次のコマンドは、360 秒後にタイムアウトするように設定された wait-for-change
リクエストを実行します。
user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true&timeout_sec=360" -H "Metadata-Flavor: Google"
Windows
- Windows VM に接続します。
Windows VM から、
Invoke-RestMethod
コマンドを使用してクエリを実行します。VM インスタンスのメタデータ エントリにタイムアウト値を指定して
wait-for-change
リクエストを実行するには、次のコマンドを実行します。$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/instance/METADATA_KEY?wait_for_change=true&timeout_sec=TIMEOUT") $value
プロジェクトのメタデータ エントリにタイムアウト値を指定して
wait-for-change
リクエストを実行するには、次のコマンドを実行します。$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata.google.internal/computeMetadata/v1/project/METADATA_KEY?wait_for_change=true&timeout_sec=TIMEOUT") $value
次のように置き換えます。
METADATA_KEY
: 値をクエリするインスタンスまたはプロジェクトのメタデータキー。TIMEOUT
: タイムアウト値。
たとえば、次のコマンドは、360 秒後にタイムアウトするように設定された wait-for-change
リクエストを実行します。
PS C:>
$value = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'}
-Uri "http://metadata.google.internal/computeMetadata/v1/instance/tags?wait_for_change=true&timeout_sec=360")
$value
ステータス コード
wait-for-change
リクエストを実行すると、リクエストが成功したかどうかを示す標準の HTTP ステータス コードが返されます。結果がエラーになる場合は、ネットワークの状態が原因でリクエストが失敗して、エラーコードが返されている可能性があります。そのような場合は、それらのエラーが認識されて適切に処理されるようにして、アプリケーションをフォールト トレラントにする必要があります。
メタデータ サーバーから返される可能性があるステータスを以下に示します。
ステータス | 説明 |
---|---|
HTTP 200 |
正常終了しました。値が変更されたか、指定されている timeout_sec に達したため、リクエストは正常に終了しました。 |
Error 400 |
リクエストが無効です。クエリを修正してリクエストを再試行してください。 |
Error 404 |
指定したメタデータ値は存在しません。このエラーは、変更の待機中にメタデータが削除された場合にも返されます。 |
Error 503 |
一時的なサーバーエラーか一時的なメンテナンス イベントが発生しました。リクエストを再試行してください。 |
制限事項
X-Forwarded-For
ヘッダーを含むリクエストは、メタデータ サーバーで自動的に拒否されます。このヘッダーは、一般に、リクエストにプロキシが使用されていることを示します。この場合、承認されたユーザーからのリクエストではない可能性があります。そのようなリクエストは、セキュリティ上の理由からすべて拒否されます。curl
コマンドを使用してサーバーからメタデータを取得する場合、一部のエンコードされた文字はリクエストパスでサポートされません。エンコードされた文字は、クエリパスでのみサポートされています。たとえば、次のリクエストは機能しない場合があります。
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/123456789-compute%40developer.gserviceaccount.com/?query_path=https%3A%2F%2Flocalhost%3A8200%2Fexample%2Fquery&another_param=true" -H "Metadata-Flavor: Google"
このリクエストを機能させるには、リクエストパスのサポートされていないエンコードされた文字(
%40
)を同等の許容値(@
)に置き換える必要があります。curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/1234567898-compute@developer.gserviceaccount.com/?query_path=https%3A%2F%2Flocalhost%3A8200%2Fexample%2Fquery&another_param=true" -H "Metadata-Flavor: Google"
以下の表に、リクエストパスでサポートされていないエンコード文字をまとめています。
エンコードされた文字 許容値 %21 !
%24 $
%27 '
%28 (
%29 )
%2A *
%2C ,
%40 @
VM のカスタム メタデータを表示する
Compute Engine VM のカスタム メタデータ値は、次のいずれかの方法で表示できます。
プロジェクトのメタデータを表示する
プロジェクト内のすべての VM に適用されるカスタム メタデータを表示するには、次のいずれかの方法を使用します。
コンソール
Google Cloud コンソールで、[メタデータ] ページに移動します。
[メタデータ] ページに、プロジェクトのすべてのカスタム プロジェクト メタデータ エントリが一覧表示されます。
gcloud
プロジェクトのメタデータをクエリするには、gcloud compute project-info describe
コマンドを使用します。
gcloud compute project-info describe --flatten="commonInstanceMetadata[]"
出力は次のようになります。
--- fingerprint: HcSFdS_1_1I= items: - key: ssh-keys value: USERNAME:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWZ... kind: compute#metadata
REST
プロジェクトのメタデータをクエリするには、project.get
メソッドに GET
リクエストを送信します。
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。
GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID
出力は次のようになります。
"kind": "compute#project", "id": "XXXXXXX", "creationTimestamp": "2018-12-10T08:34:33.616-08:00", "name": "YOUR_PROJECT", "commonInstanceMetadata": { "kind": "compute#metadata", "fingerprint": "XXXXXCdg=", "items": [ { "key": "enable-guest-attributes", "value": "TRUE" }, { "key": "enable-os-inventory", "value": "true" }, { "key": "enable-osconfig", "value": "TRUE" }, { "key": "enable-oslogin", "value": "TRUE" }, { "key": "sshKeys", "value": "XXXXX" } ] }, ...
ゾーン メタデータを表示する
プロジェクトの特定のゾーンにあるすべての VM インスタンスに適用されるカスタム メタデータを表示するには、次のいずれかの方法を使用します。
gcloud
カスタム ゾーン メタデータをクエリするには、gcloud compute project-zonal-metadata describe
コマンドを使用します。
gcloud compute project-zonal-metadata describe \ --zone=ZONE \ --project=PROJECT_ID
次のように置き換えます。
PROJECT_ID
: プロジェクト IDZONE
: ゾーン メタデータを表示するゾーン。
出力は次のようになります。
{ "fingerprint": "VlRIl8dx9vk=", "metadata": { items: { "key-1": "value-1", "key-2": "value-2" } } }
REST
カスタム ゾーン メタデータをクエリするには、instanceSettings().get
メソッドに GET
リクエストを送信します。
GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceSettings
次のように置き換えます。
PROJECT_ID
: プロジェクト IDZONE
: ゾーン メタデータを表示するゾーン。
出力は次のようになります。
{ "fingerprint": "VlRIl8dx9vk=", "metadata": { items: { "key-1": "value-1", "key-2": "value-2" } } }
インスタンスのメタデータを表示する
プロジェクト内の単一の VM に適用されるメタデータを表示するには、次のいずれかの方法を使用します。
コンソール
- Google Cloud コンソールで [VM インスタンス] ページに移動します。
メタデータを表示する VM の名前をクリックします。
この VM の SSH 認証鍵。[セキュリティとアクセス] セクションで、[SSH 認証鍵] フィールドを表示します。
値
None
は、インスタンスのメタデータに保存された SSH 認証鍵がないことを示します。その他の値は、SSH 認証鍵がインスタンスのメタデータに格納されていることを示します。
プロジェクトの SSH 認証鍵。[セキュリティとアクセス] セクションで、[プロジェクト全体の SSH 認証鍵をブロック] フィールドを表示します。
値
On
は、インスタンス メタデータのメタデータキーblock-project-ssh-keys
の値がTRUE
であることを示します。値
Off
は、メタデータキーblock-project-ssh-keys
の値がFALSE
であるか、キーが設定されていないことを示します。
その他すべてのカスタム メタデータ。[カスタム メタデータ] セクションを表示します。SSH 認証鍵メタデータ以外の、すべてのカスタム メタデータのキーと値が表示されます。
gcloud
gcloud compute instances describe
コマンドを使用して、インスタンスのメタデータをクエリします。
gcloud compute instances describe VM_NAME --flatten="metadata[]"
VM_NAME
は、メタデータを検索する VM の名前に置き換えます。
出力は次のようになります。
--- fingerprint: MTgTJ5m-Cjs= items: - key: enable-oslogin value: 'true' kind: compute#metadata
REST
特定の VM のメタデータをクエリするには、GET
リクエストを instances.get
メソッドに送信します。
GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
出力は次のようになります。
...... "metadata": { "kind": "compute#metadata", "fingerprint": "XXXXXXVo=", "items": [ { "key": "enable-oslogin", "value": "true" } ] },....
次のように置き換えます。
PROJECT_ID
: プロジェクト IDZONE
: VM を配置するゾーンVM_NAME
: VM の名前
次のステップ
- VM メタデータの詳細を確認する。
- カスタム メタデータの設定方法を学習する。
- ゲスト属性を設定してクエリする方法を学習する。