こんにちは。
先日、IaCツールの一つであるPulumiが、新たなサービスとしてPulumi AIを発表しました。
🚀 Exciting news! Pulumi Insights - intelligence for cloud infrastructure – is here. We’ve tapped into the power of generative AI and GPT-4 to automate cloud infrastructure. Get intelligence, search, and insights over any cloud. 🧵
— Pulumi (@PulumiCorp) 2023年4月13日
👇https://t.co/WEcWtWo0Ql
現在、他の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 Classic
とCrossWalk for AWS(awsx)
という2つのライブラリを提供しており、
CrossWalk for AWS
ライブラリはより抽象化されたクラスを提供しているため、より簡潔にコードを記述することができます。
今回のようなサーバレス構成の場合は、下記のドキュメントで紹介されているような書き方でより簡潔に記述することができます。
そのため、生成されたコードが正しいライブラリを使っているのか、他の定義方法はないのか、という点に関してはドキュメントも確認したほうがよいでしょう。
5. Pulumi AIを実際に試してみた(CLI編)
次にPulumi AIをCLIで使用してみます。
手順は下記のような手順になります。
Pulumiのインストール
(省略)
Open APIのAPI 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で公開されています。
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のような先進的な機能がその未来を形作ることでしょう。 今後の発展に注目していきたいと思います。