Rainが生成AIによるCloudFormationテンプレート生成をサポートしました!

こんにちは、自称Rainアンバサダーの森井です。 RainがClaude 2を使用したCloudFormationテンプレート生成をサポートしましたのでご紹介します。

はじめに

先日、何気なくCloudFormationのDiscordを覗いていたらRainのリリースアナウンスを見つけました。 github.com

Amazon BedrockのClaude2を使用してCloudFormationテンプレートを作成できるとのこと。
普段からRainのリポジトリはチェックしているのですが、見逃していました。 CLIツールで簡単な要望だけ書けばテンプレートが生成されるので、手軽で良いですね。 もちろん、Rainを使わなくても生成AIにプロンプトを投げてテンプレート生成はできるので技術的な目新しさはありませんが、よく実行する操作をより簡単にしてくれるRainらしい新機能だと思いました。

ということで試してみました。

※ AWS アカウントのBedrockを使用するため、料金がかかります。詳しくは、「基盤モデルを使用した生成系 AI アプリケーションの構築 – Amazon Bedrock の料金表 – AWS」を確認してください。

Rainについてご存知でない方は、ぜひカックさんのブログをご参照ください。 kakakakakku.hatenablog.com

準備

まずはCaude 2を使う準備が必要です。
マネジメントコンソールでBedrockを開きましょう。左のペインからベースモデルを選択します。
Claude2の「モデルアクセスをリクエスト」を押します。

「モデルアクセスを管理」を押します。

「ユースケースの詳細を送信」を押し、必要事項を記入して送信します。

Claude、Claude Instantのチェックボックスを選択し、画面右下の「モデルアクセスをリクエスト」を押します。
(私はClaude、Claude Instantをまとめてリクエストしておきましたが、Claudeだけリクエストしても動作すると思います)

「アクセスが付与されました」と表示されたら準備完了です。

使ってみる

早速使ってみましょう。
AWS CLIの認証を通し、バージニア北米リージョンを指定してrainコマンドを実行します。

$ export AWS_DEFAULT_REGION=us-east-1
$ rain build -p "A VPC with 2 subnets"           
AWSTemplateFormatVersion: 2010-09-09
Description: A simple VPC with 2 subnets

Resources:

  MyVPC: 
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      Tags:
        - Key: Name 
          Value: MyVPC
          
  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      Tags:
        - Key: Name
          Value: Public Subnet (AZ1)
          
  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [ 1, !GetAZs '' ]
      Tags: 
        - Key: Name
          Value: Public Subnet (AZ2)

良い感じです!

ちなみに、東京リージョンで実行した際はエラーになってしまいました。 Claude 2.1は東京リージョンでも使えるはずなのですが、執筆時点では対応していなかった様です。

余談

さてこの機能、どうやって実現されているのでしょう。
ソースコードを探ってみると、ユーザーの入力したプロンプトを事前定義されたプロンプトと結合して、Claude 2を呼んでいるようでした。結構シンプル。

prompt := fmt.Sprintf("Write an AWS CloudFormation YAML template that builds the following:\n\n%s\n\nDo not include any explanation.\n\nWrite only the content of the YAML file.\n\nOutput valid YAML within tags.", p)

github.com

そのため、日本語のプロンプトでも動きはしますが出力が不安定になるようです。 せっかくClaude 2はせっかく日本語に対応しているので、日本語のプロンプトが使えるようなパッチを送っても良いかもしれません。

過去にRainへのコントリビュートするまでの過程をブログにしていますので、こちらもご興味があれば見ていただければと思います。 engineers.fenrir-inc.com