Pulumi の紹介と Bicep や Terraform との比較をしてみた - Alternative Architecture DOJO

Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

Pulumi の紹介と Bicep や Terraform との比較をしてみた

みなさん、こんにちは。クラウドソリューション部の花岡です。

最近はプライベートや業務で英語を読んだり聞いたりする機会が増えてるので、英語の勉強時間を増やしてます。

はじめに

さて、Pulumi(プルーミー)という Infrastructure as Code (IaC)ツールをみなさんはご存知でしょうか。

本記事ではその Pulumi の紹介と Azure でよく使われる BicepTerraform との簡易的な比較をしてみました。

Pulumiとは

TerraformBicep のような DSLドメイン特化言語)を使用せず、C#PythonTypeScript などの既存のプログラミング言語を使って IaC ができるツールです。

手慣れたプログラミング言語でインフラの構成管理ができ、習得が容易で、既存のプログラミング言語の表現力が使えます。

そのため、モジュールの再利用やライブラリ、 SDK などを使用して他の IaC ツールでは出来ない、さまざまな処理を書くことができます。

また、Pulumi は、AWSAzureGCPKubernetes など、さまざまなクラウドプラットフォームをサポートしています。

異なるプラットフォーム間での移行や、マルチクラウド環境の構築にも利用できます。

Terraform や Bicep との比較

AzureIaC ツールは主に TerraformBicep が利用されてます。

その2つを比較して Pulumi がどういった特徴があるのかを簡単に紹介します。

Bicep と比較

BicepPulumi の違いはいくつかありますが、すべて挙げると長くなってしまいます。

そのため「状態管理」を対象に比較しますが、ほぼ BicepTerraform の違いと共通する部分があります。

Bicep

Bicepインフラの状態管理をしません。

詳細は省きますが*1、現在のリソースの状態と Bicep で生成した ARM Template が一致しているかは保証が出ないため、原理的に厳密なインフラの状態管理が難しいです。

Pulumi

PulumiStackと呼ばれる 開発本番 といった、独立して設定可能なインスタンス単位でインフラの状態管理ができます。

状態管理は state と呼ばれるメタデータで管理します。

メタデータは通常 Pulumi Service と呼ばれるホスティングサービスに保存されますが、クラウドプロバイダーが提供しているオブジェクトストレージサービスも利用できます。(Azure の場合は Blob Storage が相当)

これにより、実行前に現在のリソースの状態とコードの差分比較が可能な実行プランを見ることができます。実行プランによりリソースの影響範囲を変更適応前やPRのレビュー時に知ることができます

まとめると、Bicepリソース作成後に設定やリソースの追加がないプロジェクトや一時的に使用する環境(テスト環境、検証環境など)に向いていると言えます。

Pulumi継続的かつインクリメンタルにインフラ環境を整備していく場合に向いていると言えます。この点は Terraform も同じと言えるでしょう。

その他の詳しい比較はMicrosoft公式リンクのTerraform と Bicep の比較をご参照ください。

Terraform になってしまいますが、ほとんどの違いは Pulumi と共通するので、参考にはなると考えています。

Terraform との比較

Terraform とは機能面においては細かな差異はありますが、大体の機能は共通しています。

大きな違いはやはり、言語面でのサポートです。

TerraformHashicorp Configuration Language(HCL)と呼ばれる DSL を使用してコードを書きます。

PulumiPythonGoJavaScriptTypeScript.NETJava などをサポートしており、使い慣れた言語で IaC を実現できます

ちょっとイメージできない方がいるかも知れないので、簡単な例にはなりますが、C#で書くと以下のようなコードになります。

# Program.cs
using Pulumi;
using Pulumi.AzureNative.Resources;

# Azureのリソースグループ作成
await Deployment.RunAsync(() =>
{
    var resourceGroup = new ResourceGroup("rg-sample");
});

このように普段使っているような感覚でコードを書くことができます

既存のプログラミング言語が使用すると、条件、ループ、関数、クラスなどの使い慣れた言語ごとのイディオムが容易に適用できるため、学習コストが低いです。

また、ノウハウが貯まれば再利用可能なインフラのモジュール化やコンポーネント化が可能になり、再現性や保守容易性が向上できます。

また、PulumiNative provider というパッケージで主要なクラウドプロパイダーの新規のリソースや最新の機能をほぼ同日に使用できます。

Terraform では新機能がリリースされても数ヶ月待つ必要がありますが、すぐに利用できるというのは個人的にもとても魅力的で、これだけでもチームによっては採用理由になるかと感じています。

他にも細かな違いは詳細については Pulumi 公式がTerraformと比較したドキュメントを公開してますので、ご参照ください。

さいごに

多少主観が入りますが、ここまでの比較を表でまとめました。

Pulumi Terraform bicep
言語 .NET Python Go など HCL(DSL) DSL
学習コスト
状態管理 ×
AzureのAPIサポート

普段C#でコードを書いている私からすると Pulumi はとても親しみやすい IaC ツールだと感じています。

開発者からインフラ構築の比較的容易になり、インフラに対するイメージのハードルを下げるきっかけになるのではと思います。

また、本記事から Pulumi に興味を持ってもらえたなら幸いです。

次に書く記事はチュートリアルを通して Pulumi がどういったものか紹介したいと考えています。

ここまでご精読いただきありがとうございました。それではまた!

参考

*1:詳細を知りたい方はこちらの記事が参考になります。