5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS Lambda上でStrands Agentsのuse_awsツールを使ったAWS専門AIエージェントを構築してみた

Last updated at Posted at 2025-07-24

はじめに

この記事では、GitHubで公開しているStrands Agentsのuse_awsツールを使ったAWSエージェントアプリケーションについて解説します。

📁 GitHubリポジトリ: strands-agents-use-aws

このリポジトリには、AWS Lambda上でAIエージェントを構築し、自身のAWS環境におけるAWSリソースに関する質問に自動で答えてくれるサーバーレスアプリケーションのソースコードが含まれています。記事ではデプロイ手順やポイントを解説していきます。

記事を読んで興味を持っていただけた方はGitHubのコードをCloneして自分の環境で動かしてみてください。

Strands Agentsとは

Strands Agentsは、わずか数行のコードでAIエージェントを構築・実行するモデル駆動型アプローチを採用したオープンソースSDKです。
AWSだとAmazon Q Developer、AWS Glue、VPC Reachability Analyzerなどのサービスで活用されているとのことです。
strands-agents

このリポジトリで構築できるもの

  • AWS Lambda上で動作するAWSリソースの情報を調査できるAIエージェントアプリ

例えば「S3バケット一覧を教えて」「EC2インスタンスの状況は?」といった質問に、実際のAWSリソースを調査して答えてくれます。

使用する技術スタック

  • AWS Lambda
  • Strands Agents
  • Amazon Bedrock
  • Claude Sonnet 4
  • SAM
  • Docker

プロジェクト構成

strands-agents-use-aws/
├── Dockerfile                 # Lambdaレイヤー作成用
├── template.yaml             # SAMテンプレート
├── lambda_function.py        # メインのLambda関数
├── requirements.txt          # Strands SDK依存関係
├── lambda-requirements.txt   # Lambda関数用依存関係
└── README.md                # デプロイ手順

主要コンポーネントの解説

1. Lambda関数本体 (lambda_function.py)

import json
import logging
import boto3
import os
from strands import Agent
from strands.models import BedrockModel
from strands_tools import use_aws, http_request, current_time

# AWS専門エージェントのシステムプロンプト
AWS_SYSTEM_PROMPT = """
あなたは経験豊富なAWSクラウドアーキテクトです。
以下のガイドラインに従ってAWSリソースに関する質問に答えてください:

1. use_awsツールを使用してAWSリソースの情報を取得し、正確な情報を提供する
2. セキュリティ、コスト効率、ベストプラクティスの観点からアドバイスする
3. 回答は分かりやすく、具体的で実用的な内容にする
4. 必要に応じて複数のAWSサービスを調査して包括的な回答を提供する
5. エラーが発生した場合は、可能な解決策も提案する
"""

def lambda_handler(event, context):
    # ユーザーの質問を取得
    user_prompt = event.get('prompt')
    
    # Bedrockモデルの初期化
    session = boto3.Session(region_name=os.environ["BEDROCK_REGION"])
    bedrock_model = BedrockModel(
        model_id=os.environ["MODEL_ID"],
        boto_session=session
    )
    
    # AWSリソース専門エージェントを作成
    aws_agent = Agent(
        tools=[use_aws, http_request, current_time],
        model=bedrock_model,
        system_prompt=AWS_SYSTEM_PROMPT    
    )
    
    # エージェントを実行
    response = aws_agent(user_prompt)
    
    return {
        'statusCode': 200,
        'body': json.dumps({
            'prompt': user_prompt,
            'response': str(response)
        }, ensure_ascii=False)
    }

Strands Agentuse_awsツールを組み込むことで、AWSリソースに直接アクセスできるようにしています。(たったこれだけでAgentが定義できるなんて驚きです。。。)
また、Bedrock経由でClaude Sonnet 4を使用し、システムプロンプトでエージェントの役割と振る舞いを明確に定義しています。
その他にもいくつかツールが提供されているので気になる方はチェックしてみてください。
Example Built-in Tools

2. SAMテンプレート (template.yaml)

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  StrandsAgentsUseAwsFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: strands-agents-use-aws
      CodeUri: .
      Handler: lambda_function.lambda_handler
      Runtime: python3.12
      MemorySize: 128
      Layers:
        - <LayerVersionArn> # 作成したLambdaレイヤーのARN
      Environment:
        Variables:
          BEDROCK_REGION: us-east-1
          MODEL_ID: us.anthropic.claude-sonnet-4-20250514-v1:0
      Role: !GetAtt StrandsAgentsUseAwsRole.Arn

  StrandsAgentsUseAwsRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonBedrockFullAccess
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
        - arn:aws:iam::aws:policy/ReadOnlyAccess

IAMロールでは、エージェントが必要とする権限を設定しています。(今回は最小権限になるようなポリシーの作成サボっちゃいました。)
環境変数でBedrockのモデルに関する定義をしています。ここは環境に合わせて適宜更新してください。

3. Lambdaレイヤー作成用Dockerfile

FROM public.ecr.aws/lambda/python:3.12
 
WORKDIR /work
 
# システム更新と必要なパッケージのインストール
RUN dnf update && dnf install -y zip

# Strands SDKをインストール
COPY requirements.txt .
RUN pip install -r requirements.txt -t /python/

# boto3など、Lambda環境に含まれているパッケージを削除
RUN rm -rf /python/boto3* \
           /python/botocore* \
           /python/s3transfer*
 
# レイヤー用ZIPファイルを作成
CMD zip -r strands-layer.zip /python/

なぜコンテナでレイヤーを作成するのか?

実際にAmazon Linux 2023のEC2インスタンスでレイヤーを作成したところ、Lambda実行時に「モジュールが存在しない」というエラーが発生しました。これはStrands SDKの複雑な依存関係が原因で、環境間でのバイナリ互換性の問題やPython拡張モジュールの違いによるものです。

そのため、確実に動作するレイヤーを作成するため、AWS公式のLambda実行環境と完全に同じコンテナイメージ(public.ecr.aws/lambda/python:3.12)を使用してレイヤーを作成しています。これにより、Lambda環境との100%の互換性が保証されます。

  1. Strands SDKをLambda互換環境でインストール
  2. Lambda環境に既に含まれているパッケージを除外
  3. レイヤー用のZIPファイルを生成

デプロイ手順

1. 前提条件

  • AWS CLI
  • AWS SAM CLI
  • Docker
  • S3バケット(レイヤーアップロード用)

今回私はCloudShell環境でデプロイを実施しました。AWS環境をお持ちの方はCloudShellにて手順に従ってデプロイしてみてください。

2. Lambdaレイヤーの作成

# 1. Dockerイメージをビルド
docker build -t strands-agent .

# 2. レイヤーのZIPファイルを作成
docker run -v "$(pwd)":/work strands-agent

# 3. S3にアップロード
aws s3 cp strands-layer.zip s3://<YOUR_S3_BUCKET>/strands-layer.zip

# 4. Lambdaレイヤーを公開
aws lambda publish-layer-version \
    --layer-name strands-layer \
    --description "Layer for Strands SDK" \
    --content S3Bucket=<YOUR_S3_BUCKET>,S3Key=strands-layer.zip \
    --compatible-runtimes python3.12

3. SAMテンプレートの更新

template.yaml ファイルを編集し、作成したLambdaレイヤーを関数にアタッチします。

  1. template.yaml を開き、StrandsAgentsUseAwsFunction リソースの PropertiesLayers セクションを追加します。

  2. Layers に、前のステップで取得した LayerVersionArn を追加します。

    Resources:
      StrandsAgentsUseAwsFunction:
        Type: AWS::Serverless::Function
        Properties:
          # ... 既存のプロパティ ...
          Layers:
            - <LayerVersionArn をここに貼り付け>
    

4. SAMアプリケーションのデプロイ

SAMを使用してアプリケーションをビルドし、デプロイします。

  1. Python 3.12のインストール(CloudShellの場合)
    CloudShellではPython 3.12がデフォルトでインストールされていないため、手動でインストールします。

    # Python 3.12をインストール
    sudo dnf install python3.12 python3.12-devel python3.12-pip -y
    
    # インストール確認
    python3.12 --version
    

  2. Lambda関数ビルド用のrequirements.txtを準備
    レイヤーとの重複を避けるため、requirements.txtを一時的にリネームします。

    # レイヤー用のrequirements.txtをバックアップ
    mv requirements.txt layer-requirements.txt
    
    # Lambda関数には最小限の依存関係のみ(boto3は Lambda環境に含まれているため不要)
    echo "# No additional dependencies needed - using layer" > requirements.txt
    

  3. SAMビルド
    インストールしたPython 3.12を指定してビルドします。

    # Python 3.12を使用してビルド
    PYTHON_PATH=$(which python3.12) sam build
    
    # ビルド後のサイズを確認
    du -sh .aws-sam/build/StrandsAgentsUseAwsFunction/
    

  4. SAMデプロイ
    対話形式でデプロイを進めます。スタック名などを指定してください。

    sam deploy --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM --guided
    

  5. デプロイ後の後片付け
    デプロイ完了後、requirements.txtを元に戻します。

    # 元のrequirements.txtに戻す
    mv layer-requirements.txt requirements.txt
    

使用例

デプロイ後、Lambda関数をテストしてみましょう。以下のようなリクエストを送信してみてください。

{
  "prompt": "現在のS3バケット一覧を教えてください"
}

レスポンスに関しては環境情報になるので詳細な内容の記載は控えますが以下のようなレスポンスになります。
ちゃんと情報が取れていることが確認できました!
サンプル画像.jpg

まとめ

この記事では、Strands SDKを使ってAWS Lambda上でAI エージェントを構築する方法を解説しました。

これによりAI AgentによるAWSリソースの自動調査が可能となり、AWSリソース情報の参照、コスト分析、セキュリティ監査の自動化、インフラ問題のトラブルシューティングなど様々なシーンで有効であると考えられます。

是非試してみてください。

参考リンク

ソースコード

完全なソースコードはGitHubで公開しています。
https://github.com/your-username/strands-agents-use-aws

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?