Amazon Web Services ブログ

Amazon Bedrock エージェントで SAP インスタンスを管理

はじめに

このブログでは、Amazon Bedrock AgentsをSAPインスタンスの管理支援に使用する方法を実演します。SAPControlが提供するWebサービスを呼び出すエージェントの機能を活用することで、ユーザーはSAP環境を効率的に管理できます。

SAPControlは、主にSAPプロセスの停止、開始、監視に使用されるSOAP Webサービスインターフェースです。しかし、これらの一般的な使用例を超えて、このサービスは管理シナリオで非常に価値のある幅広い機能を提供します。

このブログの前提条件:

  • ユーザーは、SAPControlの使用とSAPシステムの管理に精通した経験豊富なSAP管理者または技術アーキテクトである。
  • sapstartsrvプロセスが実行されている、正常で稼働中のAWSホスト型SAPインスタンスへのアクセス。
  • AWS CLIがSAPサーバーにインストールされ、設定されている。
  • SAPサーバーのEC2セキュリティグループが、ポート5<nn>13へのアクセスを許可している(<nn>はSAPインスタンスのインスタンス番号)。
  • EC2インスタンスロールがS3バケットへのアクセス権を持っている。
  • Amazon Bedrockサービスと大規模言語モデル(例:Claude Haiku)へのアクセス。
  • AWS Lambdaサービスに関する知識とアクセス。
  • 動作するPython開発環境。
  • Python開発スキル、仮想環境の使用、レイヤーなど。

プロセスフロー

AWS Lambda関数(以下「Lambda」と呼ぶ)を作成して、SAPサーバー上のSAPControl SOAP Webサービスインターフェースを呼び出すWebプロキシとして機能させます。Lambda関数は<sid>admユーザーとそのパスワードを使用して認証します。セキュリティを強化するため、パスワードは関数にハードコードするのではなく、AWS Systems Managerの暗号化されたパラメータストアから取得します。

このブログで提供されるサンプル関数では、以下のタスクが可能になります:

  • SAPパラメータの値を確認
  • 指定されたS3バケットにログファイルを送信
  • SAPインスタンスを停止
  • SAPインスタンスを開始
  • SAPインスタンスのプロセス状態を確認

その後、Lambda関数は選択した大規模言語モデル(以下「LLM」と呼ぶ)によって駆動されるAmazon Bedrock Agentと統合されます。これにより、SAP管理者は自然言語を使用してSAPシステムと対話し、操作できるようになります。

Figure 01 - Architecture overview of the solution

図01 – ソリューションのアーキテクチャ概要

概要レベルステップ

  1. Lambda関数が使用するライブラリを含むPythonのLambdaレイヤーを作成
  2. Webプロキシとして機能するLambda関数を作成
  3. Bedrock Agentを作成し、作成したLambda関数を割り当て
  4. Systems Managerで<sid>admパスワードとインスタンス番号を保存する新しいパラメータを作成

このブログで紹介するソリューションでは、SAPインスタンスの状態を変更できることにご注意ください。ビジネスクリティカルなSAPシステムでこれを試行する前に、本番環境以外のサンドボックス環境で練習することを強く推奨します。このブログで説明されている手順に従ってミッションクリティカルなSAPシステムに影響が生じた場合、当方では責任を負いかねます。

詳細ステップ

Lambdaレイヤーの作成
既存のPython開発環境で、requirements.txtファイルに基づいて必要なパッケージをインストールします。このブログでは、Python 3.11と互換性のあるパッケージを使用しました。正確なセットアップとバージョンによっては、requirements.txtファイルを変更する必要がある場合があることにご注意ください。パッケージがインストールされたら、/python/lib/python3.11/site-packagesのサブディレクトリと内容を含む、pythonディレクトリ全体をzipします。これがLambda関数のzipレイヤーファイルになります。レイヤーを作成するために、pyenvと仮想環境を使用して必要なパッケージをインストールすることを強く推奨します。
requirements.txtファイルを使用したパッケージのインストール方法や、Pythonレイヤーの操作方法について詳細が必要な場合は、このブログの最後にある付録をご確認ください。組織内のPython開発者に支援を求めることもできます。このブログはAmazon BedrockとSAP関連のステップに焦点を当てているため、Pythonの詳細ガイドは範囲外です。

レイヤーzipファイルが作成されたら、AWSアカウントにログインしてLambdaに移動し、レイヤーをロードします(図02参照)。

Figure 02 - Load Lambda Layer

図02 – Lambdaレイヤーのロード

zipレイヤーファイルには、zeepとboto3に必要なPythonライブラリが含まれています。この例では、レイヤーファイルは「sapcontrollayer311.zip」と呼ばれ、x86_64プロセッサアーキテクチャを使用しました。正確なセットアップでは異なる場合があるため、正確なセットアップに合わせて以下のスクリーンショットから若干逸脱する可能性があります(図03参照)。

Figure 03 - Lambda Layer Configuration

図03 – Lambdaレイヤー設定

レイヤーが正常に追加されました。次に、Lambda関数のIAMロールを更新して、必要な権限を追加する必要があります。

Bedrock Agentの作成

次に、Amazon Bedrockサービスに移動し、新しいエージェントを作成します。

「Claude 3 Haiku」モデル(または前のステップで有効にしたモデル)を使用します。LLMの使用はトークンと呼ばれるものに基づいて計算される料金が発生することにご注意ください。料金の詳細については、以下のAWS公式ページをご覧ください。

このブログの最後にある例のシナリオでは、Claude Haiku 3 LLMを使用した場合、合計で約$0.12のコストがかかります。実行する正確なリージョンと、入力および出力として使用する単語(トークン)の量によって、多少の変動がある可能性があります。

エージェントへの指示として以下のテキストを入力します。

「あなたは、プロファイルパラメータの確認、SAPシステムの停止と開始、SAPシステムログファイルのS3バケットへのロード、SAPシステムのプロセスリストと状態の確認など、様々なタスクでSAPシステム管理者を支援できる有用なエージェントです」

このプロンプトは非常に重要です。なぜなら、このテキストがAmazon Bedrockに特定のタスクでエージェントを使用すべきかどうかを指示するからです。

新しいアクショングループの追加

新しいアクショングループを追加するには、「追加」をクリックし、アクショングループを「ag-sapcontrolagent」と呼びます。

Figure 17 - Add a new Action group

図17 – 新しいアクショングループの追加

「アクショングループの呼び出し」セクションで、「既存のLambda関数を選択」ラジオボタンをクリックし、先ほど作成したLambda関数の名前を選択します。

Figure 18 - Associate the Lambda function to the Action group

図18 – Lambda関数をアクショングループに関連付け

アクショングループ関数の作成

「get-parameter-value」という最初の関数を作成します。
Lambdaコードの内容と一致する必要があるため、関数とパラメータの正確な名前を使用してください。

Figure 19 - Add function get-parameter-value

図19 – 関数get-parameter-valueの追加

詳細を手動で入力する代わりに、標準のテーブルビューから「JSONエディタ」ビューに切り替えた後(画面右上)、get-parameter-value JSONをコピー&ペーストするだけでも構いません。

次に、「アクショングループ関数を追加」ボタンをクリックして、さらに関数を追加します:

次のアクショングループ関数を「load-logfiles-to-s3」と名付けます:

Figure 20 - Add function load-logfiles-to-s3

図20 – 関数load-logfiles-to-s3の追加

再度、JSONエディタビューに切り替えた後、load-logfiles-to-s3 JSONをコピー&ペーストするだけでも構いません。
「stopinstance」という、インスタンスを停止する別の関数を作成しましょう。

Figure 21 - Add function stopinstance

図21 – 関数stopinstanceの追加

または、stopinstance JSONをコピー&ペーストしてください。

次に、「startinstance」という開始関数を作成します。

Figure 22 - Add function startinstance

図22 – 関数startinstanceの追加

より簡単であれば、startinstance JSONをここからコピー&ペーストできます。

最後に、「get-process-status」関数を追加して、インスタンスの状態を確認できるようにします。

Figure 23 - Add function get-process-status

図23 – 関数get-process-statusの追加

get-process-status関数のJSON形式も利用可能です。

次に「作成」をクリックします。「エージェントへの指示」フィールドが消去された場合は、再度入力してください(時々発生します)。その後、「保存して終了」をクリックします。

「準備」ボタンをクリックして、エージェントのテストバージョンを準備します。

Figure 24 - Prepare the Agent

図24 – エージェントの準備

この同じ画面で、エージェントARNをメモしてください。すぐに必要になります。

Lambda権限の修正

Lambda関数に戻ります。「設定」タブの「権限」ペインで、以下の「リソースベースポリシーステートメント」を追加します(「権限を追加」ボタンをクリック)。

Figure 25 - Modifying the Lambda permissions

図25 – Lambda権限の修正

Amazon Bedrock AgentがLambda関数を呼び出せるように追加します。

Figure 26 - Add Amazon Bedrock Agent to be able to invoke Lambda function

図26 – Amazon Bedrock AgentがLambda関数を呼び出せるように追加

「AWSサービス」を選択
サービス:「その他」
ステートメントID:自由テキスト(例:「sapcontrolbedrockagent」)
プリンシパル:「bedrock.amazonaws.com」
ソースARN:Amazon Bedrock AgentのARNを確認できます(上記の数画面を参照)
アクション:「lambda:InvokeFunction」

このポリシーにより、Amazon Bedrock AgentがLambda関数を呼び出すことができます。

Systems Manager Parameter Storeの維持

最後に維持すべきは、コードが<sid>admパスワードとインスタンス番号を検索するための情報です。パスワードをコードにハードコードするのは良い慣行ではありません。このため、AWS Systems Manager → Parameter Store内に以下の2つのエントリを作成します。

Figure 27 - Parameter Store in AWS Systems Manager

図27 – AWS Systems ManagerのParameter Store

<sid>admのパスワードを保存するSecureStringパラメータを追加します。以下の例では、SAP SIDがMLDのため「mldadm」エントリになります。

Figure 28 - Add SecureString Parameter

図28 – SecureStringパラメータの追加

<sid>noパターンを使用してインスタンス番号パラメータも追加します。MLDシステムの場合、エントリは「mldno」になります – これは透過的なStringタイプにできます。

Figure 29 - SAP system number parameter entry

図29 – SAPシステム番号パラメータエントリ

必要な人とサービスのみがParameter Storeにアクセスできるようにしてください。

エージェントのテスト

ついにエージェントとの会話をテストする時が来ました。Bedrock Agentサービスに戻り、新しく作成したエージェントを選択し、プロンプト領域を使用して以下のテストを実行します(図30は黄色でプロンプト領域を示しています)。

Figure 30 - Interact with the Agent

図30 – エージェントとの対話

エージェントにパラメータ値を尋ねる

エージェントに以下を尋ねます:
「ホスト192.168.0.12上のMLD SAPシステムのSAPDBHOSTパラメータ値は何ですか?」

Bedrock Agentからの回答:
「ホスト192.168.0.12上のMLD SAPシステムのSAPDBHOSTパラメータ値は’sapvhana’です。」

Figure 31 - Example of Conversation with the Agent

図31 – エージェントとの会話例

同じプロンプトでより多くのパラメータ値を尋ねる

質問:
「ホスト192.168.0.12上のMLD SAPシステムのrdisp/wp_no_diaとSAPLOCALHOSTのパラメータ値は何ですか?」

回答:
「ホスト192.168.0.12上のMLD SAPシステムのパラメータ値は:– rdisp/wp_no_dia = 10 – SAPLOCALHOST = sapmldpas」

エージェントが2つの別々のパラメータの値を尋ねていることを理解し、関数を2回呼び出すことに注目してください。

SAPインスタンスの状態を確認する

以下を尋ねます:
「ホスト192.168.0.12上のSAPシステムMLDの状態は何ですか?」

SAPインスタンスの状態を確認する

以下を尋ねます:
「ホスト192.168.0.12上のSAPシステムMLDの状態は何ですか?」

回答は以下のようになるはずです:
「ホスト192.168.0.12上のSAPシステムMLDの状態は、ディスパッチャー、IGSウォッチドッグ、ゲートウェイ、ICMなどのすべての主要プロセスが実行されており、正常な状態です。」

Figure 32 - Another example screen of conversation with the Agent

図32 – エージェントとの会話のもう一つの例

インスタンスを停止する

次の例は実際にSAPインスタンスをシャットダウンすることにご注意ください。ビジネスへの影響なしに安全にシャットダウンできるシステムでのみ、この手順に従ってください!

入力:
「ホスト192.168.0.12上のSAPシステムMLDを停止してください」

出力:
「ホスト192.168.0.12上のSAPシステムMLDが正常に停止されました。」

状態を再度確認する

図33の以下のプロンプトを参照して、状態を再度確認してください。

Figure 33 - Stopped system status detected by the Agent

図33 – エージェントによって検出された停止システムの状態

システムを再度開始する

エージェントにホスト情報を提供する必要がもうないことにご注意ください。エージェントは以前の会話からホストの詳細(192.168.0.12)を記憶しています(図34参照)。

入力プロンプト:

「SAPシステムMLDを開始してください」

Figure 34 - Start SAP system by the Agent

図34 – エージェントによるSAPシステムの開始

状態を確認する

SAPインスタンスの開始を可能にするために数分待った後、エージェントに状態について尋ねます。以下の図35を参照してください。

Figure 35 - Status check of SAP instance

図35 – SAPインスタンスの状態確認

Amazon Bedrock Knowledge Baseの使用

この次の例では、Amazon Bedrock Knowledge Baseを使用してログファイルを保存し、ログ内のエラーを検索します。一時的な空のS3バケットを作成しましょう。この例では、バケット名「bedrockdemosaplogs」を使用しますが、まだ使用されていない限り任意のバケット名を作成できます(または、この目的のために既存のバケットがある場合は、それを単純に使用してください)。エージェントにログファイルをこのバケットにアップロードさせ、それをAmazon Bedrock Knowledge Base(以下「KB」と呼ぶ)として使用します。EC2インスタンスロールがS3バケットにアクセスするために必要な権限を持っていることを確認してください。

KBの力をより良く実演し、実際の状況をシミュレートするために、ログファイルにいくつかのエラーが発生するように、意図的にエラーを発生させます。

この例では、アプリケーションサーバーをシャットダウンせずに、その背後にあるクラスターを停止することで、メッセージサーバーをシャットダウンします。

Figure 36 - Causing a test case of error

図36 – エラーのテストケースを発生させる

次に、エージェントにログファイルをバケットにロードするよう指示します(s3://<bucketname>/形式を使用してください)。以下の図37を参照してください。

Figure 37- Tell the Agent to load the logfiles to the bucket

図37 – エージェントにログファイルをバケットにロードするよう指示

ログファイルが実際にバケットに表示されています。以下の図38を参照してください。

Figure 38 - Logfiles are shown in the bucket

図38 – ログファイルがバケットに表示される

次に、Amazon Bedrock → Knowledge bases → Create knowledge baseに移動します。

Figure 39 - Create the Knowledge Base

図39 – Knowledge Baseの作成

名前を付けて、データのソースとしてS3を選択します。

Figure 40 - Add S3 as the data source

図40 – データソースとしてS3を追加

S3バケットURI情報を提供します。

Figure 41 - Provide the S3 URI

図41 – S3 URIの提供

ベクターストア用に「Titan Text Embeddings v2」モデルを選択します。

Figure 42 - Choose the vector store

図42 – ベクターストアの選択

最後のサマリー画面で「ナレッジベースを作成」ボタンをクリックします。KBが作成されます。

KBが作成されたら、同期ジョブを実行します。

Figure 43 - Knowledge Base Sync

図43 – Knowledge Base同期

同期プロセスを監視します。

Figure 44 - Sync process may take long time

図44 – 同期プロセスは長時間かかる場合があります

同期プロセスは、ログの量によって長時間かかる場合があります。

次に、エージェントに戻り、設定を編集します。作成して同期したKBを追加します。

Figure 45 - Add KB to the Agent

図45 – エージェントにKBを追加

エージェントに追加するKnowledge Baseを選択します。

エージェントへの指示は以下のようにしてください:

「ログファイル内のエラーを検索してください。.oldファイルは無視してください。同じ種類の最新のエラーメッセージを見つけるようにしてください。」(以下の図46を参照)

Figure 46 - Select the KB

図46 – KBの選択

エージェントを保存し、再度準備します(準備を忘れないでください。そうしないとナレッジベースの追加が反映されません)。

Knowledge Baseを使用したエージェントのテスト

エージェントにログからエラーを検出するかどうか尋ねます。図47の以下にプロンプト例があります。

Figure 47 - Agent analyzes the logs in Knowledge Base

図47 – エージェントがKnowledge Base内のログを分析

エージェントは、ログファイルで見つかったエラーメッセージを報告するはずです。

自分で試してみる

  • Bedrockエージェントのトレースを分析し、会話をアクションにどのように分解するかを理解してみてください。
  • 上記のサンプルコードにまだ含まれていないSAPcontrolの機能を取り上げて、実装してみてください(Lambdaにコードを追加し、アクショングループを作成するなど)。多くのコーディングスキルは必要ありません。関連するセクションをコピー&ペーストして、新しい機能に合わせて修正してください。追加のタスクでエージェントの説明を更新することを忘れないでください。
  • Systems Manager Parameter Storeに情報を保持する代わりに、ランドスケープ情報全体をCSVファイルとしてS3バケットにロードし、ナレッジベースとしてエージェントに追加することを試してください。
  • パラメータチェックとSAP EarlyWatch Alertレポート(ナレッジベースとして追加)のクロスチェックを組み合わせて、特定のパラメータ値が推奨値から逸脱しているかどうかを判断します。
  • Systems Manager Parameter Storeに情報を保持する代わりに、ランドスケープ情報全体をCSVファイルとしてS3バケットにロードし、ナレッジベースとしてエージェントに追加することを試してください
  • パラメータチェックとSAP EarlyWatch Alertレポート(ナレッジベースとして追加)のクロスチェックを組み合わせて、特定のパラメータ値が推奨値から逸脱しているかどうかを判断します。

コスト

  • 既存のSAPシステムは、EC2、ストレージなどのコストが発生します – これは正確なSAPシステムによって変動します。
  • LLM料金はトークン(入力プロンプトと出力テキストの両方を含む)に基づいています。したがって、これも変動します。最新の料金についてはAWS公式ページをご確認ください。

まとめ

このブログ投稿では、Amazon Bedrock Agentsを活用してSAPインスタンスの開始と停止、ヘルス状態とパラメータ値の確認などの基本的なSAP運用タスクの実行を支援する使用例を実演しました。また、Knowledge Baseを利用して、膨大な量のログファイル内で関連するログエントリを見つける支援も行いました。

これらの例は、同様のアプローチを使用して実装できる潜在的な使用例のサンプルに過ぎません。同じ類推で探索・実装できる追加の使用例が数多くあります。

詳細を学ぶ

Amazon Bedrockサービスについて詳しく読むには、このページをご覧ください。

PythonでLambda関数を構築する方法について詳しく学ぶには、このサイトをご確認ください。

このAWSドキュメントでは、Pythonでレイヤーを操作する方法についてより多くのガイダンスを見つけることができます。こちらこちらにも有用なヒントがあります。

本ブログはパートナー SA 松本が翻訳しました。原文はこちらです。