watsonx Orchestrateから送信されるリクエストをAWSのCloudWatchで確認する方法

## watsonx Orchestrateのカスタム・スキル
watsonx OrchestrateはIBMのAIAgent構築のためのプラットフォームです。製品にあらかじめ用意されている1500以上のスキルを組み合わせて業務を効率化できますが、業務で使用しているアプリケーションの中にはwatsonx Orhcestrateが対応していないものも当然あります。
そのような場合にはOpenAPI定義を読み込むことで、カスタム・スキルを構築し、watsonx Orchestrateから呼び出すことが可能です。
## リクエストが正しく処理されない場合の対処方法
カスタム・スキルを開発している際に、「このAPI定義で正しいと思うんだけど、なんかエラーが返ってくるな、、、」というケースがあります。その際には以下のようなステップで確認することをお勧めします。
### １．POSTMANでの確認
まずは、API単体で正しく動作するかをPOSTMANなどのツールを用いて確認しましょう。認証のためのAPI-Keyなどが異なる、必要なパラメータを正しく設定しないといったケースでは、この時点で問題を特定することが可能です。

### ２．実際の送信リクエストの確認
API単体での動作が確認できたら、POSTMANが送信しているリクエストと同様のリクエストを送信しているかを確認します。残念ながら現時点ではwatsonx Orchestrateには、送信しているリクエストを表示、確認してくれるような機能は無いため、リクエストの内容をダンプしてくれるようなサービスがあると非常に便利です。watsonx OrcehstrateはHTTPS接続のみサポートし、かつ、自己署名の証明書を許可しないため、今回はAWSのAPIGatewayを用いて、リクエスト内容をCloudWatchにログするサービスを作成してみることにします。（その他にも、HTTPSをサポートするngrokなどのサービスを利用する方法もあります。）
## サービスの作成方法

Lambad＞関数＞関数の作成と進み関数を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/ad776271-8ff9-2bd8-b202-dad2c4230173.png)

初期コードに、ログの出力のためのコードを追加します。
```
export const handler = async (event) => {
  // TODO implement
  console.log(event); //ログの出力を追加
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};
```

API GatewayでAPI＞APIを作成＞RESTAPIと進み、RESTAPIを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/915ccfd4-0f07-20dc-1c65-c915e9751146.png)
任意のリソース、メソッドを作成し、先ほど作成した、関数を選択します。
後はデプロイして完了です。試しにブラウザからアクセスしてみて、以下の様に表示されれば成功です。（URLはデプロイしたステージに”URLを呼び出す”と表示されています。アクセスする際には、その後ろにリソースのパスを追加するのを忘れないでください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/ffc377c9-5fc3-32c0-4dc8-cd65046e7dcc.png)

### ログの設定方法
リクエストのログをCloudWatchに出力するには、IAMのロールを定義し、そのARNをAPIgatewayに設定する必要があります。
IAM > ロール > ロールを作成からAWSのサービスを選択し、サービスまたはユースケースからAPI Gatewayを指定し、ユースケースとしてAPI Gatewayを選択します。作成したIAMロールのARNをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/832f44f5-2455-da0e-319d-e736b5668207.png)

APIGateway > API >設定 > ログ記録の設定を編集より、先ほどコピーしたARNを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/c1f1593c-209f-0330-fa28-f710ea4cd336.png)
これでログの出力がされるようになりますが、実はこのままだと、リクエストのbodyしか出力されず、headerが出力されないので、headerを出力するために、追加の作業が必要です。

### マッピングテンプレートの指定
API Gateway > API > リソース > 統合リクエストを編集と進み、マッピングテンプレートの編集をします。コンテンツタイプにappication/jsonと入力し、テンプレートを生成からメソッドリクエストのパススルーを選択します。すると、添付画像のようなテンプレートのコードが自動的に設定されます。
headerの値は、input.params()に含まれるため、このコードの中で、セットされることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/438bb473-0c8b-b47c-8d4a-92e62f8cbac6.png)

### 動作確認
以上でサービスの開発は完了です。あとは、POSTMANと、watsonx Orchstrateのサービスのエンドポイントを、AWSのサービスに変更して呼び出すと、自動的にCloudWatchのログ・グループが作成され、ログを確認することが可能です。具体的には以下の様に出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/f01e2519-cf82-3cad-0044-04004b60b20c.png)

## まとめ
watsonx OrchestrateはOpenAPI定義を読み込むことで、様々なサービスを呼び出すことが可能ですが、API定義が異なっていたり、認証情報の設定ミス、あるいは、製品の挙動により意図しないヘッダーが付与されていたりするといった様々な理由から、正しくサービスを接続できないケースがあります。そのような場合には、単体のAPI呼び出しにより問題を切り分け、単体で正しく動作する場合には、実際のリクエストの中身を分析することで問題を明らかにすることができます。watsonx Orcehstrateを用いてカスタム・スキルを開発をする際には、このようなツールを用意しておくと非常に便利です。