こんにちは。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"
}
メソッド: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"
}
]
}
}
}
メソッド: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"
}
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でファイアウォールが生成されているのか確認します。
default-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"
}
再度、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インスタンスのinstance-3が生成されていました。詳細を確認してみます。
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"
}
Developer Consoleでnetwork-1が生成されているのが確認できました。
今回はAPIs Explorerを使ってみましたが、クライアントライブラリも公開されてますので、実際にプログラムから利用する場合はそちらを使って実装することになるでしょう。
GCEにおける自動化のご要望や、運用管理含めてご相談があれば、クラウドエースまで是非お問い合わせ下さい。