インフラのコード化は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を使ってインストールすることができます。
linuxの場合
$ curl -fsSL https://get.pulumi.com | sh
プロジェクトの作成
$ mkdir pulumi-p $ pulumi new gcp-typescript
するとpulumiのログインを求められるのでログインする。下の画像はログインの成功画面
ログイン成功後、いくつか設定するための質問に答える必要があります。とりあえずデフォルトの設定にしておきます。
ファイルやフォルダがいくつかできました。設定はindex.tsに書き込んでいきます。
権限周りの設定
これでインフラをコード化する準備ができました。pulumiでインフラ環境を整えるのは、terraformよりシンプルだと感じました。pulumi upというコマンドを打つと、index.tsの内容を読み込んで、作成してくれます。ただしそのままplumi upしても権限関係のエラーが出てしまいます。なので、まずは権限関連の設定をしていきます。
ここのページからサービスアカウントキーを作成していきます。
console.cloud.google.com
認証情報を作成からサービスアカウントキーを選択します。
サービスアカウントキーの作成から、新しいサービスアカウントをクリックして、役割をオーナーにします。サービスアカウント名はわかりやすい名前にしてください。そして作成をクリックするとjsonファイルがダウンロードされます。このファイルは絶対に外部に漏らさずに大切にしてください。
そしてjsonファイルを今回のプロジェクトフォルダに移動。pathを環境変数に追加。jsonの名前は変更しても大丈夫です。自分はわかりやすいようにcredentisl.jsonにしました。
$ export GOOGLE_CREDENTIALS=$(cat credential.json)
Pulumi.dev.yamlにgcpのプロジェクト名を設定します。
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
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を確認してみると、インスタンスが立ち上がってるのがわかります。
インスタンの削除
$ pulumi destory
最後に
今回はpulumiを使ってGCPのインフラ環境をコード化してみました。今まではterraformを使っていて、HCL(HashiCorp Configuration Language)が若干きついなと思っていましたが、pulumiを使えばTypeScriptで書くことができます。実際にプロダクション環境で使うには、まだまだ調査不足かもしれませんが、今後導入することも考えていきたいです。