[GoogleAPI千本ノック] Google Cloud Deployment Managerを試してみた

ご注意

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

GoogleのAPIを隔週で片っ端から紹介する、GoogleAPI千本ノックという特集を開始致します。 記念すべき第一回目は、Google Cloud Deployment Manager です。

どういうものなのか

Deployment Manager とは、簡単にいうとGoogle Compute Engine バージョンの Service as a Code です。Compute Engine の VMの管理やいろんなバージョンのアプリケーションをセットアップしたいときに Deployment Manager を使えばテンプレートと呼ばれる設定ファイルを書くだけで自動でセットアップしてくれて、開発者のシステム管理に割く時間を節約することができます。 設定ファイルを作成してやればOSインストールからコマンド単位まで自動でセットアップを行えるという点において、Chef,Puppet等のGCE版という感じでしょうか。

テンプレートとデプロイメント

Deployment Manager でまず知っておきたい2つのオブジェクトがあります。 テンプレート VMのオプション設定を定義しているもの。 デプロイメント テンプレートをデプロイして実行した後の実際のインスタンスにあたるもの。 テンプレートはグローバルリソースであり、どこからでも誰でも使えるようになりますが、リソースをデプロイしたときはそのリソースが動いているリージョンも指定しないとアクセスできません。
https://cloud.google.com/deployment-manager/overview

3つのテンプレートと2つの異なるリージョンにあるデプロイメント

テンプレートにはどのようにサービスを設定するのかが書かれています。Compute Engine VMのマシンタイプ、OSイメージ、その他重要な設定のプロパティを定義することができます。 *Deployment Manager のサンプルテンプレートはこちらで公開しています。 https://developers.google.com/deployment-manager/samples/?hl=ja テンプレートはJSONかYAML形式のファイルで表現されます。 テンプレートを繰り返し使いたい場合はYAMLファイルを使ったほうが良いです。 ただしYAML形式のテンプレートはAPIでは送れず、 CLIツール でしか送れません。 それに対してJSON形式のテンプレートはHttpのリクエストボディに埋め込んでAPIで送れます。 テンプレートを作成したあとにテンプレートをデプロイし、インスタンスを生成します。 テンプレートをデプロイした瞬間にデプロイメントが生成されます。 *テンプレートのオプションに関する詳細はこちら https://developers.google.com/deployment-manager/yaml?hl=ja

テンプレートの記述方法

nodejsをConpute Engineにセットアップするテンプレートを例にとってどのような記述をしているのか見てみましょう。 以下はサンプルとして公開されているnodejs.yamlの中身になります。
name: nodejs modules: nodejs: type: REPLICA_POOL replicaPoolModule: numReplicas: 1 replicaPoolParams: v1beta1: machineType: n1-standard-1 zone: us-central1-a baseInstanceName: nodejs disksToCreate: – boot: true initializeParams: sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20131120 diskSizeGb: 100 initAction: install networkInterfaces: – network: default accessConfigs: – name: External NAT type: ONE_TO_ONE_NAT envVariables: PORT: value: 8080 VERSION: value: 10.2 actions: install: commands: [ “wget -O nodejs.tar.gz http://nodejs.org/dist/v0.${VERSION}/node-v0.${VERSION}-linux-x64.tar.gz”, “tar -xzf nodejs.tar.gz”, “cp node-v0.${VERSION}-linux-x64/bin/* /usr/local/bin/”, “cp -r node-v0.${VERSION}-linux-x64/lib/* /usr/local/lib/”, “mkdir -p /usr/local/share/man/man1”, “cp -r node-v0.${VERSION}-linux-x64/share/man/man1/node.1 /usr/local/share/man/man1”, “%file:setup-node.sh”, “/etc/init.d/nodejs start”, ]
moduleがテンプレートのバックボーンに当たる部分でCompute Engine VMやネットワーク環境の設定内容が記述されています。 typeはリソースの種類を指定でき、1つのテンプレートにREPLICA_POOLやLOAD_BALANCINGなど複数のリソースを指定できます。 リソースは、LOAD_BALANCING・HEALTH_CHECK・FIREWALL・REPLICA_POOL・AUTOSCALINGがあり、Compute Engine のバーチャルマシンを利用する場合は、この例にあるようにREPLICA_POOLを指定します。 actionはデプロイしてCompute Engineのインスタンスが生成した後、どのような処理を進めていくかをshellコマンド単位で記されています。 shellコマンドでソフトウェアのインストールやアップデートや自分で作成したバッチを動かしたりできます。 *テンプレートの記述方法に関する詳細はこちら https://developers.google.com/deployment-manager/templates?hl=ja

制限と料金設定

サービス自体は無料ですが当然 Compute Engine の利用費用は発生します。 1つのプロジェクトに5つまでデプロイメントを積めますが、デプロイメントのリソースサイズはCompute Engine の容量が許す限りです。また、あまり意識しなくても良いかと思いますがリクエスト回数は、1日に50000リクエスト・1秒間に20リクエストまでという制限があります。

準備

早速動かしてみましょう。
    • プロジェクトのCompute Engine APIを有効にします。(もちろんCompute EngineもBillingOnにします)
    • 自分のプロジェクトの Google Developer Console から APIs&Auth を選択して Google Cloud Deployment Manager API を On にします。 (現在LimitedPreviewなのでサインアップしてください)
これで準備完了です。

使用方法

CLIまたはAPIで Deployment Manager のサービスにアクセスできます。 操作はテンプレートとデプロイメントに対して、削除(delete)、情報取得(get)、追加(insert)、一覧取得(list)を行います。 APIのメソッドに関する詳しい情報はこちらをご覧ください。

CLIで実際に動かしてみます

Google Cloud PlatformのCLIはこちらからダウンロード。 Deployment Managerを利用するには、現時点(2014年11月6日)ではLimitedPreview版が必要なので以下のコマンドでアップデートしてから利用します。 [java]gcloud components update preview[/java] すると、google-cloud-sdk/examples配下にdeployment_managerというディレクトリが生成されます。 中には、nginx_phpとnodejsがあり、それぞれのディレクトにはyamlファイルが入っています。 nodejs/nodejs-config.yamlは上のテンプレートの記述方法で解説したサンプルファイルです。 デプロイ先のプロジェクトIDを指定しておきます。 [java]gcloud config set project my-test-project[/java] では、テンプレートをインサートします。 インサートすると、Template nodejs_v1 inserted.と表示されます。 コマンド: [java]gcloud preview deployment-manager templates create –template-file ~/google-cloud-sdk/examples/deployment_manager/nodejs/nodejs-config.yaml nodejs_v1[/java]  
deployment_manager_template_insert

insert 実行結果

実際にテンプレートがインサートされたのかgetコマンドを使って指定したテンプレートが取得できるのか確認します。 インサートされていないと404が返されますが、先ほどインサートしたテンプレートが取得できました。 コマンド: [java]gcloud preview deployment-manager templates get nodejs_v1[/java]  
deployment_manager_template_get

get nodejs 実行結果

では、今度はこのテンプレートを指定して実際にインスタンスを生成してみます。 インスタンスの生成には1分近く時間がかかります。 10秒ずつポーリングしますが最後にDEPLOYEDになればデプロイ成功です。 DEPLOY_FAILUREになった場合は失敗です。 [java]gcloud preview deployment-manager deployments –region us-central1 create –template nodejs_v1 nodejs_deployment[/java]  
deployment_manager_insert_deployment

template から deployment が生成される

デプロイ成功を確認したので、立ち上がったVMインスタンスのIPアドレスとポート番号8080を入力してブラウザからアクセスしてみます。もし、node.jsのインストールが成功していればHello Worldと表示され、成功していなければFailed to start NodeJSと表示されます。 Hello Worldと表示されたのでインストールが成功しているのを確認できました。 *コマンドの使用方法はこちらに詳しく載っています。 https://developers.google.com/deployment-manager/commandline-tool?hl=ja
ブラウザで nodejs が動いているのを確認

ブラウザで nodejs が動いているのを確認

CLIでの全体的な使い方はこんな感じです。 nodejsだけではなく、moodleやWordpressなどを組むときは使い勝手が良さそうです。 次にAPIで動かしてみます APIを叩くためのクライアントプログラムを作成して実際に動かしてみましょう。 Deployment Manager API にはJavaのクライアントライブラリがありますのでこちらを拝借します。 https://developers.google.com/deployment-manager/v1beta2/api-lib/java?hl=ja *APIリファレンスはこちらを見てください。 https://developers.google.com/resources/api-libraries/documentation/manager/v1beta2/java/latest/ OAuth2 認証を通してAPIを叩きたいので、サービスアカウントを有効にします。 その方法は、Google Developers Console を開いて APIs & auth > Credencials のページにある Create new Client ID を押して新しいクライアントIDを発行します。自動でP12ファイルがダウンロードされますのでそれをクライアントプログラムのプロジェクトに入れ、クライアントプログラムから読み込むだけです。 同時に、上のCLIでの検証で使ったYAML形式のテンプレート(nodejsの実行環境)をJSONに変換し、用意します。 クライアントプログラムでは、OAuth2 認証を行った後にテンプレートファイルをアップロードし、アップロードしたテンプレートからインスタンスを生成するようになっています。 Deployment Manager API を叩くためのクライアントプログラム [java]// OAuth認証します JsonFactory defaultFactory = JacksonFactory.getDefaultInstance(); Credential credential = new GoogleCredential.Builder() .setTransport(transport) .setJsonFactory(defaultFactory) .setServiceAccountId(serviceAccountId) .setServiceAccountScopes(ManagerScopes.all()) .setServiceAccountPrivateKeyFromP12File(new File(securityFilePath)).build(); // テンプレートを用意します Manager manager = new Manager.Builder(transport, defaultFactory, null).setHttpRequestInitializer(credential) .setApplicationName(appName).build(); JsonFactory factory = JacksonFactory.getDefaultInstance(); File templateJsonFile = new File(templateFilePath); JsonParser parser = factory.createJsonParser(new FileInputStream( templateJsonFile)); Template template = new Template(); template.putAll(parser.parse(Map.class)); // (1)テンプレートをアップロードします Manager.Templates.Insert requestTemplateInsert = manager .templates().insert(projectId, template); Template insertedTemplate = requestTemplateInsert.execute(); // (2)アップロードされたテンプレートの件数を表示します Manager.Templates.List requestTemplateList = manager.templates() .list(projectId); TemplatesListResponse response = requestTemplateList.execute(); System.out.println(response.size()); // (3)テンプレートをデプロイしてデプロイメントを生成します Manager.Deployments.Insert requestDeploymentInsert = manager .deployments().insert(projectId, region, deployment); Deployment execute = requestDeploymentInsert.execute(); // (4)デプロイメントを削除します Delete delete = manager.deployments().delete(projectId, region, "nodejs4"); delete.execute(); [/java] では、プログラムを実行してみます。 (1)はManager.Templates.Insert(テンプレートの追加)を実行します。 実行しますとテンプレートファイルがアップロードされます。 (2)ではManager.Templates.List(アップロードしたテンプレートのリスト取得)を実行します。 プロジェクトにアップロードしたテンプレートファイルの件数が表示されました。 (3)ではManager.Deployments.Insert(テンプレート名を指定してデプロイ)を実行します。 デプロイ完了までにはインスタンスの生成など時間がかかりますので、 Manager.Deployments.List(デプロイしたデプロイメントのリスト取得)でデプロイ状況を確認してみます。 すぐに確認すると、DEPLOYING(デプロイ中)と返されますが、しばらく経ってから再取得するとDEPLOYED(デプロイ済)となります。 デプロイが失敗するとDEPLOYMENT_FAILEDとなります。また、テンプレートに書かれたシェルスクリプトの実行が失敗するだけでもDEPLOYMENT_FAILEDになります。 (4)デプロイメントを削除(Manager.Deployments.Delete)します。 実行しますと Deployment Manager で生成したデプロイメントを削除し、VMインスタンスなどを削除します。 VMインスタンスは Google Compute Engine の VM Instance の画面から直接削除することができますが、デプロイメントが残ってしまいますので直接いじらないようにしましょう。 APIでの一通りの使い方は以上です。 GCEをAPIで立ち上げるのも良いけど、お任せでサーバセットアップをするなら、クラウドエースにお任せください。

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

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