Pulumiを使ってGCPのインフラ環境を構築する

インフラのコード化はDevOps界隈では常識で、インフラをコード化することによって、各環境で設定を使い回すことができるメリットがあります。現在一番有名なInfrastructure as Code(IaC)を実現するツールはterraformですが、個人的にpulumiも気になっていたので、使ってみました。今回はpulumiを使って、GCP(storageバケットgoogle compute engine)の環境をコード化していきます。

pulumiの公式サイト
www.pulumi.com

pulumiのドキュメント
www.pulumi.com

事前にGCPのアカウントを作成して、課金設定をオンにしておく必要があります。
cloud.google.com

インストール

まずは公式のドキュメントに沿ってpulumiをインストールしていきます。私の実行環境はmacですので、homebrewを使えば簡単にインストールすることができます。また、linuxの場合でもcurlを使ってインストールすることができます。

macの場合

homebrewでインストールすることができます。

$ brew install pulumi

linuxの場合

$ curl -fsSL https://get.pulumi.com | sh

バージョンの確認

$ pulumi version

とりあえずpulumi cliの概要を掴むためにhelpをしてみましょう。

$ pulumi help

f:id:kamimura-dev:20190907124543p:plain

簡単にpulumiのcliコマンドを確認。

  • pulumi new -- プロジェクトの作成
  • pulumi up -- コードのデプロイとリソースの変更
  • pulumi stack -- stackの作成
  • pulumi config -- 設定周りの確認
  • pulumi destroy -- リソースの削除

かなりざっくりしてますが、まずはここら辺を理解しておけば大丈夫そうです。

プロジェクトの作成

$ mkdir pulumi-p
$ pulumi new gcp-typescript

するとpulumiのログインを求められるのでログインする。下の画像はログインの成功画面
f:id:kamimura-dev:20190907123213p:plain

ログイン成功後、いくつか設定するための質問に答える必要があります。とりあえずデフォルトの設定にしておきます。

f:id:kamimura-dev:20190907123531p:plain

ファイルやフォルダがいくつかできました。設定はindex.tsに書き込んでいきます。
f:id:kamimura-dev:20190907123711p:plain

権限周りの設定

これでインフラをコード化する準備ができました。pulumiでインフラ環境を整えるのは、terraformよりシンプルだと感じました。pulumi upというコマンドを打つと、index.tsの内容を読み込んで、作成してくれます。ただしそのままplumi upしても権限関係のエラーが出てしまいます。なので、まずは権限関連の設定をしていきます。

ここのページからサービスアカウントキーを作成していきます。
console.cloud.google.com

認証情報を作成からサービスアカウントキーを選択します。
f:id:kamimura-dev:20190907135733p:plain

サービスアカウントキーの作成から、新しいサービスアカウントをクリックして、役割をオーナーにします。サービスアカウント名はわかりやすい名前にしてください。そして作成をクリックするとjsonファイルがダウンロードされます。このファイルは絶対に外部に漏らさずに大切にしてください。
f:id:kamimura-dev:20190907135859p:plain

そしてjsonファイルを今回のプロジェクトフォルダに移動。pathを環境変数に追加。jsonの名前は変更しても大丈夫です。自分はわかりやすいようにcredentisl.jsonにしました。

$ export GOOGLE_CREDENTIALS=$(cat credential.json)

Pulumi.dev.yamlgcpのプロジェクト名を設定します。
Pulumi.dev.yaml

config:
  gcp:project: ""

これで権限周りの設定は完了です。それでは実際に設定ファイルを書いてGCPのインフラを作っていきます。

バケットを作成する

デフォルトの設定ではGCPバケットを作成する設定になっています。なので、そのままの設定で作成してみましょう。

index.tsの中身。デフォルトです。

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

// Create a GCP resource (Storage Bucket)
const bucket = new gcp.storage.Bucket("my-bucket");

// Export the DNS name of the bucket
export const bucketName = bucket.url;

リソースのデプロイを行います。

$ pulumi up

先ほど作成したバケットを削除するのは簡単です。下記のコードを打ちます。

$ pulumi destroy

google cloudのストレージバケットを確認すると、削除されてるのがわかります。

GCEの環境をコード化する

ここからは設定ファイルをガリガリ書いていきます。

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

// ネットワークの作成 
const network = new gcp.compute.Network("network");
const computeFirewall = new gcp.compute.Firewall("firewall", {
    network: network.id,
    allows: [{
        protocol: "tcp",
        ports: [ "22", "80"],
    }],
});

//インスタンスの作成
const computeInstance = new gcp.compute.Instance("instance", {
    machineType: "f1-micro",
    zone: "us-central1-a",
    bootDisk: { initializeParams: { image: "debian-cloud/debian-9" } },
    networkInterfaces: [{
        network: network.id,
        accessConfigs: [{}], 
    }],
});

exports.instanceName = computeInstance.name;
exports.instanceIP = computeInstance.networkInterfaces.apply((ni: any) => ni[0].accessConfigs[0].natIp);

設定内容はこちらを参考にしました。
www.pulumi.com


先ほどと同じようにコンフィグファイルを元に立ち上げていきます。

$ pulumi up

そしてGCEを確認してみると、インスタンスが立ち上がってるのがわかります。

f:id:kamimura-dev:20190907143529p:plain

インスタンの削除

$ pulumi destory

最後に

今回はpulumiを使ってGCPのインフラ環境をコード化してみました。今まではterraformを使っていて、HCL(HashiCorp Configuration Language)が若干きついなと思っていましたが、pulumiを使えばTypeScriptで書くことができます。実際にプロダクション環境で使うには、まだまだ調査不足かもしれませんが、今後導入することも考えていきたいです。