Supershipの名畑です。2024春アニメ開幕の季節がやってきましたが、うる星やつらの最終クールのPVですでに涙腺が。
はじめに
以下2つの過去記事ではLambdaを経由してBedrockのClaude 3を叩きました。
- LambdaでBedrockのClaude 3を呼び出してみた
- BedrockのナレッジベースでRAGを実装し、資料を元にした回答をClaude 3にLambda経由でしてもらった(ベクトルストアはAurora)
今回はAPI GatewayとLambdaを接続することにより、発行されたURLを経由して同様の結果を取得するようにしてみます。
LambdaをWeb API経由で呼び出すというだけなので、本記事単体として特に目新しい内容はありません。
今はLambda 関数 URLというものがあるのでこれを直接叩いてもいいのかもしれないですが、せっかくなのでよりさまざまな制御ができそうなAPI Gatewayを使ってみます。
Amazon API Gateway は、あらゆる規模の REST、HTTP、および WebSocket API を作成、公開、維持、モニタリング、およびセキュア化するための AWS のサービスです。API 開発者は、AWS または他のウェブサービス、AWS クラウドに保存されているデータにアクセスする API を作成できます。API Gateway API デベロッパーとして、独自のクライアントアプリケーションで使用するための API を作成できます。または、API をサードパーティーのアプリ開発者に対して使用可能にできます。
REST APIの作成する
コンソールでAPI Gatewayを開いて「APIを作成」をクリックし、次にREST APIの構築をクリックします。
遷移先の画面で「APIの詳細」としては新しいAPIを選択して、API名はlambda-sampleとしました。
「APIを作成」をクリックするとAPIが用意されます。
リソースの作成
次にAPI Gatewayのリソースのページで「リソースを作成」をクリックします。
リソース名はlambda-sample-resourceとしました。
「リソースを作成」をクリックします。
メソッドの作成
次に「メソッドを作成」をクリックします。
メソッドタイプはPOSTを選び、統合タイプはLambda関数を選びます。
次にLambda関数として過去記事で作成済みのLambdaを示すARNを選びます。
「メソッドを作成」をクリックします。
テスト
ここまでで一回テストをしてみようと思います。
テストはコンソール上で可能です。
リクエスト本文にLambdaへパスする内容をそのまま書き、テストをクリックします。
今回は下記の内容をLambdaに渡しました。
{
"message": "あなたの会社名を教えてください"
}
そうすると結果が表示されます。
"text": "私の会社の名前は株式会社あいうえおほげです。"
API自体は無事に動いていそうです。
デプロイ
リソースのページで「APIのデプロイ」をクリックします。
ステージとして新しいステージ を選んで、ステージ名はlambda-sample-stageとしました。
デプロイをクリックします。
これでAPIがデプロイされ、また、URLが発行されます。
https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}/
というフォーマットのものです。
今回の場合は東京リージョンで設定したため
https://{restapi_id}.execute-api.ap-northeast-1.amazonaws.com/lambda-sample-stage/
となります。
restapi_idにはAWSから発行されたIDが入ります。
外部から呼び出してみる
ターミナルからcurlコマンドを使って呼んでみます。
今回は作成済みのlambda-sample-resourceが呼び出し対象のため、URLの末尾につけています。 {restapi_id} の箇所は各自で置き換えてください。
$ curl https://{restapi_id}.execute-api.ap-northeast-1.amazonaws.com/lambda-sample-stage/lambda-sample-resource -d '{"message": "あなたの会社名を教えてください"}'
コンソールからの呼び出しと同様のレスポンスが確認できました。
APIキーを用いた制限
ここまでで外部から叩くAPIを作成するという目的は達成されましたが、せっかくなのでAPIキーを用いたアクセス制限も実装してみようと思います。
注意
API キーを、API へのアクセスを制御するための認証または承認に使用しないでください。使用量プランに複数の API がある場合、その使用量プランの 1 つの API に対して有効な API キーを持つユーザーは、その使用量プランのすべての API にアクセスできます。代わりに、API へのアクセスを制御するには、IAM ロール、Lambda オーソライザー、または Amazon Cognito ユーザープールを使用します。
API Gateway が生成する API キーを使用します。API キーには機密情報を含めないでください。クライアントは通常、ログに記録できるヘッダーで機密情報を送信します。
使用量プランの作成
まず、対象のAPIキーにどれだけの使用を許可するかの設定を行います。
「使用量プランを作成」をクリックして、遷移先の画面で入力していきます。
名前はlambda-sample-planとしました。
スロットリングとしてレート(クライアントがAPIを呼び出すことができる1秒あたりのリクエスト数)は1、バースト(APIに対して同時に実行できるリクエストの数)も1としてみました。
リクエスト(期間内でユーザーが実行できるリクエストの総数)は1日あたり100としました。
この辺りの数値は用途によって適宜変えてください。
最後に「使用量プランを作成」をクリックします。
APIキーの作成
次にAPIキーを作成します。
APIキーのページで「APIキーの作成」をクリックします。
今回はlambda-sample-keyという名前にしました。
保存を押すとAPIキーが作成されます。
このAPIキーをのちほど呼び出し時に使います。
APIキーを使用量プランに追加
使用量プランにAPIキーを追加します。
作成したAPIキーのページに行き「使用量プランに追加」をクリックします。
作成済みの使用量プランを選んで保存を押します。
使用量プランとステージを紐付け
使用量プランのページで「ステージを追加」をクリックし、紐づけるAPIとステージを選択します。
今回であればlambda-sampleとlambda-sample-stageとなります。
このページで「メソッドレベルのスロットリング」も設定可能です。今回は設定せずにおきます。
「使用量プランに追加」をクリックします。
POSTでAPIキーを必須とする
該当のAPIキーが付与されていない場合はAPIリクエストを受け付けないようにしてみます。
メソッドリクエストの設定はデフォルトでは「APIキーは必須です」がFalseになっているかと思います。
編集をクリックして「APIキーは必須です」にチェックを入れて保存をクリックします。
デプロイとテスト
APIはデプロイしないと変更が反映されないので、デプロイしましょう。
$ curl https://{restapi_id}.execute-api.ap-northeast-1.amazonaws.com/lambda-sample-stage/lambda-sample-resource -d '{"message": "あなたの会社名を教えてください"}'
{"message":"Forbidden"}
先ほどと同じようにcurlを呼んだ場合、Forbiddenとなりました。
では次に、先ほど発行したAPIキーをヘッダーに付与した上でcurlを呼んでみます。
$ curl https://{restapi_id}.execute-api.ap-northeast-1.amazonaws.com/lambda-sample-stage/lambda-sample-resource -d '{"message": "あなたの会社名を教えてください"}' -H 'X-API-KEY:{発行済みのAPIキーをここに書く}'
この場合は無事にレスポンスが返ってきました。
最後に
次はなにをしてみようか。
宣伝
SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。
Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。