[STATUS: ONLINE] 当サイトは要約付きのエンジニア向けFeedです。

TechDistill.dev

[DISCLAIMER] 当サイトの要約は正確性を保証しません。気になる記事は必ず原文を確認してください。
cd ..

【要約】Amazon API Gatewayで "+" が消える!? クエリ文字列のデコード挙動を検証してみた [Qiita_Trend] | Summary by TechDistill

> Source: Qiita_Trend
Execute Primary Source

// Problem

システム間のAPI連携において、送信したクエリ文字列の値が意図せず書き換わる問題が発生した。開発者がシステムAからシステムBへリクエストを送る際、Lambda側で必須項目が正しく受け取れない事象に直面した。具体的には以下の課題が挙げられる。


  • Amazon API Gatewayがクエリ文字列をデコードする際、記号を書き換えてしまう。
  • 「+」記号が、application/x-www-form-urlencodedの仕様に基づき半角スペースとして解釈される。
  • 電話番号やBase64文字列など、記号を含むデータが破損し、後続の処理でエラーを引き起こす。

// Approach

開発者は、API GatewayとLambdaを用いた最小構成の検証環境を構築し、リクエスト形式による挙動の違いを比較した。実際のネットワーク経由のリクエストを再現するため、curlコマンドを用いた検証手法を採用している。


  • 検証環境の構築:API GatewayとLambdaを組み合わせ、受信したイベント内容をそのまま返す構成を作成した。
  • 比較パターンの設定:未エンコードの「+81」と、パーセントエンコード済みの「%2B81」の2パターンを用意した。
  • 検証ツールの選定:コンソールのテスト機能ではなく、実際のHTTPリクエストを模したcurlコマンドを使用し、正確な挙動を確認した。

// Result

検証の結果、未エンコードの「+」は半角スペースに変換されるが、正しくエンコードされていれば正常に受信できることが判明した。


  • パターン①(未エンコード):tel=+81tel: " 81" となり、データが破損した。
  • パターン②(エンコード済):tel=%2B81tel: "+81" となり、期待通りに動作した。
  • 検証の注意点:API Gatewayコンソールの「テスト」ボタンは、内部API経由の疑似実行であるため、実際のデコード挙動を再現できないことが明らかになった。

Senior Engineer Insight

> 本件は、プロトコル仕様の解釈違いに起因する典型的な「隠れた仕様」である。特に、API Gatewayコンソールのテスト機能が実際の挙動を反映しない点は、デバッグ時の誤判断を招く重大なリスクとなる。設計段階において、記号を含むデータはクエリ文字列ではなく、JSON形式のリクエストボディに含めるべきである。これにより、デコード仕様に依存しない堅牢なインターフェースを構築できる。実戦では、こうした「仕様の隙間」を意識した設計が、運用コストの低減に直結する。

[ RELATED_KERNELS_DETECTED ]

cd ..

> System.About()

TechDistillは、膨大な技術記事から情報の真髄(Kernel)のみを抽出・提示します。