Help us understand the problem. What is going on with this article?

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に書かない技術ネタなどもツイートしているので、よかったらフォローしてもらえると嬉しいです:relieved:Twitter@suin

suin
Qiita 4位/TypeScript入門書執筆中/TypeScripterのための座談会「YYTypeScript」主催/『実践ドメイン駆動設計』書籍邦訳レビュア/分報Slack考案/YYPHP主催/CodeIQマガジン執筆/株式会社クラフトマンソフトウェア創設/Web自動テスト「ShouldBee」の開発/TypeScript/DDD/OOP
https://yyts.connpass.com/
craftsman_software
インフラ運用を自動化し、手作業を限りなくゼロにする会社
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした