LambdaなしでAPI GatewayからSageMakerを呼び出す
API Gatewayの統合リクエストをSageMaker推論エンドポイントに直接接続し、リクエストパスからLambda関数を完全に排除する。
API Gatewayの統合リクエスト機能を使うと、SageMakerの推論エンドポイントを直接呼び出すことができ、間に置くLambda関数が不要になります。

SageMaker推論エンドポイントを確認する
SageMakerコンソールを開き、Endpoint summary > URLに移動します。

エンドポイントの形式は次のとおりです。
https://runtime.sagemaker.<ENDPOINT_REGION>.amazonaws.com/endpoints/<ENDPOINT_NAME>/invocations
エンドポイントが正しく機能するためには、有効なAuthorizationヘッダーを含める必要があります。詳細は公式ドキュメントを参照してください。
エンドポイントは個々のアカウントに紐づいており、公開されていません。URLにはアカウントIDが含まれませんが、Amazon SageMakerは呼び出し元から渡された認証トークンからアカウントIDを判定します。
SageMaker推論エンドポイントと統合したREST APIを構築する
API GatewayコンソールでREST APIを選択します。

APIに名前を付けます。

Actions -> Create Methodを選択します。

HTTPメソッドの種類を選択します(この例ではPOSTを使用します)。

統合リクエストを設定します。
- Integration type: AWS Service
- AWS Service: SageMaker Runtime(SageMakerではない点に注意)
- HTTP method: POST
- Action Type: Use path override
- Path override:
endpoints/<ENDPOINT_NAME>/invocations - Execution role: API用のIAMロール(
sagemaker:InvokeEndpointアクションを含める必要があります) - Content Handling: Passthrough

モデルがバイナリ入力(画像など)を受け付ける場合は、Binary Media Typesに該当するMIMEタイプ(例: image/*)を追加してください。

この設定を行わない場合、次のようなエラーに遭遇する可能性があります。
{ "ErrorCode": "CLIENT_ERROR_FROM_MODEL", "LogStreamArn": "arn:aws:logs:ap-northeast-1:xxxxxxxxxxxx:log-group:/aws/sagemaker/Endpoints/<ENDPOINT_NAME>", "Message": "Received client error (400) from primary with message \"unable to evaluate payload provided\". See https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logEventViewer:group=/aws/sagemaker/Endpoints/<ENDPOINT_NAME> in account xxxxxxxxxxxx for more information.", "OriginalMessage": "unable to evaluate payload provided", "OriginalStatusCode": 400}API GatewayコンソールでDeploy APIを選択します。

デプロイ用のステージを割り当てます。

デプロイが完了すると、APIエンドポイントがテスト可能になります。

テスト
デプロイしたAPIはcurlでテストできます。
curl --location '<API_ENDPOINT>' \ --header 'Content-Type: image/jpeg' \ --header 'Accept: application/json' \ --data-binary '@/path/to/image.jpg'まとめ
API Gatewayの統合リクエストを設定してSageMaker推論エンドポイントを直接呼び出すようにし、パスオーバーライドと実行ロールを正しく設定したところ、間にLambda関数を挟むことなく画像推論リクエストが動作しました。API GatewayをSageMaker Runtimeサービスに直接接続することで、本来ならリクエストボディとヘッダーをそのまま転送するだけのLambda関数を排除でき、レイテンシのホップと保守すべきインフラをそれぞれ一つ減らせます。トレードオフとしては、通常であればLambdaはモデルに到達する前にリクエストを検証したり変形したりする自然な場所になりますが、それがないと、Binary Media TypesとContent Handlingの設定を正確に行うことだけが、上記の「unable to evaluate payload provided」エラーに対する唯一の防衛線になります。統合が壊れていると決めつける前に、モデルが期待する正確なコンテンツタイプでテストしておく価値があります。
Related posts
API Gateway WebSocket:モック統合の実装
バックエンドのLambdaを一切使わず、モック統合のみでAPI Gateway WebSocket APIを構築し、あらかじめ用意されたレスポンスを返します。
SageMakerの物体検出によるオブジェクトカウント
Ground Truthで画像にラベルを付け、SageMakerの物体検出モデルを学習させ、推論結果からオブジェクトをカウントする。
Amazon SageMaker 入門: 組み込みアルゴリズムを使う
SageMaker Studioと組み込みアルゴリズムを使って、Irisデータセットでk-NN分類器を学習・デプロイします。
Cognito User PoolsとOIDCでSlackサインインを実装する
Cognito user poolをOIDC経由でSlackと連携させ、"Sign in with Slack"をAmplifyでNext.jsアプリに組み込みます。
Lambda Web AdapterでFastAPIをAWS Lambdaにデプロイする
Lambda Web Adapterを使うと、FastAPIで書いたAPIバックエンドをコンテナのまま単一のLambda関数にデプロイできます。
