小規模なサーバレスアプリ開発はこれでよくない?開発視点から見る IaC ツール Pulumi の魅力
この記事の目的
- 友人が IaC (Infrastructure as Code) ツールである Pulumi に関する本をリリースしたが、それがとても良かったので広めたい
- IaC なんぞほとんど触ったことない人間がこの本になぞって開発をやってみたところ、運用観点だけでなく、開発体験もとてもよく、結構感動したので共有したい
- 以前の私のように「IaC は運用のためで開発には関係ない」とか「どうせ大規模なインフラのところだけ使うやつ」という偏見をなくしたい(
いや、世の中にそんな偏見はない)
この記事で共有したいこと
- TypeScript だけでフロントエンド、バックエンドのアプリケーションコードだけでなく、インフラまでコードで書いて管理できる(なので型の恩恵も受ける)
-
IaCは費用対効果がでかい
「AWSコンソールでポチポチ数十分〜数時間 × 環境数 + 構築マニュアル作成・メンテ」 から 「Pulumi コードの記述(一度書けばほぼ使いまわせる) + 1 コマンド(約 5 分程度)」へ - 「一度書けばほぼ使いまわせる」の 「一度目」を友人が本にまとめてくれているので、我々がその一度目を書く苦労をしなくてもよくなった(AWS のサーバレス限定ではあるが)
- config は自由に作れるし、config の制御も TypeScript で書けるし、複数のインスタンスにまたがる変更をする config も余裕で作れる
- クラウドインフラも Docker と同じようにスクラップ&ビルドを容易にできるようになる
- 普通に個人/小規模開発でも超便利
はじめに
私の友人(ut)が先日 IaC Pulumi に関する本をリリースし、それに伴いテストランナーとしてこの本をなぞりながらアプリ開発をやってみたところ、運用どころか開発からすでにかなりの魅力を感じたので共有したい。
友人関係という立場抜きにしても良いと感じたし、実はまだ本としては完成形ではないものの、最終的に以下のような AWS のサーバレス構成の構築までは無料で読めるようになる。(この記事執筆時点では DB の接続までで、Cognito と File Storage については後々書かれる予定。)
本で取り扱う構成
本記事では運用や IaC などをほとんど知らない開発者目線でこの本の内容をやってみた感想を共有したい。Pulumi というツールの開発における有用性を特に取り上げ、できるだけコンパクトに紹介したい。
私が持っていた IaC に対する偏見
IaC と聞くと大体は Terraform や Kubernetes などを思い浮かべ、その事例を少しみているとかなり大規模な to C サービスでの使用例が出てきて、小規模な to B や個人開発をやっている身としては「これは私に必要なものではないな」と感じていた。個人/小規模な開発での事例が少なく、また開発時ではなく、すでに運用されている状況からの話が多い印象を持っていた。
そして、それらのツールは独自の記法や言語等を使うものが多く、それだけをやっているならばまだしも、アプリコードも書きながら触るとなると学習ハードルが高い。また、(プログラミング)言語ではなく YAML などの静的ファイルが多く、環境変数の取り扱いや、よりプログラム的な挙動をさせようとすることが難しいと感じた。 これに関しては私の偏見が多分に含まれていそうで、私は AWS SAM を使っていたところからの不満が大きく、このような印象を抱いているのは否めない。
とはいえ、AWS コンソールからポチポチやるには様々な設定情報等をどう残すかに課題が大きく、また手作業なのでミスりやすい。IaC を書く理由として、それを Code として残すことでどのような構成になっているかを記録でき、またそれを用いて他にも流用できる、というのがある。これには理解は示すし納得もある。しかし、正直にいうと、それはあくまで運用面で助かるのであって、今この瞬間の開発に面倒・手間が増えるだけじゃない?と素朴に感じてはいた。
また、IaC で書かれた内容は意外と使い回しが難しい。 例えば AWS S3 はグローバルにユニークな名前をつけないといけないなど、意外と固有設定を求められることが多い。これらも「結局使い回せないやんけ!」となる所以である。
総じて、IaC は DevOps において大切かもしれないが、Dev にとってのインセンティブが少ないのではないか、という感覚があった。
それを良い意味で打ち砕いてくれたのが Pulumi であった。
Pulumi のここが推し!
ここからは Pulumi 自体へ深く言及することは避けつつ(それこそぜひ本を見て貰えば良いので)開発視点でどこが良いと思ったかを簡単に触れておこうと思う。
以下、本の内容にもあるように AWS を想定するが、Pulumi 自体はさまざまなクラウドに対応しているので、他のクラウドでも同様なことが言えるはずである。
0. インフラ構築が爆速
これは Pulumi というよりも IaC 全般に言えることだが、コンソールからぽちぽち設定していたものを、コマンド一つで全て作成 / 削除できるというのは、今までやったことがない身からすると最高の体験である。
しかも、他の開発者と同じ環境を整えるのも容易で、以下のコマンド一つ、ものの5~10分程度放置しておくだけで整えられる。
AWS_PROFILE="your-profile" pulumi up
リソース間の依存関係があっても、それは IaC として書かれているので、もちろん依存関係を考慮した順番で構築してくれる。
またアプリケーションについてもビルドを走らせてからデプロイという事もできる。
また、削除も以下のコマンド一つですべてのインスタンスを削除することが可能である。
AWS_PROFILE="your-profile" pulumi destroy
なお、一部リソースについては削除できない/されない設定にもできるので、不注意があっても最悪な事態が起こらないよう対策はできるが、手軽であるゆえにそういった注意は必要である。
開発観点においては、
- 同じ環境をコマンド一つで複数用意できる
- 何かどうしようもないことが起こってもインフラ全体をスクラップ&ビルドすればよい(それが容易)
- それらのやり方は README.md で数行書けば十分である
- IaC なのでインフラ設定の記録としても完全に残る
- IaC なので同じ構成のインフラであれば、コードをそのままコピペしていくだけで解決する(テンプレートリポジトリとかにするとなお良い)
という点で開発から記述するメリットが大いにある。というか小さなアプリについてはインフラ構成が固定化されがちだと思うので、インフラコードを使い回して量産できそうである。
1. ウェブ UI やアカウント登録等の手続きはいらない
Pulumi にもウェブのインターフェースが用意されているが、こちらは無料枠があるもののチームでの採用は難しいかもしれない。GUI としての利用ではアカウントを作る必要がある。
しかし Pulumi CLI や SDK は別にそういうわけではなくオープンソースであり、CLI だけでも全然十分どころか開発環境だけで操作が完結するので個人的にはこっちの方が良いまである。
2. プログラミング言語で記述できる
Pulumi は TypeScript で記述可能なところが良い。ちなみに TypeScript 以外にも Python, Go, C# などアプリ開発でも使うような言語で記述できる。アプリ言語と統一すること自体には賛否が分かれそうだが、少なくとも同じ言語で書けるというのは学習してその技術を身につけるという点で言えば、心理的ハードルはそれだけでもかなり低くなる。
普通に慣れた言語でプログラミングができるので、そこそこ複雑なやりたいことも実現できる。
また、config の値も自由に定義ができ、その config の値によって複数のインスタンスに対する挙動を変える、といったようなものも作れる。
とはいえ、config として用意する変数があまりにも多いと、それはそれでもう一段階上の独自仕様の設定ファイル化して大変なことになるので、使いすぎは避けた方が良いかもしれない。
グローバルユニークな名前が必要な場合も、スタック名等を組み合わせてユニークな文字列を生成する関数等を用意すれば、その IaC の記述自体から固有なものをなくすことができる。
3. 知りたい情報を環境変数として出力できる
最終的にルートのファイルでその変数をexport
するかどうかで CLI の"Outputs"
として表示するかを設定でき、結果をデプロイ完了時の最後で表示される。
これはシンプルに便利で、ARN や ID だけでなく、テンプレートリテラル(のようなもの)を使って CloudFront の URL を作って返したりできる。
これは以下の形で.env
ファイルとして出力することもできる。
PULUMI_CONFIG_PASSPHRASE="<your-passphrase>" pulumi stack output --shell > .env
環境変数という意味では AWS Lambda に環境変数としてこの値を渡したりできるのでその点においても便利だ。
さいごに:ぜひ本を読んでみて!
何度も言うように、私ではなく友人の書いた本だが、開発視点でもとても使えるものだと思ったのでぜひ読んでみてほしい。
一応本の内容(無料公開分)だけで、サーバーレスな構成で簡単なウェブアプリを構築できる十分な土台は揃うはずである。
また、一度この内容を学べばこの本で扱っていない Pulumi のさまざまなリソースに対しても記述できるようになる思う。
Discussion