すべての仮想マシン(VM)インスタンスは、メタデータ サーバーにメタデータを保存します。VM からメタデータ サーバーの API にアクセスするのに追加の承認は必要ありません。自動的にアクセスできるようになります。Compute Engine は、VM とプロジェクトのメタデータのキーと値をディレクトリに保持します。各ディレクトリには、メタデータ エントリが Key-Value ペアの形式で格納されます。一部のディレクトリにはサブディレクトリが含まれています。
このドキュメントでは、VM メタデータの概要と、VM メタデータのタイプとプロパティについて説明します。
VM メタデータの使用
以下のセクションでは、メタデータ エントリを使用して VM を管理するいくつかのシナリオについて説明します。
起動とシャットダウンのスクリプト
メタデータ サーバーは、起動スクリプトおよびシャットダウン スクリプトと組み合わせて使用すると特に便利です。メタデータ サーバーを使用して、追加の承認を行わずに、VM に関する固有の情報をプログラムで取得できるからです。
たとえば、起動スクリプトで VM の外部 IP のメタデータの Key-Value ペアを取得して、その IP を使用してデータベースを設定できます。Compute Engine の事前定義されたメタデータキーはすべての VM で同じであるため、スクリプトはそのまま再利用できます。VM ごとに更新する必要はありません。これにより、アプリケーションのコードの安定性が向上します。
- 起動スクリプトの詳細については、起動スクリプトの概要をご覧ください。
- シャットダウン スクリプトの詳細については、シャットダウン スクリプトの実行をご覧ください。
ホスト メンテナンス
メタデータ サーバーは、maintenance-event
キーを使用して、scheduling/
メタデータ ディレクトリ内の VM のスケジューリング オプションに関する情報を提供します。これらのメタデータ値を使用して、メンテナンス イベントが近くなったときに通知することで、イベントに備えることができます。詳細については、ライブ マイグレーション通知の取得をご覧ください。
ゲスト属性
ゲスト属性は、VM での実行中にアプリケーションから書き込み可能な特定の型のカスタム メタデータです。ゲスト属性は、頻繁に変更されない少量のデータが必要なユースケースにのみ使用します。ゲスト属性の詳細については、ゲスト属性の設定とクエリをご覧ください。
パートナー属性
パートナー属性は、特定のタイプのインスタンス メタデータです。Google Cloud サービスは、パートナー属性を使用して名前空間を作成し、作成した名前空間内でインスタンス メタデータ エントリを定義できます。インスタンス メタデータ エントリの値を設定、更新、削除、表示して、そのサービスを構成できます。
たとえば、Compute Engine にマネージド ワークロード ID を使用する場合は、対象サービスの名前空間のメタデータ エントリで構成の詳細を指定できます。
メタデータのセキュリティに関する考慮事項
メタデータ サーバーにリクエストを送信して情報を取得する際、そのリクエストやそれに対するメタデータ レスポンスが、VM を実行する物理ホストの外に出ることはありません。
ただし、メタデータ URL をクエリできるプロセスであれば、メタデータ サーバーのすべての値にアクセスできます。これには、サーバーに書き込むカスタム メタデータ値、クライアント証明書、秘密鍵が含まれます。機密性の高い値をメタデータ サーバーに書き込むときや、サードパーティのプロセスを実行するときは、注意が必要です。メタデータ サーバーにアクセスできないプロセスはすべてサンドボックス化する必要があります。
メタデータ サーバー エンドポイント
メタデータ サーバーには、次のエンドポイントからアクセスできます。
- http エンドポイント:
http://metadata.google.internal/computeMetadata/v1
。これは、Shielded VM を含むすべての VM からアクセスできます。 - https エンドポイント:
https://metadata.google.internal/computeMetadata/v1
。これは Shielded VM からのみアクセスできます。
HTTPS メタデータ サーバー エンドポイント
HTTPS メタデータ サーバー エンドポイント(https://metadata.google.internal/computeMetadata/v1
)は、メタデータ サーバーと VM の間で情報を送信する際のセキュリティを強化します。このエンドポイントは、Shielded VM でのみ使用できます。
HTTPS メタデータ サーバー エンドポイントを使用するメリット
https エンドポイントを使用してメタデータ サーバーにクエリを実行すると、次のメリットがあります。
セキュリティの強化: 機密性の高いメタデータへの不正アクセスを防ぐことができます。これにより、攻撃者が次のいずれかのアクションを実行できなくなります。
- メタデータ サーバーのなりすましや偽装による VM へのアクセス
- VM に到達する前に機密メタデータを表示または改ざん
費用を削減: セキュリティ侵害に関連する費用を回避できます。
プロセスの流れ
ゲスト環境がインストールされている Shielded VM の場合、VM で次のプロセスが行われます。
VM の起動時に、Compute Engine は次の処理を完了します。
Compute Engine は、次のように 3 つの証明書を作成します。
- 自己署名ルート証明書: VM 用に生成された一意の証明書。
- サーバー ID 証明書: メタデータ サーバー用の証明書。
クライアント ID 証明書: クライアントの証明書。この証明書はメタデータ サーバーにキャッシュに保存されず、ゲスト環境からクライアント証明書エンドポイントを呼び出すたびに再作成されます。
クライアント ID 証明書とルート証明書の保存場所については、証明書の保存場所をご覧ください。
Compute Engine は、Google が生成した UEFI 変数を使用して、ルート証明書のパブリック部分を VM のゲスト環境に転送します。このルート証明書は VM に保存されます。
ゲスト環境は定期的にクライアント ID 証明書をリクエストします。この場合、ゲスト エージェントはメタデータ サーバーからこの証明書をダウンロードし、その VM のルート証明書を使用して検証します。
HTTPS メタデータ サーバー エンドポイントにクエリを実行するときに、クライアント ID 証明書を指定します。この証明書は、メタデータ サーバーと VM によって、このクエリが承認されていることを確認するために使用されます。
証明書の保存場所
以降のセクションでは、Compute Engine によって生成されたルート証明書とクライアント ID 証明書の保存場所について説明します。
ルート証明書
CentOS / RHEL / Rocky
CentOS、Red Hat Enterprise Linux(RHEL)、Rocky Linux VM のルート証明書は、次の場所に保存されます。
/run/google-mds-mtls/root.crt
/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
Debian / Ubuntu
Debian VM と Ubuntu VM のルート証明書は、次の場所に保存されます。
/run/google-mds-mtls/root.crt
/etc/ssl/certs/ca-certificates.crt
Fedora
Fedora VM のルート証明書は、次の場所に保存されます。
/run/google-mds-mtls/root.crt
/etc/pki/tls/certs/ca-bundle.crt
SLES
SUSE Linux Enterprise Server(SLES)VM のルート証明書は、次の場所に保存されます。
/run/google-mds-mtls/root.crt
/etc/ssl/ca-bundle.pem
Windows
Windows VM のルート証明書は、次の場所に保存されます。
C:\ProgramData\Google\ComputeEngine\mds-mtls-root.crt
Cert:\LocalMachine\Root
クライアント ID 証明書
クライアント ID 証明書には、VM で実行されているすべてのプロセスからアクセスできます。これは、http エンドポイントと同様に、すべてのプロセスが https エンドポイントを使用してメタデータ サーバーにアクセスできるようにするために必要です。詳細については、メタデータのセキュリティに関する考慮事項をご覧ください。
Linux
Linux VM のクライアント ID 証明書は、次の場所に保存されます。
/run/google-mds-mtls/client.key
Windows
Windows VM のクライアント ID 証明書は、次の場所に保存されます。
C:\ProgramData\Google\ComputeEngine\mds-mtls-client.key
Cert:\LocalMachine\My
事前定義されたメタデータキーとカスタム メタデータキー
各メタデータ エントリは、Key-Value ペアとしてメタデータ サーバーに保存されます。メタデータキーでは大文字と小文字が区別されます。キーは、事前定義されたメタデータキーまたはカスタム メタデータキーのいずれかにすることができます。
事前定義されたメタデータキー
事前定義されたメタデータキーは、Compute Engine によって作成されるメタデータキーです。VM を作成すると、Compute Engine がその VM の一部のキーのメタデータ値(VM インスタンス ID やプロジェクト ID など)を自動的に設定します。Compute Engine が値を自動的に設定しない事前定義キーについては、システム構成に応じて使用可能な値のセットから選択できます。
たとえば、VM の OS Login を有効にするために、その VM の事前定義キー enable-oslogin
の値を TRUE
に設定できます。この VM の OS Login を無効にするには、キーの値を FALSE
に更新します。更新できるのはこれらのキーの値のみで、キー自体は更新できません。
事前定義されたメタデータキーとこれらのキーのリストについては、事前定義されたメタデータキーをご覧ください。
カスタム メタデータキー
カスタム メタデータを使用すると、個々の VM またはプロジェクトで、独自のメタデータの Key-Value ペアを作成して使用できます。新しいカスタム メタデータキーの追加、既存のキーの値の更新、不要なカスタム メタデータ エントリの削除を行うことができます。 カスタム メタデータの設定は、プロジェクト内の VM に任意の値を渡す場合に便利です。また、起動スクリプトとシャットダウン スクリプトを作成する場合にも役立ちます。
VM のカスタム メタデータを追加、更新、削除する方法については、カスタム メタデータを構成するをご覧ください。
メタデータの種類
VM メタデータ エントリは、個々の VM またはプロジェクトに固有の情報を提供します。メタデータは、メタデータを設定するスコープに基づいて、プロジェクト、ゾーン、インスタンスのメタデータに分けられます。
プロジェクトのメタデータ
プロジェクト メタデータはプロジェクト スコープで定義され、プロジェクト内のすべての VM に適用される情報を提供します。このメタデータを設定すると、メタデータ エントリがそのプロジェクト内のすべての VM に伝播されます。
プロジェクトのメタデータを設定するには、事前定義されたメタデータキーとカスタム メタデータキーの両方を使用できます。詳細については、事前定義されたプロジェクト メタデータキーとプロジェクトのカスタム メタデータを設定する方法をご覧ください。
ゾーン メタデータ
ゾーン メタデータは、プロジェクト内のゾーンスコープで定義され、そのプロジェクトの特定のゾーンにある VM に関する情報を提供します。ゾーン メタデータを設定すると、メタデータ エントリは、そのプロジェクトで構成されたゾーン内のすべての VM に伝播されます。プロジェクト メタデータと比較して、ゾーン メタデータは障害の分離に役立ち、信頼性を高めることができます。
Compute Engine には、ゾーン メタデータ用の事前定義キーはありません。ゾーン メタデータを設定するには、独自のカスタム メタデータ キーを作成する必要があります。方法については、カスタム ゾーン メタデータを設定するをご覧ください。
インスタンス メタデータ
インスタンス メタデータは、特定の VM インスタンスに関する情報を提供します。インスタンス メタデータは、各 VM インスタンスに対して個別に設定します。
インスタンス メタデータの設定には、事前定義されたメタデータキーとカスタム メタデータキーの両方を使用できます。事前定義されたインスタンス メタデータキーとカスタム インスタンス メタデータを設定する方法の詳細を確認してください。
メタデータの配置
Compute Engine は、VM とプロジェクトのメタデータのキーと値をディレクトリ リストに保存し、管理します。メタデータの種類に応じて、Compute Engine はメタデータ エントリを次のいずれかのディレクトリに保存します。
メタデータのタイプ | ディレクトリ |
---|---|
プロジェクト全体のメタデータとプロジェクトのゾーン メタデータ |
|
インスタンス メタデータ |
|
各ディレクトリには、メタデータ エントリが Key-Value ペアの形式で格納されます。一部のメタデータ エントリは、他のメタデータキーを含むディレクトリでもあります。ディレクトリとして機能するメタデータ エントリは、メタデータキー名の末尾にスラッシュ(/
)でマークされます。たとえば、/project/attributes/
は、他のメタデータキーが含まれる project/
ディレクトリの下のディレクトリです。独自のメタデータ ディレクトリ リストを作成するには、カスタム メタデータ エントリを作成するときに、メタデータキー名の末尾にスラッシュ(/
)を使用する必要があります。
プロジェクトとゾーン メタデータ エントリは、同じ project/
ディレクトリに保存されます。プロジェクト レベルとゾーンレベルの VM について、同じカスタム メタデータキーに異なる値を設定すると、これらのキーのゾーン メタデータ値は、それぞれのゾーンにおけるプロジェクトのメタデータよりも優先されます。
- すでにプロジェクトの値が設定されているメタデータキーに、ゾーン メタデータ値を追加すると、Compute Engine によって、この指定されたゾーン内にある VM のプロジェクト メタデータ値がオーバーライドされ、
/project
ディレクトリがゾーン値で更新されます。 - すでにゾーン メタデータ値が設定されているメタデータキーに、新しいプロジェクト全体のメタデータ値を追加しても、何も変更されません。Compute Engine では、特定のゾーンの
/project
ディレクトリにゾーン メタデータの値が保持されます。 - 特定のゾーンのカスタム メタデータキーにゾーン メタデータ値を指定しない場合は、キーにプロジェクト メタデータ値が設定されていれば、それらのゾーンの VM では引き続きプロジェクト メタデータ値が保持されます。
たとえば、key-1=value-1
というプロジェクト全体のメタデータペアを定義するとします。また、us-central1-a
ゾーンに対してのみ、key-1=zonal-value-1
というゾーン メタデータのペアを定義したとします。プロジェクトの us-central1-a
ゾーン内のすべての VM は、メタデータのペアとして key-1=zonal-value1
を継承します。key-1
に対してゾーン メタデータを設定していない他のゾーンのすべての VM では、メタデータのペアが key-1=value-1
のままです。
次のステップ
- Google Cloud が提供する事前定義されたメタデータキーについて学習する。
- カスタム メタデータ エントリを構成する方法を学習する。
- ゲスト属性を設定してクエリする方法を学習する。
- メタデータキーの値を設定したら、VM またはプロジェクトの VM メタデータ情報を表示してクエリを実行する方法を学習する。
- メタデータ サーバーからライブ マイグレーションの通知を取得する方法を学習する。