[GoogleAPI千本ノック] Google Compute Engine API を試してみた

ご注意

この記事は 2014年12月8日 に書かれたものです。内容が古い可能性がありますのでご注意ください。

こんにちは。GoogleのAPIを隔週で片っ端から紹介する、GoogleAPI千本ノック 第二回目は、Google Compute Engine APIです。 Google Compute Engine APIはその名の通り、Google Compute Engine をコントロールするためのAPIです。 VMインスタンス・ディスク・ファイアウォールなどIaas環境を一通りAPIで構築できます。 提供されているAPIは、CLIツール(gcloud compute)及びUI(ディベロッパコンソール)と同様なリソースにアクセスできます。

リソースの種類

Google Compute Engine には次の26種類のリソースが用意されています。

表1. リソースの種類

リソース名 リソースの概要
Addresses 静的IPアドレスを管理します。名前とIPアドレスを紐付けてVMインスタンスなどに紐付けます。
BackendServices バックエンドサービスの管理を行います。(ここでいうBackendはGAEのBackendsではない)バックエンドサービスは、HTTPロードバランサの内部にあるインスタンスの集合体です。
Disks VMインスタンスを動かすためのディスクを管理します。スタンダードタイプとSSDタイプが選択できます。
DiskTypes Googleが提供しているVMインスタンスを乗せるストレージのディスクタイプ情報を取得します。スタンダードタイプとSSDタイプがあります。
Firewalls 内向きのパケットに対してファイアウォールを管理します。
ForwardingRules ネットワークロードバランシングのフォワーディングルールを管理します。
GlobalAddress グローバルアドレスを管理します。
GlobalForwardingRules HTTPロードバランシングのフォワーディングルールを管理します。
GlobalOperations グローバルオペレーションはグローバルリソース(イメージ、ゾーン、ネットワーク、ファイアウォール、カーネル、スナップショットなど)に対してのみ行ったオペレーションです。その一覧を取得します。
HttpHealthChecks ロードバランサのヘルスチェックの管理を行います
Images VMイメージを管理します。
Instances VMインスタンスを管理します。
InstanceTemplates インスタンステンプレート(VMインスタンスの設定を定義しているもの)を管理します。Deployment Managerでも同様なサービスを提供していますがこれはインスタンスのみの設定です。
Licenses ソフトウェアの使用に関わるライセンスを取得します。
MachineTypes VMインスタンスのマシンタイプ一覧を取得します。
Networks ネットワークを管理します。
Projects プロジェクトに対しての管理をします。現在のリソースの容量などが一覧で取得できます。
RegionOperations 各リージョンでのオペレーションの結果一覧を取得することができます。
Regions Googleが提供しているリージョンの一覧を取得します。
Routes ネットワークルーティングを管理します。
Snapshots ディスクのスナップショットを取得及び削除できます。スナップショットの生成はcompute.disks.createSnapshotで行います。
TargetHttpProxies HTTP Proxyを追加及び管理します。
TargetInstances ターゲットインスタンスを管理します。
TargetPools ネットワークロードバランサのターゲットプールを管理します。
UrlMaps Httpロードバランサで使用するURLマップを管理します。
ZoneOperations 各ゾーンでのオペレーションの結果一覧を取得することができます。
Zones Googleが提供しているゾーンの一覧を取得します。

APIのリクエスト制限

Google Compute Engine API のリクエスト数上限は、1日250,000リクエスト・1ユーザ辺り秒間20リクエストまで設けられていますが、CLIツール(gcloud compute)またはUI(ディベロッパコンソール)でのアクセスもリクエストに加算されます。

APIのスコープ

Google Compute Engine API を OAuth2.0でアクセスするとき次のスコープを指定します。 基本的には、「Google Compute Engine リソースを閲覧・管理するスコープ」で事が済んでしまいますが、 Cloud Storage にアップロードしたイメージファイルなどを利用する場合は「Google Cloud Stotageのデータを閲覧・管理するスコープ」も追加する必要があります。 スコープの種類は以下です。

表2. スコープの種類

スコープの指定 スコープの効果
https://www.googleapis.com/auth/compute Google Compute Engine リソースを閲覧・管理する
https://www.googleapis.com/auth/compute.readonly Google Compute Engine リソースを閲覧する
https://www.googleapis.com/auth/devstorage.full_control Google Cloud Storageのデータの権限を管理する
https://www.googleapis.com/auth/devstorage.read_only Google Cloud Storageのデータを閲覧する
https://www.googleapis.com/auth/devstorage.read_write Google Cloud Storageのデータを閲覧・管理する

APIの基本メソッド

Google Compute Engine API の各リソースには、基本的には次のメソッドが用意されています。 compute.{RESOURCE}.{メソッド名} の形式で指定出来ます。他にそれぞれのリソース固有のメソッドも存在します。

表3. メソッドの種類

メソッドの種類 メソッドの動作
list リージョン及びゾーンを指定して、そのリージョン及びゾーン内のリソース一覧を取得します。
aggregatedList 全てのリージョン及びゾーンのリソース一覧を取得します。
get リージョン及びゾーンと、リソースの名前を指定してそのリソースを単体で取得します。
delete リージョン及びゾーンと、リソースの名前を指定してそのリソースを削除します。
insert リージョン及びゾーンと、リソースの名前を指定して新しいリソースを追加します。

Compute Engine API を試してみる

それではAPIのテスティングを Google API Explorer という便利なサービスで試してみたいと思います。 このサービス 26種類全てのリソースのAPIをご紹介できませんが、今回は以下の5つの代表的なリソースに絞ってご紹介します。
  • striDisks
  • Firewalls
  • Images
  • Instances
  • Networks
プロジェクトID:my-gce-projectで新しくプロジェクトを作成し、Google Compute Engine APIを有効にします。 まずはDiskを試してみます。

Disks

このリソースのメソッドは全て「Google Compute Engine リソースを閲覧・管理するスコープ」だけ指定すればアクセスできます。

メソッド:compute.disks.insert

操作内容:Googleが提供しているディスクタイプを指定して空の10GBディスクを生成します。 リクエストで指定しているのは、ディスクの名前、説明文、ディスクサイズ、ディスクタイプです。 ディスクタイプは、DiskTypesリソースで取得したselfLinkから取ってきたURLのcontentsをwwwに書き換えて使用しています。 リクエスト
POST https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/asia-east1-a/disks {     ”name”: “disk-1″,     ”description”: “ディスク”,     ”sizeGb”: “10”,     ”type”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/asia-east1-a/diskTypes/pd-standard” }
レスポンス
{     ”kind”: “compute#operation”,     ”id”: “7734094555285698419”,     ”name”: “operation-1416203232762-50807829e5893-8bbdccac-a6ac720e”,     ”zone”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/asia-east1-a”,     ”operationType”: “insert”,     ”targetLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/asia-east1-a/disks/disk-2″,     ”status”: “PENDING”,     ”user”: “cloud-ace@yoshidumi.co.jp”,     ”progress”: 0,     ”insertTime”: “2014-11-16T21:47:13.235-08:00″,     ”startTime”: “2014-11-16T21:47:13.495-08:00″,     ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/asia-east1-a/operations/operation-1416203232762-50807829e5893-8bbdccac-a6ac720e” }
Developer Consoleでディスクが生成されているのか確認します。 gce_make_disk disk-1が生成されているのが確認されました。

メソッド:compute.disks.aggregated

操作内容:プロジェクト内の全てのゾーンでのディスク一覧を取得します。 リクエスト
GET https://www.googleapis.com/compute/v1/projects/my-gce-project/aggregated/disks
レスポンス
{     ”kind”: “compute#diskAggregatedList”,     ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/aggregated/disks”,     ”id”: “projects/my-gce-project/aggregated/disks”,     ”items”: {         ”zones/asia-east1-a”: {             ”disks”: [                 {                 ”kind”: “compute#disk”,                 ”id”: “16290216981908894876”,                 ”creationTimestamp”: “2014-11-12T19:30:46.692-08:00″,                 ”zone”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/asia-east1-a”,                 ”status”: “READY”,                 ”name”: “disk-1″,                 ”description”: “ディスク”,                 ”sizeGb”: “10”,                 ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/disks/disk-1″,                 ”type”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/diskTypes/pd-standard”                 }             ]         }     } }
asia-east1-aゾーンで作成したdisk-1が取得されています。

メソッド:compute.disks.createSnapshot

操作内容: ディスクのスナップショット(その瞬間のディスクの内容)を作成します。 指定するのは、スナップショットの名前だけです。 リクエスト
POST https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/disks/disk-1/createSnapshot {     ”kind”: “compute#snapshot”,     ”name”: “snapshot-1” }
レスポンス
{     ”kind”: “compute#operation”,     ”id”: “9819065188329585591”,     ”name”: “operation-1415857833930-507b7173e6d11-52fe770f-de12c15f”,     ”zone”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a”,     ”operationType”: “createSnapshot”,     ”targetLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/disks/disk-1″,     ”targetId”: “16290216981908894876”,     ”status”: “PENDING”,     ”user”: “cloud-ace@yoshidumi.co.jp”,     ”progress”: 0,     ”insertTime”: “2014-11-12T21:50:34.224-08:00″,     ”startTime”: “2014-11-12T21:50:34.575-08:00″,     ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/operations/operation-1415857833930-507b7173e6d11-52fe770f-de12c15f” }
Developer Consoleでスナップショットが生成されているのか確認します。 gce_make_snapshot snapshot-1が生成されているのが確認されました。

Firewalls

このリソースのメソッドは全て「Google Compute Engine リソースを閲覧・管理するスコープ」だけ指定すればアクセスできます。 メソッド:compute.firewalls.insert 操作内容: ファイアウォール設定を追加します。 ファイアウォールの名前と、プロトコル・ポート番号・IPアドレスを指定して設定します。 下のリクエストでは、3389番ポートを許可し、IPアドレス 0.0.0.0/0 即ちどこからでもアクセスできるように設定している例です。 リクエスト
POST https://www.googleapis.com/compute/v1/projects/my-gce-project/global/firewalls {     ”name”: “default-allow-rdp”,     ”allowed”: [         {             ”IPProtocol”: “tcp”,             ”ports”: [                 ”3389″             ]         }     ],     ”description”: “Allow RDP from anywhere”,     ”network”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/networks/default”,     ”kind”: “compute#firewall”,     ”sourceRanges”: [         ”0.0.0.0/0″     ],     ”selfLink”: “” }
レスポンス
{     ”kind”: “compute#operation”,     ”id”: “2761369864780807228”,     ”name”: “operation-1415862907836-507b845ac1661-002233ef-45c7f32f”,     ”operationType”: “insert”,     ”targetLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/firewalls/default-allow-rdp”,     ”status”: “PENDING”,     ”user”: “cloud-ace@yoshidumi.co.jp”,     ”progress”: 0,     ”insertTime”: “2014-11-12T23:15:08.039-08:00″,     ”startTime”: “2014-11-12T23:15:08.473-08:00″,     ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/operations/operation-1415862907836-507b845ac1661-002233ef-45c7f32f” }
Developer Consoleでファイアウォールが生成されているのか確認します。 gce_firewall_1default-allow-rdpが指定した通りに生成されました。

メソッド:compute.firewalls.update

操作内容: ファイアウォール設定を変更します。一度作成したファイアウォールはupdateで内容を変更します。 ファイアウォールの名前を指定して、43345番ポートも許可します。 リクエスト
PUT https://www.googleapis.com/compute/v1/projects/my-gce-project/global/firewalls/default-allow-rdp {     ”allowed”: [         {             ”IPProtocol”: “tcp”,             ”ports”: [             ”3389″,                 ”43345″             ]         }     ],     ”kind”: “compute#firewall”,     ”sourceRanges”: [         ”0.0.0.0/0″     ],     ”name”: “default-allow-rdp” }
レスポンス
{     ”kind”: “compute#operation”,     ”id”: “10026489183292974932”,     ”name”: “operation-1415867609135-507b95de43798-227ed2ff-5825c18b”,     ”operationType”: “update”,     ”targetLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/firewalls/default-allow-rdp”,     ”targetId”: “7806542325080482897”,     ”status”: “PENDING”,     ”user”: “cloud-ace@yoshidumi.co.jp”,     ”progress”: 0,     ”insertTime”: “2014-11-13T00:33:29.300-08:00″,     ”startTime”: “2014-11-13T00:33:29.585-08:00″,     ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/operations/operation-1415867609135-507b95de43798-227ed2ff-5825c18b” }
gce_firewall_2再度、default-allow-rdpを確認すると、43345番ポートが追加されていました。

Images

メソッド:compute.images.insert

操作内容:ディスクからイメージを作成します。イメージはグローバルリソースなのでゾーンは指定しません。 下の例では、disk-1からimage-1を生成しています。 リクエスト
POST https://www.googleapis.com/compute/v1/projects/my-gce-project/global/images {     ”name”: “image-1″,     ”description”: “from disk”,     ”kind”: “compute#image”,     ”sourceDisk”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/disks/disk-1″,     ”sourceType”: “RAW”,     ”sourceDiskId”: “disk-1” }
レスポンス
{     ”kind”: “compute#operation”,     ”id”: “249793289545589536”,     ”name”: “operation-1415873465993-507babafcc729-a8e1c03a-d446cc56″,     ”operationType”: “insert”,     ”targetLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/images/image-1″,     ”status”: “PENDING”,     ”user”: “cloud-ace@yoshidumi.co.jp”,     ”progress”: 0,     ”insertTime”: “2014-11-13T02:11:06.211-08:00″,     ”startTime”: “2014-11-13T02:11:06.401-08:00″,     ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/operations/operation-1415873465993-507babafcc729-a8e1c03a-d446cc56” }

メソッド:compute.images.list

操作内容:イメージの一覧を取得します。 リクエスト
GET https://www.googleapis.com/compute/v1/projects/my-gce-project/global/images
レスポンス
{     ”kind”: “compute#imageList”,     ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/images”,     ”id”: “projects/my-gce-project/global/images”,     ”items”: [         {             ”kind”: “compute#image”,             ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/images/image-1″,             ”id”: “14530521579933976351”,             ”creationTimestamp”: “2014-11-13T02:11:06.556-08:00″,             ”name”: “image-1″,             ”description”: “from disk”,             ”sourceType”: “RAW”,             ”status”: “READY”,             ”archiveSizeBytes”: “1034”,             ”diskSizeGb”: “10”,             ”sourceDisk”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/disks/disk-1″,             ”sourceDiskId”: “16290216981908894876”         }     ] }
先ほど作成したイメージが一覧で確認できました。

Instances

メソッド:compute.instances.insert

操作内容: 10GBのPERSISTENTディスクを用意してグローバルなイメージ(debian-7-wheezy-v20141108)をインストールしてVMインスタンスを生成します。ネットワークインタフェースは、デフォルトで用意しているdefaulを使用します。 リクエスト
POST https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/instances {     ”machineType”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/machineTypes/f1-micro”,     ”name”: “instance-3″,     ”disks”: [         {             ”type”: “PERSISTENT”,             ”kind”: “compute#attachedDisk”,             ”boot”: true,             ”initializeParams”: {                 ”sourceImage”: “https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20141108″,                 ”diskName”: “disk-3″,                 ”diskSizeGb”: “10”,                 ”diskType”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/diskTypes/pd-standard”             }         }     ],     ”networkInterfaces”: [         {             ”network”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/networks/default”,             ”name”: “default”         }     ] }
レスポンス
{     ”kind”: “compute#operation”,     ”id”: “3379970727915955193”,     ”name”: “operation-1416031908336-507df9ee31180-7220f25b-27f05a98″,     ”zone”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a”,     ”operationType”: “insert”,     ”targetLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/instances/instance-3″,     ”status”: “PENDING”,     ”user”: “cloud-ace@yoshidumi.co.jp”,     ”progress”: 0,     ”insertTime”: “2014-11-14T22:11:48.711-08:00″,     ”startTime”: “2014-11-14T22:11:48.871-08:00″,     ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/zones/us-central1-a/operations/operation-1416031908336-507df9ee31180-7220f25b-27f05a98” }
gce_detail_instance GCEインスタンスのinstance-3が生成されていました。詳細を確認してみます。 gce_make_instance Developer ConsoleでVMインスタンスが生成されているのが確認できました。

Networks

メソッド:compute.networks.list

操作内容:プロジェクト内にあるネットワーク一覧を取得します。 リクエスト
GET https://www.googleapis.com/compute/v1/projects/my-gce-project/global/networks
レスポンス
{     ”kind”: “compute#networkList”,     ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/networks”,     ”id”: “projects/my-gce-project/global/networks”,     ”items”: [         {             ”kind”: “compute#network”,             ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/networks/default”,             ”id”: “18435088743764522279”,             ”creationTimestamp”: “2014-07-17T19:03:47.473-07:00″,             ”name”: “default”,             ”description”: “Default network for the project”,             ”IPv4Range”: “10.240.0.0/16″,             ”gatewayIPv4”: “10.240.0.1”         }     ] }

メソッド:compute.networks.insert

操作内容:ネットワークを追加します。 ネットワークIPアドレスとゲートウェイのIPアドレスを指定します。 下の例では、network-1という名前で10.244.0.0/16のネットワークを作成しています。 リクエスト
POST https://www.googleapis.com/compute/v1/projects/my-gce-project/global/networks {     ”IPv4Range”: “10.244.0.0/16″,     ”name”: “network-1″,     ”description”: “何かのネットワーク”,     ”gatewayIPv4″: “10.244.0.1” }
レスポンス
{     ”kind”: “compute#operation”,     ”id”: “10062504338782557209”,     ”name”: “operation-1416035633338-507e07cea1691-ab8648ca-76c585e7″,     ”operationType”: “insert”,     ”targetLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/networks/network-1″,     ”status”: “PENDING”,     ”user”: “cloud-ace@yoshidumi.co.jp”,     ”progress”: 0,     ”insertTime”: “2014-11-14T23:13:53.570-08:00″,     ”startTime”: “2014-11-14T23:13:53.783-08:00″,     ”selfLink”: “https://www.googleapis.com/compute/v1/projects/my-gce-project/global/operations/operation-1416035633338-507e07cea1691-ab8648ca-76c585e7” }
image06 Developer Consoleでnetwork-1が生成されているのが確認できました。 今回はAPIs Explorerを使ってみましたが、クライアントライブラリも公開されてますので、実際にプログラムから利用する場合はそちらを使って実装することになるでしょう。 GCEにおける自動化のご要望や、運用管理含めてご相談があれば、クラウドエースまで是非お問い合わせ下さい。

Google のクラウドサービスについてもっと詳しく知りたい、直接話が聞いてみたいという方のために、クラウドエースでは無料相談会を実施しております。お申し込みは下記ボタンより承っておりますので、この機会にぜひ弊社をご利用いただければと思います。

無料相談会のお申込みはこちら