2014年9月3日水曜日

[GCP] Google Cloud PlatformのCloud Deployment Managerの事始め



最近GCPでGitlabやRailsの開発環境スタックがOne-ClickでGCP上にデプロイできるようになりました。

GCPではコレ以外にも、Apache Cassandra、MEAN Stack、Mongo DB、RabbitMQなどの環境をOne-Clickでデプロイできるようになっています。
これらの環境をデプロイする技術は、単純なVMイメージコピーではなくプロビジョニングしている様に見えます。
このOne-Click Deployを提供しているのがCloud Deployment Managerと呼ばれる、 GCP上のサービスです。

Cloud Deployment Manager is 何?

Cloud Deployment Manager(めんどくさいので以降CDM)はGCPに対して、
デプロイや、セットアップをテンプレートベースで定義することができるAPIとサービスです。
例えば上記に有るようなMEAN StackやRuby on Rails環境をテンプレートとして記述し、
いつでもGCP上にデプロイすることができるようになります。
なんとなくAWSでいうところのCloud Formationに似ている気がしますね
なお現状(2014/09/02)はLimited Previewなサービスのため、利用するにはサインアップが必要です。
この辺を参考にやってみてください。

CDMの2つのビルドプロセス(リソース)

CDMでは大きく分けて2つのビルドプロセスが有ります。
1つはGCEのセットアップ情報を記述したテンプレートの作成と登録 (template リソース)、
もう一つはテンプレートを元にした実際のデプロイ(deployment リソース)
templateはリージョンに関係ないグローバルリソースで、
deploymentはリージョン固定のリソースになります。
それぞれはCLIやAPIを利用して、操作することができます。

CDMでやれること

CDMでは現状以下のGCEリソースを定義することができます。
※細かい設定は置いておいて
  • Replica Pool
    • ほぼほぼ GCEインスタンスと同じ
    • 別途Actionというものを定義することによりinitスクリプトを定義できる
  • Autoscaling Group
    • オートスケールの仕方設定
    • これもLimited Preview
  • Firewall
    • 普通にfirewall
  • Health Check
    • LB用のヘルスチェック定義
  • Network
    • GCEのネットワークを設定できる
    • ただしAPIリファレンス上は乗っているが、ドキュメント上に無いので試してみないとなんとも...
  • Load Balancing
    • LBの設定
またActionという仕組みにより、
インスタンス起動時に流すコマンドをまとめたものを定義することもできる ※後述

自分で書いてみる Jenkinsのテンプレートを作ってみる

テンプレートを作る

まずは結構簡単に入れられるJenkinsのテンプレートを作ってみたいと思います。
構成は1台のGCEインスタンスにnginx-tomcat-jenkinsが乗っている感じです。
このテンプレートは以下になります。
name: nginx_tomcat_jenkins
modules:
  nginx_tomcat_jenkins:
    type: REPLICA_POOL
    replicaPoolModule:
      numReplicas: 1
      replicaPoolParams:
        v1beta1:
          machineType: n1-standard-1
          zone: asia-east1-a
          baseInstanceName: nginx_tomcat
          disksToCreate:
            - boot: true
              initializeParams:
                sourceImage: https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/centos-6-v20140718
                diskSizeGb: 10
          initAction: install_jenkins
          networkInterfaces:
            - network: default
              accessConfigs:
                - name: External NAT
                  type: ONE_TO_ONE_NAT
      envVariables:
        JENKINS_HOME:
          value: /data/jenkins
actions:
  install_jenkins:
    commands: [
      "yum -y -q update",
      "yum -y -q install wget tar",
      "export JENKINS_HOME=$JENKINS_HOME",
      "%file:java_install.sh",
      "%file:nginx_setup.sh",
      "%file:tomcat_setup.sh",
      "%file:jenkins_setup.sh",
      "%file:run.sh"
    ]
解説をすると
テンプレートではmodulesactionsの2つを設定していきます。
modulesではインスタンスや、LB、ネットワーク、オートスケールなどのリソースの設定を行います。
どのリソースかは、type要素で判別します。
actionsではインスタンス起動時のスクリプトを設定します。
%file:の形式で書いてあるものはテンプレートと同じディレクトリ内にあるファイルを埋め込んでくれる書式で、
YAMLでテンプレートを書いた場合のみ利用できます。
modulesの下のnginx_tomcat_jenkinsはmodule名で任意に名前を付けられます。
今回はGCEのインスタンスを作成するのでこのmoduleのtypeはREPLICA_POOLにしてあります。
replicaParamModule以下でインスタンスの設定を行っていきます。
initActionの部分でactions配下のactionを指定して、どういったイニシャルスクリプトを流すかを設定しています。
これらの値は基本的にテンプレート作成後、デプロイを行う時に上書きすることができます。
なお起動シェルも含めたコードは以下に有ります。
https://github.com/soundTricker/cdm-jenkins-template

テンプレートを登録する。

テンプレートの登録はCloud Deployment Manager API を利用するか、
Google Cloud SDK CLIを利用することで実行できます。
今回はCLIを使って登録を行っていきます。
まずDeployment ManagerはまだLimited Previewの為、通常のままではCLIにコマンド群が入っていません。
Cloud SDKのpreview featureをインストールします。
$ gcloud components update preview
取得後デフォルトのプロジェクトを設定しておきます。
$ gcloud config set project PROJECT-ID
設定が終わったらテンプレートを登録します。
今回は上記で作成したテンプレート(jenkins.yaml)をjenkinsというテンプレート名で登録します。
$ gcloud preview deployment-manager templates create --template-file jenkins.yaml jenkins
登録できたかは以下で確認できます。
$ gcloud preview deployment-manager templates list

$ gcloud preview deployment-manager templates get jenkins
なおlistの方は名前だけが取得されgetの場合%file:が展開された詳細なテンプレートが取得できます。

テンプレートを利用してデプロイする。

次にデプロイを行います。 デプロイもCLI経由で行います。
$ gcloud preview deployment-manager deployments --region asia-east1 create --template jenkins jenkins-dm
なお先ほど記述した上書きを行う場合は以下のように--overridesで指定します。
$ gcloud preview deployment-manager deployments --region asia-east1 create --template jenkins --overrides $.modules.nginx_tomcat_jenkins.replicaPoolModule.numReplicas=2 jenkins-dm
しばらく待つとインスタンスが上がり、actionsで指定したスクリプトが実行されます。

まとめ

やってみると結構お手軽ですね。
ただ今回のスクリプトの場合はGCEインスタンスが1台ですし、サーバセットアップの部分は正直だたのshellなので、
ansibleやchef等のプロビジョニングアプリケーションを利用したほうが楽に思えます。
というよりプロビジョニングするぐらいならimages作ってCloud Design Patternで言うところの
Stamp Patternを利用して複製したほうが楽な気がします。
Deployment Managerの使いドコロは個人的にはここではないように思えます。
※現状GoogleがリリースしているMEAN StackやRoRのOne-Click Deployには意味があると思いますが。
次はもう少し複数台を配置するような設定を書いてみたいと思います。

1 件のコメント: