Yodeee's Tech Diary

日々の開発や勉強したことをつれづれなるままに

Pulumi AIは新たなインフラ開発体験をもたらすのか、検証してみた

こんにちは。

先日、IaCツールの一つであるPulumiが、新たなサービスとしてPulumi AIを発表しました。

現在、他のIaCツールの中で、Pulumi AIのようにAIを活用したサービスを早期に発表したものはないようです。これからのPulumiの重点となるであろう、AI生成能力に対するこの早い投入は注目すべきです。

今回は、Pulumi AIの特徴や使用してみた所感、その可能性について深掘りしていきます。

1. Pulumiとは?

PulumiはInfrastructure as Code(IaC)のツールで、開発者が用いる各種のプログラミング言語Python、TypeScript、Go、.NET、Javaなど)を使ってクラウドインフラストラクチャを定義、プロビジョニングし、管理を行うサービスを提供します。

また、PulumiはAWSだけでなく、60以上のクラウドSaaSをサポートしており、複数のサービスプロバイダーのインフラをまとめてコードでIaCで管理することができます。

2. Pulumi AIとは?

Pulumi AIはPulumiの新しい機能で、大規模言語モデルのGPTを活用した、自然言語での指示に基づいてPulumiのコードを自動生成することが可能なAIアシスタントです。

ユーザーはウェブサイト上で自然言語での要望を入力し、それに対応するPulumiのソースコードが生成されます。

3. Pulumi AIの特徴

Pulumi AIの最大の特徴は自然言語を理解し、それをもとにPulumiのソースコードを生成することができる点です。

これにより、技術的な詳細を気にすることなく、自分が実現したいことを自然言語で述べるだけでインフラストラクチャのコードを生成できます。

Pulumi AIではGPTのモデルとしてGPT v4を無料で使える点も大きな特徴です(2023/6/25現在)。現状ChatGPTだとGPT-4は有料版のみしか使うことができないので、無料で使えるのは嬉しいですね。

さらにPulumi AIはチャットのURL共有を行うことができます。これにより、過去のチャットを見返すことができたり、チーム内にURLを共有することもできます。

更に、CLIを利用してコマンドラインからもリソースを定義できるというのも、Pulumi AIの強みと言えるでしょう。

どれも気になる機能なので、実際に触って試してみました。

4. Pulumi AIを実際に試してみた(ブラウザ編)

まず下記のような簡単なサーバレス構成を作ってみます。

Pulumi AIは下記からアクセスできます。 www.pulumi.com

Pulumi AIのコンソールにアクセスし、下記のようなプロンプトを入力してみました。

ここで注意が必要なのは、まだPulumi AIでは日本語対応はしておらず英語で入力する必要があります。

作成したいリソース情報を入力して実行してみると、下記のように要求に対応するPulumiのプログラムが出力されました。

あとはこのソースコードをプロジェクトの実行ファイルに貼り付けて、デプロイコマンドを実行するだけです。 Typescriptの場合の具体的な手順は下記となります。

Pulumiのインストール

npmを使用している場合は下記のコマンドでpulumiをインストールします。

npm install pulumi

新しいTypeScriptプロジェクトの作成

下記のコマンドを実行し、Pulumiプロジェクトを作成します。

pulumi new typescript

コードをindex.tsに貼り付ける

作成したプロジェクトのルートディレクトリのindex.tsファイルにPulumi AIで生成したコードを貼り付けます。

Node.jsの依存関係をインストールする

下記のコマンドをプロジェクトのルートディレクトリ上で実行し、必要な依存関係をインストールします。

npm install

デプロイする

下記のコマンドをプロジェクトのルートディレクトリ上で実行し、リソースをデプロイします。

pulumi up

なお、今回生成されたコードをそのままプロジェクトのファイルに貼り付けてデプロイしてみるとエラーが発生してしまいました...

エラーが発生したときは、下記のようにエラー文をそのままPulumi AIのチャット文に貼り付けて実行すると、 修正版のコードを提示してくれます。

検証しての感想ですが、生成されたコードが一発で動くということはあまりなく、 代替エラーになってしまうような印象です...

また注意が必要なのが、GPTを使用している都合上、リソースライブラリの種類やクラスを生成する際に渡すプロパティ項目が生成の都度、異なります。

例えば、Pulumiはリソースライブラリとして、AWS ClassicCrossWalk for AWS(awsx)という2つのライブラリを提供しており、 CrossWalk for AWSライブラリはより抽象化されたクラスを提供しているため、より簡潔にコードを記述することができます。

今回のようなサーバレス構成の場合は、下記のドキュメントで紹介されているような書き方でより簡潔に記述することができます。

www.pulumi.com

そのため、生成されたコードが正しいライブラリを使っているのか、他の定義方法はないのか、という点に関してはドキュメントも確認したほうがよいでしょう。

5. Pulumi AIを実際に試してみた(CLI編)

次にPulumi AIをCLIで使用してみます。

手順は下記のような手順になります。

Pulumiのインストール

(省略)

Open APIAPI keyを取得、環境変数に設定

自身のOpen AIのアカウントにログインし、API Keyを取得します。 まだ未作成の場合は新規で作成する必要があります。 Open AI API Keyの環境変数は下記のように設定します。

export OPENAI_API_KEY='sk-XXXXXXXXXXXXXXXXXXXXX'

またここで注意が必要なのが、GPTのモデルについてで、現在GPT-4はWaiting Listに登録し承認されていないと使用できないのですが、 Pulumi AIのCLIではデフォルトでGPTのモデルがGPT-4に設定されています。 そのため、自身のアカウントでGPT-4が有効になっていない場合、実行すると404エラーになってしまいます。

その場合は下記のように明示的にGPT-3.5を使用することを宣言しておきましょう。

export OPENAI_MODEL='gpt-3.5-turbo'   

Pulumi loginコマンド実行

Pulumi loginコマンドを実行し、認証を行います。

pulumi login

Pulumi AIコマンドの実行

最後にpulumi-aiコマンドを実行することで、Pulumi AIを利用することができるようになります。

npx pulumi-ai

コマンド実行後、下記のように入力モードになります。

ここに追加したいリソース情報を入力しましょう。 今回はVPCを一つ追加してみます。 an aws vpcと入力して実行すると、myVpcという名称でリソースが作られたことがわかります。

デプロイされたリソースを確認してみましょう。 作成されたリソーススタックはPulumi Cloud上で確認することができます。 app.pulumi.com

Pulumi CloudのStacksタブを見ると、pulumi-aiという名前のスタックが作成されていることがわかります。

作成されたスタックにDevという名前の環境が作成されており、中を見てみますと、 my-vpcという名称でVPCリソースが作られていることがわかります。

CLIでPulumi AIを使用する場合は、作成したいリソースを入力することで、 生成されたコードを使用して直接デプロイが行われるようですね。 (いきなりリソースを作るのではなく、確認ステップを作って欲しいですが...)

デプロイしたリソースを定義するソースを確認したい場合は、下記の!programコマンドを実行します。

なお、作成されたスタックはあくまで一時的なもので、!quitコマンドを実行すると作成したスタックのリソースはすべて削除されます。

また一度、入力モードを終了し、再度npx pulumi-aiコマンドを実行し、リソースを作成すると、前のスタックは削除され、新しいリソースで上書きされます。

そのため、おそらくCLIで作成するリソースは検証用のためとして考え、 CLIでリソースの作成を試し、問題なければ、そのコードを自身のプロジェクトに貼り付けて反映させていくのが望ましいかと思われます。

6. Pulumi AIのソースを見てみよう

Pulumi AIのソースコードオープンソースとしてGithubで公開されています。

github.com

Pulumi AIの機能のプログラムはsrc/index.ts上で定義されており、実行ファイル自体約350行ほどと短いです。

今回はindex.tsにおける主要な箇所に絞って、ソースを見ていきたいと思います。 まず初めにGPTに送信するプロンプトのベースとなるbasePromptという変数が定義されています。

ここで変数への代入は無名関数を使用しており、引数として開発言語を受け取り、 その開発言語でプログラムを作成するような要求文を作成しています。

無名関数が返す要求文の日本語訳は下記のとおりです。

あなたはPulumiAI、Pulumi ${lang}で書かれたクラウドインフラストラクチャを構築・デプロイするAIエージェントです。 私の指示ごとに一つのPulumi ${lang}プログラムを定義し、そのPulumiプログラムの説明を生成してください。 私はそのプログラムをデプロイし、エラーがあった場合はお知らせします。 私の指示に基づいて現在のプログラムを修正してください。 要求されない限り、ゼロから始めるべきではありません。

次にtextPromptという変数についてですが、この変数はbasePrompt変数やユーザからの入力、以前のプログラム情報を含めたプロンプトを定義しています。このプロンプトが最終的にOpen AI APIに送信されます。

続いて、下のソースを見ていくと、Pulumi AIクラスが定義されています。

ここでOpen AI APIとやり取りをするためのメソッドが定義されています。

まずPulumi AI上でプロンプトを実行すると、下記のメソッドが実行されると考えられます。

このメソッドではユーザからのプロンプトinstructionsや言語language、現在のプログラムprogramを受け取り、 上記で説明したtextPrompt変数を作成し、次に紹介するコード生成メソッドに渡します。

次に下記のメソッドでは上で生成したプロンプトtextPromptを受け取り、OpenAI APIに送信し、GPTで文章を生成します。

具体的には、openaiApiライブラリのcreateChatCompletionメソッドを使用してOpen AI APIにリクエストを送ります。 このリクエストに対するレスポンスを整形して、Pulumi AI上に出力されています。

先に紹介したプロンプトを見て分かる通り、プロンプト自体はシンプルかつ成約事項等もそこまで多く定義されていない現状のため、 今後徐々にプロンプトが修正され、生成されるソースの正確性が向上する可能性は大いにあります。

7. 結論

Pulumi AIはIaCツールとしてのPulumiをさらに強化する非常に強力な機能です。自然言語を用いてインフラストラクチャをコード化する能力は、開発者が求めるインフラストラクチャの理想像を直感的に、そして効率的にコードに変換するできるような開発者体験をもたらす可能性があります。

しかし、私がPulumi AIを試した結果からも、現状、生成されたコードは大体エラーになってしまうことや、生成されたコードの再現性がない点などから、生成コードをプロダクションそのままに採用は難しい印象です。 ただし、たたき台を作るために使用する、やPulumiの学習に使用するという点では有用になると思いました。

IaCの自動化の未来はまだ開かれており、Pulumi AIのような先進的な機能がその未来を形作ることでしょう。 今後の発展に注目していきたいと思います。