マイクロサービスは、インターネットからの直接アクセスを遮断し分離・保護するために、Amazon Virtual Private Cloud (VPC) のプライベートサブネット内にデプロイするのが一般的です。マイクロサービスへの外部アクセスを構成する方法としては、主に次の2つのアプローチがあります。
- Private Link:インターフェースエンドポイントを利用し、プライベートVPC内のリソースをパブリックインターネットに公開することなくAPI Gatewayへ安全に接続するネットワーク機能です。トラフィックはAWSネットワーク内に閉じたまま流れます。
- HTTP Integration (インターネット向け):インターネット向けのApplication Load Balancer (ALB) など、パブリックにアクセス可能なHTTPエンドポイントへAPI Gatewayからリクエストをルーティングし、サービスをパブリックエンドポイント経由で公開する方法です。
本記事では、2つ目のアプローチ、つまりAPI Gatewayの背後に配置したインターネット向けALBのセキュリティ強化に焦点を当てます。具体的には、信頼できるクライアントからはAPI Gateway経由でのみアプリケーションにアクセスできるようにしつつ、パブリックALBへの直接アクセスを遮断するという課題を取り上げます。
課題
HTTP Integrationを使ってインターネット向けALBをAPI Gatewayの背後に配置すると、ALB自体がインターネットからアクセス可能な状態になります。信頼できるクライアントはAPI Gateway経由で接続しますが、この構成にはセキュリティ上の大きな落とし穴があります。ALBのパブリックエンドポイントに直接アクセスされてしまえば、API Gatewayが提供するセキュリティ機能をすべて素通りされてしまうのです。
こうしたアクセス制御の不備は、さまざまな脆弱性につながります。アプリケーションのセキュリティと健全性を保つには、ALBへの直接アクセスを確実に防ぐことが欠かせません。すべてのトラフィックをAPI Gateway経由に集約してはじめて、リクエスト検証、スロットリング、認証、認可といった重要なセキュリティ機能を一貫して適用できます。これらの保護がなければ、攻撃者に脆弱性を突かれたり、認証を回避されたり、過剰な負荷でバックエンドを圧迫されたりして、サービス拒否(DoS)攻撃を招く恐れがあります。
AWSはREST API GatewayとAWS Web Application Firewall (WAF) を組み合わせ、特定のヘッダーを持たないリクエストをブロックするソリューションを提供していますが、この方法は構成の複雑さとコストの増加を伴います。なお、SQLインジェクションやクロスサイトスクリプティング (XSS) への対策、ボット軽減など高度なセキュリティ要件があるユースケースでは、AWS WAFは引き続き有力な選択肢です。
本記事では、よりシンプルでコスト効率に優れた代替手段をご紹介します。カスタムヘッダーとALBのルール条件を組み合わせることで、AWS WAFに頼らずに同等のセキュリティを実現できます。この方法はREST API Gateway / HTTP API Gatewayのいずれにもそのまま適用でき、運用負荷を大幅に下げられます。
**ソリューション**
本アプローチでは、ALBが備えるコンテンツベースルーティング機能を活用し、AWS WAFを不要にします。手順は次の3つです。
- API GatewayでHTTPリクエストにカスタムヘッダーと値を付与する。
- ALBルールでヘッダー検証を行うよう設定する。正しいヘッダーと値を持つリクエストだけが目的のALBルールにマッチし、それ以外はすべてデフォルトルールに流れます。
- ALBのデフォルトルールで、403 ForbiddenなどのHTTPエラーコードを返すよう設定する。
アーキテクチャの全体像は次のとおりです。

HTTPリクエストのフロー
**実装手順**
ステップ1:API Gatewayでカスタムヘッダーを定義する
HTTP API Gatewayの場合は、パラメータマッピングを使ってALBインテグレーションへ送るリクエストを書き換えます。
- API Gatewayコンソールを開きます。
- 対象のHTTP APIに移動します。
- 「Integrations」セクションで「Manage Integrations」を開きます。
- カスタムヘッダーと値を追加するパラメータマッピングを作成します。

パラメータマッピングの設定
REST API Gatewayをご利用の場合は、こちらのドキュメントを参照してカスタムHTTPヘッダーを追加してください。
ステップ2:ALBルールを設定する
- EC2コンソールでALBの設定画面を開きます。
- デフォルトルールを除く各リスナールールに対し、以下を行います。
- AND条件を追加します。
- 条件タイプに「HTTP header」を指定します。
- ヘッダー名と想定する値を入力します。
3. デフォルトルールでHTTPエラーレスポンス(例:403 Forbidden)を返すよう設定します。

ALBのルール条件とアクション
ALBのコンテンツベースルーティングの詳細については、AWSのこちらのブログ記事をご覧ください。
ステップ3:設定をテストする
- カスタムヘッダーを付けずにALBへリクエストを送信し、デフォルトルールが適用されてエラーレスポンスが返ることを確認します。
- API Gateway経由でリクエストを送信し、アプリケーションへ正しくルーティングされることを確認します。
**まとめ**
本ソリューションでは、AWS WAFへの依存をなくすことでアーキテクチャをシンプルに保てます。ALBに標準搭載されているコンテンツベースルーティング機能を活用するだけで、Application Load Balancerへの直接アクセスを安全かつ効率的に制限できます。
さらに詳しく知りたい方や当社のサービスにご関心のある方は、お気軽にお問い合わせください。お問い合わせはこちらから。