Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Agents for Amazon Bedrock でEC2インスタンス作成エージェントを作ってみた

肌寒い日が続き、ついに我が家でも毛布を引っ張り出してきました、菅野です。

AWS re:Inventが開催され、AWSでは、150件以上の新サービスやアップデートの発表がありました。
Amazon Bedrockにも新機能が発表され、実際のシステムにも導入していきたいというかたも増えているのではないでしょうか?

今回のブログではGAになったAgents for Amazon Bedrockを実際に利用し EC2インスタンスを作成するエージェントを作ってみます。

aws.amazon.com

Agents for Amazon Bedrockとは

生成AIのアプリケーション作成を助けるシステムです。
ユーザーは、自然言語を用いてAIアプリで実施したいタスクを入力します。
Agents for Amazon Bedrockは上記のタスクを推論モデルを用いて細分化、複数ステップのタスクに自動で分割し、それぞれの実行結果をまとめ、
最終的なタスクの実行結果をユーザーに返すAIアプリケーションを生成します。

GA版となったAgentsでは、それぞれのステップの詳細にアクセスし、どのような推論の流れになっているのかを確認したりできるようになっています。
また、あらかじめ用意していたLambdaをタスクとして定義してAgentsで生成したアプリから呼び出せるようにしたり、KnowledgeBase(ユーザーが定義できる情報元)へアクセスすることも可能なようです。

実際に使ってみた

それでは、さっそくAgentsを使ってAIアプリを作成してみましょう。
今回はLambaを用いてEC2インスタンスを作成するAIエージェントを作成します。
以下のような構成になります。

Amazon Bedrockのサイドメニューから、Orchestration>Agentsをクリックします。

Agentsのページが開いたら、Create Agentをクリックします。

Agentの詳細入力

Agentの詳細入力画面が出てくるのでそれぞれ以下の情報を入力しNextをクリックします。

項目 必須 入力内容
Agent name 作成するエージェントの名前
Agent description 作成するエージェントの詳細説明
User input 初回の入力から情報が足りない場合、エージェントがユーザーから追加の入力を求めるか否かの設定
Agent resource role Agentが利用するAWSのIAM Roleを自動で生成するかあらかじめ作成したIAM Roleを用いるかを選択
KMS key selection Agentとのやり取りの暗号化に用いるKMS Keyをカスタマイズするか(チェックが空の場合デフォルトKeyが用いられる)
Idle session timeout ユーザーがAgentに入力をしない状態でどれだけセッションを維持するか
Tags 生成されるAWSリソースへのタグ

Agentのモデル情報入力

利用モデルの選択画面が出てくるので、利用するモデルと、Agentに実施してほしいタスクの説明を入力します。 利用するモデルは現在以下が選択可能です。

モデルの開発元 モデル名
Anthropic Claude V1
Anthropic Claude V2

上記以外にもAmazonが開発している、Amazon Titan Express、Anthropicが開発しているClaude V2.1も将来的に選択できるようになる模様です。

実施してほしいタスクの説明は日本語でも入力可能なようです。
今回はClaude V2を利用し、以下を入力してみました。

あなたはEC2インスタンスを作成するエージェントです。
ユーザーの入力をもとに、EC2インスタンスのインスタンスタイプ、AMIを選択し、EC2インスタンスを作成してください。

アクショングループの追加(Optional)

作成するエージェントが独自のビジネスロジックを利用する必要がある場合(例えば、自身が開発したAPIにアクセスする)にはLambdaを経由して 独自のアクションを定義することが可能です。
それぞれ以下の情報を入力します。

項目 必須 入力内容
Enter Action group name 作成するアクショングループの名前
Description - Optional 作成するアクショングループの詳細説明
Select Lambda function 利用するLambdaFunctionを選択
Select API Schema LambdaFunctionの入出力を定義したOpenAPI形式のymlファイルをS3に配置したものを参照するように設定

Select API Schemaに配置したOpenAPI形式のファイルから、利用するLambdaFunctionのIN,OUTをBedrockが読み取り、適切な入力情報の抽出、 アクション実行後の情報取得を行ってくれます。

今回は以下のようなLambda,openapi.yamlを作成し、設定しました。
Lambda

import boto3
import json

def lambda_handler(event, context):
    # Boto3 EC2クライアントの初期化
    ec2 = boto3.client('ec2')
    
    api_path = event["apiPath"]
    response_body = {"application/json": {"body": "api path not found"}}
    status_code = 404
    if api_path == '/create-ec2':
        # パラメータの取得
        param = event['requestBody']['content']['application/json']['properties']
        instance_type = next(item for item in param if item['name'] == 'instance_type')['value']
        ami_id = next(item for item in param if item['name'] == 'ami_id')['value']
        

        # EC2インスタンスの作成
        instances = ec2.run_instances(
            ImageId=ami_id,
            InstanceType=instance_type,
            MinCount=1,
            MaxCount=1
        )
        
        response_body = {"application/json": {"body": json.dumps('Instance Created: ' + str(instances))}}
        status_code = 200
    
    action_response = {
        "actionGroup": event["actionGroup"],
        "apiPath": event["apiPath"],
        "httpMethod": event["httpMethod"],
        "httpStatusCode": status_code,
        "responseBody": response_body,
    }

    api_response = {"messageVersion": "1.0", "response": action_response}
    return api_response

S3に配置するopenapi.ymlは以下のように作成しました。
openapi.yml

openapi: 3.0.0
info:
  title: Create EC2 API
  version: 1.0.0
  description: API for create EC2
paths:
  /create-ec2:
    post:
      summary: API for create EC2.
      description: Create EC2 that posted instance type, ami-id
      operationId: send
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                instance_type:
                  type: string
                  description: Instance Type
                ami_id:
                  type: string
                  description: AMI ID for Instance
              required:
              - instance_type
              - ami_id
      responses:
        '200':
          description: EC2 Creation Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  body:
                    type: string
                    description: Information of Created Instance.
                  

ナレッジベースの追加(Optional)

作成するエージェントが独自定義のナレッジベースを利用する必要がある場合にはこちらで定義を追加することができます。
ナレッジベースはOrchestration>Knowledge baseから作成することができます。

プレビューとエージェントの作成

すべての情報を入力が完了したら、入力内容のプレビュー画面が出てきます。 問題ない場合はCreate Aagentを押下するとエージェントが作成されます。

Lambdaへの実行権限付与

AgentからLambdaを呼び出すための権限設定をLambda側に行う必要があります。
対象のLambdaの設定タブ>アクセス権限>リソースベースのポリシーステートメント から、アクセス権限を追加をクリックします。

AWSのサービスをクリックし、必要事項を記入して保存をクリックします。

項目 必須 入力内容
サービス Otherを選択
ポリシーステートメントID ポリシーを一意にするIDを入力
プリンシパル bedrock.amazonaws.comと入力
ソースARN 作成したLambdaのARNを選択
アクション lambda:InvokeFunctionを選択

作成したエージェントを試してみる

エージェントが作成されると、エージェント画面へ自動で遷移します。
画面右側にテスト用のチャット欄が出てくるので早速試してみましょう。

入力

"ami-0c0d141edc4f470cc" のAMIをベースに、インスタンスタイプを”t2.micro"として、EC2インスタンスを作成してください。

出力

EC2 instance created successfully with the following details: AMI ID: ami-0c0d141edc4f470cc Instance Type: t2.micro

期待したEC2インスタンスが作成されました。

出力結果のShow Traceを押下すると、具体的にどのような推論がされているのかを閲覧することができます。

以下の部分でユーザーの入力内容からEC2作成Actionを実行することが適切であると推論されています。
また、ユーザーの入力文章からインスタンスタイプと、AMI IDを抽出し、入力として設定しています。

(前略)
  "rationale": {
    "text": "To answer this question, I will:\n\n1. Call the POST::CreateEC2::send function to create an EC2 instance with the provided AMI ID and instance type.\n\nI have double checked and made sure that I have been provided the POST::CreateEC2::send function.",
    "traceId": "a2ea9d5f-5322-408e-9485-ca9bc299640e-0"
  },
  "invocationInput": {
    "actionGroupInvocationInput": {
      "actionGroupName": "CreateEC2",
      "apiPath": "/create-ec2",
      "parameters": [],
      "requestBody": {
        "content": {
          "application/json": [
            {
              "name": "ami_id",
              "type": "string",
              "value": "ami-0c0d141edc4f470cc"
            },
            {
              "name": "instance_type",
              "type": "string",
              "value": "t2.micro"
            }
          ]
        }
      },
      "verb": "post"
    },
    "invocationType": "ACTION_GROUP",
    "traceId": "a2ea9d5f-5322-408e-9485-ca9bc299640e-0"
  },
(後略)

まとめ

生成AIアプリの作成を手助けしてくれる新サービス、Aagent for Amazon Bedrockを実際に試してみました。 生成AIアプリを作る際に必要なユーザー入力から特定のタスクの分析、分割等を自動でやってくれる為、生成AIアプリに不慣れな人でも作成が容易な点がよかったです。
また、Lambdaを定義しオリジナルのタスクを作成できる点は拡張性が高いように見えました。
今後も生成AIの可能性を模索していきます。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com