FirecrackerのMMDS(microVM Metadata Service)を試してみる

2018.12.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、ゲストの大瀧です。
FirecrackerにはホストからmicroVMに情報を伝達する仕組みとしてMMDS(microVM Metadata Service)があり、Amazon EC2のインスタンスメタデータと同様にmicroVMからアクセスできます。本ブログでは簡単な使い方と試してみた様子をご紹介します。

microVMのセットアップ

MMDSはネットワーク機能なのでmicroVMにゲストNICが必要です。ゲストNICの追加と活性化はこちらのブログを参考にしてください。ゲストNICの作成時のリクエストボディーに"allow_mmds_requests": trueとすることでMMDSにアクセス出来るようになります。

sudo curl --unix-socket /tmp/firecracker.sock -i \
  -X PUT 'http://localhost/network-interfaces/eth0' \
  -H 'Accept: application/json' -H 'Content-Type: applicaion/json' \
  -d '{
    "iface_id":            "eth0",
    "host_dev_name":       "veth0",
    "allow_mmds_requests": true
  }'

MMDSで提供するデータはREST APIのPUT /mmdsにJSON形式で登録します。以下のような感じです。

sudo curl --unix-socket /tmp/firecracker.sock -i \
  -X PUT 'http://localhost/mmds' \
  -H 'Accept: application/json' -H  'Content-Type: application/json' \
  -d '{
    "latest": {
      "meta-data": {
        "ami-id": "ami-12345678",
        "reservation-id": "r-fea54097",
        "local-hostname": "ip-10-251-50-12.ec2.internal",
        "public-hostname": "ec2-203-0-113-25.compute-1.amazonaws.com",
        "network": {
          "interfaces": {
            "macs": {
              "02:29:96:8f:6a:2d": {
                "device-number": "13345342",
                "local-hostname": "localhost",
                "subnet-id": "subnet-be9b61d"
              }
            }
          }
        }
      }
    }
  }'
HTTP/1.1 204 No Content
Date: Tue, 25 Dec 2018 02:25:47 GMT

MMDSの取得

microVMからは169.254.169.254へのHTTPリクエストでMMDSにアクセスします。パスは設定時のJSONに対応するので、たとえば

{
  "latest": {
    "meta-data": {
      "local-hostname": "ip-10-251-50-12.ec2.internal"
    }
  }
}

にアクセスする場合、URLは

https://169.254.169.254/latest/meta-data/local-hostname

となります。

localhost:~# curl 169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internallocalhost:~#

こんな感じで取れます。シンプルですね。

MMDSの更新

MMDSをセットするREST APIはPUT /mmdsでしたが、このAPIではクレデンシャル情報など後からメタデータを更新するときにJSON全体を更新しなければなりません。代わりに、差分のみリクエストに含めて更新するためのAPIPATCH /mmdsもあります。以下のような感じです。

sudo curl --unix-socket /tmp/firecracker.sock -i \
  -X PATCH 'http://localhost/mmds' \
  -H  'Accept: application/json' -H  'Content-Type: application/json' \
  -d '{
  "latest": {
    "meta-data": {
      "local-hostname": "server1.internal"
    }
  }
}'
HTTP/1.1 204 No Content
Date: Tue, 25 Dec 2018 02:28:04 GMT

microVMからアクセスすると...

localhost:~# curl 169.254.169.254/latest/meta-data/local-hostname
server1.internallocalhost:~#

正しく更新されていますね。

まとめ

FirecrackerのメタデータサービスMMDSの簡単な使い方をご紹介しました。素朴な実装なので、クラウドとの連携など簡単に実現できそうですよね。

なお、今回ご紹介した内容は近日中にマージされるであろう、以下のドキュメント案が元になっています。合わせてご覧ください。