PulumiでGoogle Cloud FunctionsにTypeScriptの関数をデプロイする方法


Pulumiはインフラ構成をTypeScriptなどのプログラミング言語で定義でき、AWSやGoogle Cloud Platformへのデプロイを自動化できるツールです。この投稿では、Google Cloud FunctionsにTypeScript製の関数をデプロイする際に、Pulumiを使う方法を紹介します。

Pulumiはインフラとアプリを一体化できるのが特徴的

Terraformなどのインフラ構成管理ツールで、Google Cloud Functionsに関数をデプロイする場合、インフラ構成の定義と、Functionsなどのアプリケーションコードは別々のファイルになるのが普通です。

Pulumiは一風変わっていて、インフラ構成と関数をひとつのファイルに書くことができるのが特徴的です。インフラ構成をTypeScriptで定義して、Cloud FunctionsもTypeScriptで実装すると、インフラとアプリを一体化したシームレスなコードにできます。

PulumiでCloud Functionsをお手軽にデプロイする

PulumiでCloud Functionsをデプロイする最も手軽な方法は、インフラ構成定義に関数の実装も混ぜて書くパターンです。そのパターンでは、次のようなコードになります:

index.ts
import * as gcp from "@pulumi/gcp";

// Cloud Functions APIを有効化する
const cloudFunctionsService = new gcp.projects.Service(
  "cloudFunctionsService",
  {
    disableDependentServices: true,
    service: "cloudfunctions.googleapis.com",
  }
);

// デプロイする関数のアプリケーションコード
const helloWorld: gcp.cloudfunctions.HttpCallback = (req, res) => {
  res.send("Hello World!");
};

// デプロイする関数のインフラ構成定義
const helloWorldFunction = new gcp.cloudfunctions.HttpCallbackFunction(
  "helloWorldFunction",
  {
    runtime: "nodejs12",
    callback: helloWorld,
  },
  { dependsOn: cloudFunctionsService }
);

// デプロイ後に表示する情報
export const functionUrl = helloWorldFunction.httpsTriggerUrl;

抜粋して説明すると、次のhelloWorldという変数に代入した部分がアプリケーションコード、つまり関数の実装になります:

const helloWorld: gcp.cloudfunctions.HttpCallback = (req, res) => {
  res.send("Hello World!");
};

次に、helloWorldFunctionがインフラの構成定義になります。

const helloWorldFunction = new gcp.cloudfunctions.HttpCallbackFunction(
  "helloWorldFunction",
  {
    runtime: "nodejs12",
    callback: helloWorld,
  },
  {/*...*/}
);

ここで注目したいのが、上で定義したアプリケーションコードのhelloWorldをそのまま代入できているところです。これが、Pulumiの最大の特徴で、インフラとアプリを一体化できるところです。

この構成でpulumi upし、デプロイすると、関数のURLが発行されるので、すぐに関数を利用できます。

$ curl https://asia-northeast1-${PROJECT}.cloudfunctions.net/helloWorldFunction-af3d854
Hello World!

まとめ

Pulumiを使うと、TypeScriptでインフラ構成を定義しながら、Cloud Functionsの実装もそれに埋め込むかたちでデプロイすることができます。インフラとアプリを一体化できるので、よりシームレスな運用ができるようになるのが特徴です。Terraformと比べると、インフラ構成管理のために別の言語を覚える必要がありません。

加えて、TypeScriptエコシステムの恩恵を享受できるメリットもあります。IDEではコード補完が効き、デプロイ前には型による静的チェックができたりと、アプリ開発と似たような開発体験が得られます。

PulumiはTypeScriptプログラマがインフラを扱うシーンに相性のいいツールになると思います。


最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローしてもらえると嬉しいですTwitter@suin