v1 メタデータ サーバー エンドポイントへの移行

移行の概要

v1.0 へ移行するには、次の手順を実行します。

  1. 非推奨のメタデータ サーバー エンドポイントを使用している VM インスタンスを特定します

    Google Kubernetes Engine クラスタがある場合は、非推奨エンドポイントを使用している GKE ノードを特定する必要があります。

  2. 特定した VM インスタンスまたはノードで、非推奨のメタデータ サーバー エンドポイントを使用しているプロセスアプリケーション、またはイメージを見つけます。

    プロセスとアプリケーションについては、以下の情報をご確認ください。

    • このプロセスが開発していないアプリケーションに属している場合は、アプリケーションを更新して v1 メタデータ サーバー エンドポイントを使用できるようにします。更新を必要とする既知のアプリケーションのリストについては、更新を必要とするアプリケーションをご覧ください。
    • プロセスが開発したアプリケーションに属しておりコードがレガシー エンドポイントを呼び出している場合は、次の手順を実行します。
      1. v1 と非推奨メタデータ サーバー エンドポイントの違いを確認します。
      2. v1 メタデータ サーバー エンドポイントを使用するようクエリを更新します。
    • プロセスは開発したアプリケーションに属しているが、コードはいずれのレガシー エンドポイントにもリクエストをしていない場合、リクエストは SDK や他の依存関係によって行われます。この問題を解決するには、アプリケーションで使用するすべての SDK と依存関係を更新してください。更新が必要な Google ライブラリのバージョンを見るには、サポートされているライブラリのバージョンをご覧ください。
  3. (省略可)v0.1 と v1beta1 のメタデータ サーバー エンドポイントを無効にします。

    VM インスタンスを特定する

    v0.1 エンドポイントと v1beta1 エンドポイントを使用している VM インスタンスを特定するには、2 つの新しいエンドポイントにリクエストをします。

    新しいエンドポイントをクエリした結果によって、特定の VM インスタンスが非推奨エンドポイントにアクセスした回数がわかります。注: VM インスタンスが停止するたびに、カウンタはリセットされます。

    VM インスタンスが v0.1 エンドポイントと v1beta1 エンドポイントにアクセスしたかどうかを調べるには、次のコマンドを実行します。

    curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/legacy-endpoint-access/0.1
    curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/legacy-endpoint-access/v1beta1
    

    次の python サンプルは、これらの新しいエンドポイントをプログラムで監視する方法を示しています。

    def wait_for_legacy_usage(callback):
        url = '{}/instance/legacy-endpoint-access'.format(METADATA_URL)
        last_etag = '0'
        counts = None
        while True:
            r = requests.get(
                url,
                params={
                    'last_etag': last_etag,
                    'recursive': True,
                    'wait_for_change': True
                },
                headers=METADATA_HEADERS)
            if r.status_code == 503:  # Metadata server unavailable
                print('Metadata server unavailable. Sleeping for 1 second.')
                time.sleep(1)
                continue
            if r.status_code == 404:  # Feature not yet supported
                print('Legacy endpoint access not supported. Sleeping for 1 hour.')
                time.sleep(3600)
                continue
            r.raise_for_status()
    
            last_etag = r.headers['etag']
            access_info = json.loads(r.text)
            if not counts:
                counts = access_info
            if access_info != counts:
                diff = {
                    ver: access_info[ver] - counts[ver] for ver in counts
                }
                counts = access_info
                callback(diff)

    GKE ノードを特定する

    Google Kubernetes Engine クラスタ内で v0.1 エンドポイントと v1beta1 エンドポイントを使用しているノードを特定するには、レガシー メタデータ サーバー エンドポイントを使用したワークロードを特定するをご覧ください。

    プロセスを特定する

    非推奨のメタデータ サーバー エンドポイントにリクエストしている VM インスタンスを特定した後に、これらの VM インスタンスでこれらのリクエストをしているプロセスを見つけることができます。

    プロセスを特定するには、ngrepauditd のようなロギングツールやモニタリングツールを使用します。

    ngrep

    ngrep (ネットワーク grep)を使用してパケットを収集してこれらのパケットの内容をフィルタリングできます。非推奨エンドポイントにリクエストしているプロセスのパケット情報を収集するには、VM インスタンスで、次のコマンド実行します。

    sudo ngrep -l -q "v1beta1|0\.1/meta-data" tcp \
    and dst host 169.254.169.254 or metadata.google.internal \
    and dst port 80
    

    非推奨エンドポイントに行われているリクエストがある場合、出力は次のようになります。

    T 10.128.0.4:41312 -> 169.254.169.254:80 [AP]
    GET /computeMetadata/v1beta1/instance/id HTTP/1.1..Host: metadata.goog..User-Agent: curl/7.52.1..Accept: */*....
    

    出力には次の情報が含まれます。

    • ルート URL: /computeMetadata/v1beta1/instance/id
    • リクエストをするために使用されているユーザー エージェント。この例では、curl/7.52.1 です。
    • リクエストの送信元である VM インスタンスの IP アドレス(ソース IP)とポート。この例では、IP アドレスは 10.128.0.4 でポートは 41312 です。
    • プロセスがまだ進行中の場合は、ポート情報を調べるとプロセス ID が見つかります。

    ポート情報を確認する

    次の手順によって、待機中の HTTP GET リクエストが未処理のプロセスが特定される場合があります。この手順によって、現在のメタデータ エンドポイントと非推奨メタデータ エンドポイントの両方と通信しているプロセスが見つかります。

    メタデータ サーバーとの接続がオープンしているソケットを一覧表示するには、VM インスタンスで、次のコマンドを実行します。

    sudo lsof -n -P +c 0 -i @169.254.169.254

    出力は次のようになります。

    COMMAND         PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
    google_network_ 798 root    7u  IPv4 1674967626      0t0  TCP 10.128.0.4:44876->169.254.169.254:80 (ESTABLISHED)
    google_accounts 805 root    5u  IPv4 1674980506      0t0  TCP 10.128.0.4:44878->169.254.169.254:80 (ESTABLISHED)
    google_clock_sk 809 root    5u  IPv4 1674982496      0t0  TCP 10.128.0.4:44880->169.254.169.254:80 (ESTABLISHED)
    google_clock_sk 809 root    6u  IPv4 1674914460      0t0  TCP 10.128.0.4:44874->169.254.169.254:80 (CLOSE_WAIT)
    

    NAME 列はソース IP、宛先 IP、ポートを示します。これだけでプロセスを特定するには足りない場合は、ps コマンドを使用して詳細情報を表示できます。

    ps 798 805 809

    出力は次のようになります。

    PID TTY      STAT   TIME COMMAND
    798 ?        Ss     9:07 /usr/bin/python /usr/bin/google_network_daemon
    805 ?        Ss    14:19 /usr/bin/python /usr/bin/google_accounts_daemon
    809 ?        Ss     4:33 /usr/bin/python /usr/bin/google_clock_skew_daemon
    

    auditd(Linux のみ)

    Auditd は、監査ログを一連のルールに基づいてディスクに書き出せるデーモンです。connect システムコールのルールを定めることで、どのプロセスがメタデータ サーバーの非推奨エンドポイントに各接続を作成しているかを特定できます。

    1. connect システムコールを監査するルールをセットアップするには、VM インスタンスで、次のコマンドを実行します。

      sudo auditctl -a exit,always -F arch=b64 -S connect -k CONNECT
    2. 非推奨エンドポイントへの接続をクエリするには、VM インスタンスで、次のコマンドを実行します。

      sudo ausearch -m SOCKADDR -k CONNECT --interpret | grep -C 3 'computeMetadata/v1beta1\|0\.1/meta-data'

      出力は次のようになります。

      type=PROCTITLE msg=audit(09/26/2019 22:20:21.498:847) : proctitle=curl metadata.goog/computeMetadata/v1beta1/instance/id
      type=SOCKADDR msg=audit(09/26/2019 22:20:21.498:847) : saddr={ fam=inet laddr=169.254.169.254 lport=80 }
      type=SYSCALL msg=audit(09/26/2019 22:20:21.498:847) : arch=x86_64 syscall=connect success=no exit=EINPROGRESS(Operation now in progress) a0=0x3 a1=0x7fffd965bd50 a2=0x10 a3=0x14856d3402026e items=0 ppid=27641 pid=28977 auid=alice uid=alice gid=alice euid=alice suid=alice fsuid=alice egid=alice sgid=alice fsgid=alice tty=pts9 ses=2828 comm=curl exe=/usr/bin/curl key=CONNECT
      

      出力には次の情報が含まれます。

      • プロセスのタイトル: proctitle
      • リクエスト URL: curl metadata.goog/computeMetadata/v1beta1/instance/id
      • 実行可能ファイルのロケーション: exe=/usr/bin/curl
      • ユーザー: uid=alice

      プロセスを特定した後は、ルールを削除できます。ルールを削除するには、次のコマンドを実行します。

      sudo auditctl -d exit,always -F arch=b64 -S connect -k CONNECT

    v1beta1 と v1.0 のメタデータ サーバー エンドポイントの違い

    v1 メタデータ サーバーの機能は、以前の v1beta1 サーバーとわずかに異なります。新しいメタデータ サーバーでは、すべてのリクエストに Metadata-Flavor: Google ヘッダーがあり、リクエストがメタデータ値の取得を目的として行われたことを示している必要があります。

    この新しいヘッダーを含むようリクエストを更新してください。たとえば、disks/ 属性に対するリクエストは次のようになります。

    user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/" -H "Metadata-Flavor: Google"
    

    v0.1 と v1.0 のメタデータ サーバー エンドポイントの違い

    一般に、v0.1 メタデータ サーバー エンドポイントは、v1 と次の点で異なります。

    • メタデータ サーバー エンドポイントのクエリに使用されたルートは http://metadata.google.internal/0.1/meta-data/ から http://metadata.google.internal/computeMetadata/v1/ に変わりました。
    • v1 メタデータ サーバー リクエストには Metadata-Flavor: Google ヘッダーが含まれていなければなりません。たとえば、disks/ 属性に対するリクエストは次のようになります。

      curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/" -H "Metadata-Flavor: Google"
    • カスタム メタデータに対するクエリは、プロジェクトおよびインスタンス レベルの両方で行えます。

      v0.1 メタデータ サーバーの attributes/ プロパティでは、インスタンスとプロジェクトのメタデータ値はどちらも同じディレクトリにあります。属性にインスタンスとプロジェクトの両方のメタデータ値がある場合、指定されたキーに対するインスタンス メタデータ値が返されます。

      v1 クエリの場合、URL にはインスタンスとプロジェクトのどちらのメタデータをリクエストしているかが指定されていなければなりません。たとえば、sshKeys 属性をクエリするには、次のいずれかまたは両方を実行します。

      sshKeys がプロジェクトで設定されている場合は、次のコマンドを実行します。

      curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/sshKeys" -H "Metadata-Flavor: Google"

      sshKeys がこのインスタンスで設定されている場合は、次のコマンドを実行します。

      curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/sshKeys" -H "Metadata-Flavor: Google"
    • v0.1 の一部のメタデータ エントリは JSON オブジェクトを返します。v1 メタデータ サーバーでは、これらのメタデータ エントリはディレクトリ別に整理されます。このエントリ構成では、これらの以前にネストされたフィールドの特定インデックスのエントリと値をクエリできます。ディレクトリ一覧をクエリしたり v1 の JSON オブジェクトにアクセスする場合の詳細については、ディレクトリ一覧としての属性をご覧ください。

    v0.1 と v1 のメタデータ サーバー エンドポイントの詳細な対応付けについては、次の表をご覧ください。

    インスタンス属性

    次のメタデータ エントリは instance/ ディレクトリに移動されます。

    v0.1 root - http://metadata.google.internal/0.1/meta-data/
    v1 root - http://metadata.google.internal/computeMetadata/v1
    メタデータ エントリ バージョン URI (ルート相対) 出力例
    説明 v0.1 description My instance description
    v1 instance/description
    Hostname v0.1 hostname my-instance.c.my-project.internal
    v1 instance/hostname
    イメージ v0.1 image projects/eip-images/global/images/debian-9-drawfork-v20180109
    v1 instance/image
    マシンタイプ v0.1 machine-type projects/12345/machineTypes/e2-standard-2
    v1 instance/machine-type
    インスタンス タグ v0.1 tags ["cheese", "lettuce"]
    v1 instance/tags
    ゾーン v0.1 zone projects/12345/zones/us-central1-c
    v1 instance/zone

    プロジェクト属性

    次のメタデータ エントリは project/ ディレクトリに移動されます。

    v0.1 root - http://metadata.google.internal/0.1/meta-data/
    v1 root - http://metadata.google.internal/computeMetadata/v1
    メタデータ エントリ バージョン URI(ルート相対) 出力例
    プロジェクト ID v0.1 project-id my-project
    v1 project/project-id
    プロジェクト数値 ID v0.1 numeric-project-id 12345
    v1 project/numeric-project-id

    移動した属性

    次のメタデータ エントリは新しいエンドポイントに移動しています。

    v0.1 root - http://metadata.google.internal/0.1/meta-data/
    v1 root - http://metadata.google.internal/computeMetadata/v1
    メタデータ エントリ バージョン URI(ルート相対) 出力例
    ドメイン v0.1 domain c.my-project.internal
    v1 instance/hostname my-instance.c.my-project.internal

    名前が変更された属性

    次のメタデータ エントリの名前は変更されています。

    v0.1 root - http://metadata.google.internal/0.1/meta-data/
    v1 root - http://metadata.google.internal/computeMetadata/v1
    メタデータ エントリ バージョン URI(ルート相対) 出力例
    インスタンス ID v0.1 instance-id 123456789
    v1 instance/id 123456789

    ディレクトリ一覧としての属性

    次のメタデータ エントリは v0.1 の JSON オブジェクトを返し、v1 のディレクトリに整理されています。

    これらのメタデータ エントリでは、次のいずれかの方法を使用してエンドポイントにアクセスできます。

    Note: VPC networks have a default maximum transmission unit (MTU) of 1460 bytes. However, the network MTU can be set to 1500 bytes. See Maximum transmission unit for background on network MTUs.
    v0.1 root - http://metadata.google.internal/0.1/meta-data/
    v1 root - http://metadata.google.internal/computeMetadata/v1
    メタデータ エントリ バージョン URI(ルート相対) 出力例
    ディスク v0.1 disks
    
    {"disks":[{
    "deviceName":"persistent-disk-0",
    "index":0,
    "mode":"READ_WRITE",
    "type":"PERSISTENT"}]}
    v1 instance/attached-disks/?recursive=true
    
    [{"deviceName": "persistent-disk-0",
    "index":0,
    "mode":"READ_WRITE",
    "type":"PERSISTENT"}]
    ネットワーク インターフェース v0.1 network
    
    {"networkInterface":
    [{"accessConfiguration":
    [{"externalIp":"35.194.6.47",
    "type":"ONE_TO_ONE_NAT"}],
    "ip":"10.128.0.4",
    "mac":"42:01:0a:80:00:04","mtu":1460,
    "network":"projects/12345/networks/default"}]}
    v1 instance/network-interfaces/?recursive=true
    
    [{"accessConfigs":
    [{"externalIp":"35.194.6.47",
    "type":"ONE_TO_ONE_NAT"}],
    "dnsServers":["169.254.169.254"],
    "forwardedIps":[],
    "gateway":"10.128.0.1",
    "ip":"10.128.0.4",
    "ipAliases [],
    "mac":"42:01:0a:80:00:04","mtu":1460,
    "network":"projects/12345/networks/default",
    "subnetmask":"255.255.240.0","targetInstanceIps":[]}]
    サービス アカウント情報(すべてのサービス アカウント) v0.1 service-accounts
    
    {"serviceAccounts":
    [{"scopes":["https://www.googleapis.com/auth/devstorage.read_only"],
    "serviceAccount":"12345-compute@developer.gserviceaccount.com"}]}
    v1 instance/service-accounts/?recursive=true
    
    {"123451-compute@developer.gserviceaccount.com":
    {"aliases":["default"],
    "email":"123451-compute@developer.gserviceaccount.com",
    "scopes":["https://www.googleapis.com/auth/devstorage.read_only"]},
    "default":{"aliases":["default"],
    "email":"123451-compute@developer.gserviceaccount.com",
    "scopes":["https://www.googleapis.com/auth/devstorage.read_only"]}}
    サービス アカウント情報(ひとつのサービス アカウント) v0.1 service-accounts/<email|default>
    
    {"scopes":["https://www.googleapis.com/auth/devstorage.read_only"],
    "serviceAccount":"123451-compute@developer.gserviceaccount.com"}
    
    v1 instance/service-accounts/<email|default>/?recursive=true
    
    {"aliases":["default"],
    "email":"123451-compute@developer.gserviceaccount.com",
    "scopes":["https://www.googleapis.com/auth/devstorage.read_only"]}
    

    OAuth 2.0 アクセス トークンをクエリする

    次のメタデータ エントリは OAuth2 アクセス トークンを返します。

    v0.1 root - http://metadata.google.internal/0.1/meta-data/
    v1 root - http://metadata.google.internal/computeMetadata/v1
    メタデータ エントリ バージョン URI(ルート相対) 出力例
    OAuth2 トークン v0.1 (メソッド 1)

    auth-token?service_account=<email|default>&scope=scopeA,scopeB

    または

    auth_token?service_account=<email|default>&scope=scopeA,scopeB

    
    {"expires":1568854217,
    "oauth2_access_token":"ya29.c.KmyIB0i4tH1xLzKGrqeeK6TGWEW3b18Lcq...."}
    
    v0.1 (メソッド 2) service-accounts/<email|default>/acquire
    
    {"accessToken":"ya29.c.KmyIB0i4tH1xLNzKGrqeeK6TGWEW3b18Lcq.....",
    "expiresAt":1568854217,"expiresIn":2022}
    v1 instance/service-accounts/<email|default>/token
    
    {"access_token":"ya29.c.KmyIB0i4tH1xLNzKGrqeeK6TGWEW3b18Lcq....",
    "expires_in":2022,"token_type":"Bearer"}

    更新が必要なアプリケーション

    v1 メタデータ サーバー エンドポイントを使用するには、次のアプリケーションをサポートされている最小バージョン以上に更新します。

    アプリケーション サポートされている最小バージョン
    Facter(Puppet により開発)
    Cloud Monitoring エージェント 5.5.2-375
    RightScale のサーバー エージェント (RightLink) RightLink 10

    更新するイメージ

    ゲスト属性を有効にしている場合、次のイメージが v1beta1 メタデータ サーバーを呼び出して SSH ホストキーを保存します。 表示されているより新しいバージョンのイメージにアップグレードすることをおすすめします。

    OS イメージのバージョン
    CentOS
    • centos-6-v20190619
    • centos-7-v20190619
    Debian debian-9-stretch-v20190618
    Red Hat Enterprise Linux(RHEL)
    • rhel-6-v20190618
    • rhel-7-v20190618
    • rhel-8-v20190521
    • rhel-8-v20190522
    • rhel-8-v20190618
    • rhel-7-4-sap-v20190618
    • rhel-7-6-sap-v20190618
    SUSE Linux Enterprise Server(SLES)
    • sles-15-sp1-v20190625
    • sles-15-sp1-sap-v20190625

    サポートされているライブラリ バージョン

    一部の Google ライブラリは、v1 メタデータ サーバー エンドポイントへの移行による影響を受けません。ただし、次の表に示すライブラリを使用している場合は、サポートされている最小バージョン以上にアップグレードしてください。

    言語 Google ライブラリ サポートされている最小バージョン
    Java com.google.api-client 1.18.0-rc
    Node.js dialogflow 0.6.0
    Node.js firebase-admin 8.2.0
    Node.js google-cloud/debug-agent 3.0.0
    Node.js google-cloud/profiler 0.2.0
    Node.js google-cloud/trace-agent 2.11.0
    Node.js gcp-metadata 0.5.0
    Node.js gcs-resumable-upload 0.13.0
    Node.js googleapis 27.0.0
    Node.js google-auth-library 1.3.0
    Node.js google-cloud/bigquery 2.0.0
    Node.js google-cloud/bigquery-data-transfer 0.4.0
    Node.js google-cloud/bigtable 0.15.0
    Node.js google-cloud/cloud-container 0.3.0
    Node.js google-cloud/compute 0.11.0
    Node.js google-cloud/datastore 2.0.0
    Node.js google-cloud/dlp 0.8.0
    Node.js google-cloud/dns 0.8.0
    Node.js google-cloud/error-reporting 0.5.0
    Node.js google-cloud/firestore 0.16.1
    Node.js google-cloud/language 2.0.0
    Node.js google-cloud/logging-bunyan 0.9.0
    Node.js google-cloud/logging 2.0.0
    Node.js google-cloud/logging-winston 0.10.0
    Node.js google-cloud/monitoring 0.6.0
    Node.js google-cloud/os-login 0.3.0
    Node.js google-cloud/pubsub 0.20.0
    Node.js google-cloud/redis 0.2.0
    Node.js google-cloud/resource 0.9.0
    Node.js google-cloud/spanner 2.0.0
    Node.js google-cloud/speech 2.0.0
    Node.js google-cloud/storage 2.0.0
    Node.js google-cloud/tasks 0.2.0
    Node.js google-cloud/text-to-speech 0.3.0
    Node.js google-cloud/translate 2.0.0
    Node.js google-cloud/vision 0.21.0
    Node.js google-cloud/profiler 0.2.0
    Node.js google-cloud/trace-agent 2.11.0
    Node.js google-gax 0.17.0
    Node.js gce-images 1.0.0
    Node.js gcp-metadata 0.5.0
    Node.js gcs-resumable-upload 0.13.0
    Node.js googleapis 27.0.0
    Node.js google-auth-library 1.3.0
    Node.js google-cloud/bigquery 2.0.0
    Node.js google-cloud/bigquery-data-transfer 0.4.0
    Node.js google-cloud/bigtable 0.15.0
    Node.js google-cloud/cloud-container 0.3.0
    Node.js google-cloud/common 0.18.0
    Node.js google-cloud/common-grpc 0.7.0
    Node.js google-cloud/compute 0.11.0
    Node.js google-cloud/datastore 2.0.0
    Node.js google-cloud/dlp 0.8.0
    Node.js google-cloud/dns 0.8.0
    Node.js google-cloud/error-reporting 0.5.0
    Node.js google-cloud/firestore 0.16.1
    Node.js google-cloud/language 2.0.0
    Node.js google-cloud/logging 2.0.0
    Node.js google-cloud/logging-bunyan 0.9.0
    Node.js google-cloud/logging-winston 0.10.0
    Node.js google-cloud/monitoring 0.6.0
    Node.js google-cloud/os-login 0.3.0
    Node.js googleapis/nodejs-pubsub 0.20.0
    Node.js google-cloud/redis 0.2.0
    Node.js google-cloud/resource 0.9.0
    Node.js google-cloud/spanner 2.0.0
    Node.js google-cloud/speech 2.0.0
    Node.js google-cloud/storage 2.0.0
    Node.js google-cloud/tasks 0.2.0
    Node.js google-cloud/text-to-speech 0.3.0
    Node.js google-cloud/translate 2.0.0
    Node.js google-cloud/video-intelligence 1.3.0
    Node.js google-cloud/vision 0.21.0
    PHP google-cloud/video-intelligence 1.3.3
    Python oauth2client 2.0.0
    Python google-api-python-client 1.6.0
    Python googleapis/google-cloud-python 0.10.0
    Python google-cloud-happybase 0.20.0
    Ruby gcloud 0.11.1
    Ruby google-api-client 0.8.6