コンテンツにスキップ

Amazon API Gateway向けプロキシとしてのWallarmのデプロイ

この例では、Amazon API Gatewayを保護する方法を示します。具体的には、Terraformモジュールを使用し、AWS Virtual Private Cloud(VPC)にインラインプロキシとしてデプロイしたWallarmを用います。

Wallarmプロキシソリューションは、WAAPおよびAPIセキュリティ機能を備えた高度なHTTPトラフィックルーターとして機能する追加のネットワーク層を提供します。Amazon API Gatewayを含むほぼあらゆる種類のサービスへ、機能を制限することなくリクエストをルーティングできます。

セキュリティに関する注意

本ソリューションはAWSのセキュリティベストプラクティスに従うよう設計されています。デプロイにはAWSのrootアカウントを使用しないことを推奨します。代わりに、必要最小限の権限のみを持つIAMユーザーまたはロールを使用してください。

デプロイ手順は最小権限の原則を前提としており、Wallarmコンポーネントのプロビジョニングおよび運用に必要な最小限のアクセスのみを付与します。

ユースケース

サポートされているWallarmのデプロイオプションの中でも、以下のようなユースケースでは、AWS VPCへのWallarmのデプロイにTerraformモジュールを推奨します:

  • 既存のインフラストラクチャがAWS上にあります。

  • Infrastructure as Code(IaC)の実践を活用しています。WallarmのTerraformモジュールにより、AWS上のWallarm nodeの管理とプロビジョニングを自動化でき、効率と一貫性が向上します。

要件

  • Terraform 1.0.5以上がローカルにインストールされていること

  • USまたはEUのCloudにあるWallarm ConsoleでAdministratorロールを持つアカウントへのアクセス

  • US Wallarm Cloudを使用する場合はhttps://us1.api.wallarm.com、EU Wallarm Cloudを使用する場合はhttps://api.wallarm.comへアクセスできること。ファイアウォールでブロックされていないことを確認してください

  • 任意のAWSリージョンを選択できます。Wallarm nodeのデプロイに地域の特別な制約はありません

  • Terraform、AWS EC2、Security Groupsおよびその他のAWSサービスに関する理解

  • リソースのデプロイにAWSのrootアカウントを使用してはいけません

    本ガイドで説明するデプロイを実行するには、必要最小限の権限だけを付与した専用のIAMユーザーまたはロールを使用してください。

  • 広範な権限(例: AdministratorAccess)の使用は避け、このモジュールの動作に必要なアクションのみを付与してください

    このデプロイで使用するIAMロールと権限は最小権限の原則に基づいて設計されています。必要なAWSリソース(例: EC2、ネットワーキング、ログ記録)の作成・管理に必要な権限のみを付与してください。

ソリューションアーキテクチャ

Wallarmプロキシの構成図

この例のWallarmプロキシソリューションには、次のコンポーネントがあります:

  • インターネット向けApplication Load BalancerがトラフィックをWallarm nodeインスタンスへルーティングします。

  • Wallarm nodeインスタンスがトラフィックを分析し、すべてのリクエストをAPI Gatewayにプロキシします。

    この例では、説明した動作を実現するためにWallarm nodeをモニタリングモードで実行します。Wallarm nodeは、悪意のあるリクエストをブロックして正当なリクエストのみを転送するなど、他のモードでも動作できます。Wallarm nodeのモードの詳細はドキュメントをご覧ください。

  • Wallarm nodeがリクエストをプロキシするAPI Gateway。API Gatewayには次の設定があります:

    • /demo/demoパスが割り当てられています。
    • 単一のモックが構成されています。
    • このTerraformモジュールのデプロイ中に、"regional"または"private"のAPI Gatewayのエンドポイントタイプを選択できます。これらのタイプの詳細や相互の移行については後述します。

    なお、この例は通常のAmazon API Gatewayをデプロイするため、Wallarm nodeの影響を受けずに動作します。

API Gatewayを含む上記のすべてのコンポーネントは、提供されているwallarmサンプルモジュールによってデプロイされます。

コードコンポーネント

この例には、次のコードコンポーネントがあります:

  • main.tf: プロキシソリューションとしてデプロイするwallarmモジュールのメイン構成です。この構成により、AWS ALBとWallarmインスタンスが作成されます。

  • apigw.tf: /demo/demoパスでアクセス可能なAmazon API Gatewayを作成する構成です。単一のモック統合が設定されます。モジュールのデプロイ時に、"regional"または"private"のエンドポイントタイプも選択できます(詳細は後述)。

  • endpoint.tf: API Gatewayエンドポイントの"private"タイプ用のAWS VPC Endpointの構成です。

"regional"と"private"のAPI Gatewayエンドポイントの違い

apigw_private変数はAPI Gatewayのエンドポイントタイプを設定します:

  • "regional"オプションでは、Wallarm nodeインスタンスはパブリックに利用可能なAPI Gatewayのexecute-apiサービスにリクエストを送信します。
  • "private"オプションでは、execute-apiサービスに接続されたAWS VPC Endpointへ送信します。本番環境のデプロイには"private"オプションを推奨します。

API Gatewayへのアクセス制限の追加オプション

エンドポイントタイプが"private"でも"regional"でも、次の方法でAPI Gatewayへのアクセスを制限できます:

  • いずれのエンドポイントタイプでもリソースポリシーを使用します。

  • エンドポイントタイプが"private"の場合、送信元IPでアクセスを制御します。

  • エンドポイントタイプが"private"の場合(設計上、API Gatewayはパブリックネットワークから到達不能です)、VPCおよび/またはEndpointでアクセスを制御します。

API Gatewayのエンドポイントタイプ間の移行

コンポーネントを再作成せずにAPI Gatewayのエンドポイントタイプを変更できますが、次の点に注意してください:

  • タイプを"regional"から"private"に変更すると、パブリックエンドポイントはプライベートになり、パブリックなリソースからは到達不能になります。これはexecute-apiエンドポイントとドメイン名の両方に適用されます。

  • タイプを"private"から"regional"に変更すると、API Gatewayに関連付けられているAWS VPC Endpointが即座に切り離され、API Gatewayは到達不能になります。

  • コミュニティ版のNGINXはDNS名の変更を自動検出できないため、エンドポイントタイプを変更した後は、Wallarm nodeインスタンスで手動でNGINXを再起動する必要があります。

    各インスタンスの再起動、インスタンスの再作成、または各インスタンスでのnginx -s reloadの実行を行います。

"regional"から"private"にエンドポイントタイプを変更する場合:

  1. AWS VPC Endpointを作成し、execute-apiに関連付けます。例はendpoint.tfの構成ファイルにあります。

  2. API Gatewayのエンドポイントタイプを切り替え、API Gatewayの設定でAWS VPC Endpointを指定します。完了すると、トラフィックフローは停止します。

  3. 各Wallarm nodeインスタンスでnginx -s reloadを実行するか、各Wallarm nodeを再作成します。完了すると、トラフィックフローは復旧します。

"private"から"regional"へエンドポイントタイプを変更することは推奨しませんが、もし実施する場合は次のとおりです:

  1. "private"モードでの稼働に必要なエンドポイントを削除し、その後にAPI Gatewayのエンドポイントタイプを"regional"へ切り替えます。

  2. 各Wallarm nodeインスタンスでnginx -s reloadを実行するか、各Wallarm nodeを再作成します。完了すると、トラフィックフローは復旧します。

本番環境ではAPI Gatewayを"private"に変更することを推奨します。そうしない場合、Wallarm nodeからAPI Gatewayへのトラフィックはパブリックネットワーク経由となり、追加料金が発生する可能性があります。

API Gateway向けの例示Wallarm AWSプロキシソリューションの実行

  1. EU CloudまたはUS CloudのWallarm Consoleにサインアップします。

  2. Wallarm Console → Nodesを開き、Wallarm nodeタイプのノードを作成します。

  3. 生成されたnode tokenをコピーします。

  4. 例のコードを含むリポジトリをローカルマシンにクローンします:

    git clone https://github.com/wallarm/terraform-aws-wallarm.git
    
  5. クローンしたリポジトリのexamples/apigateway/variables.tfファイルのdefaultオプションで変数値を設定し、変更を保存します。

  6. examples/apigatewayディレクトリで次のコマンドを実行してスタックをデプロイします:

    terraform init
    terraform apply
    

デプロイ済みの環境を削除するには、次のコマンドを使用します:

terraform destroy

参考資料