web-dev-qa-db-ja.com

ELBおよびECSクラスターの前にあるAmazon API Gateway

Amazon API GatewayをApplication Load Balancerの前に配置しようとしています。これは、すべてのマイクロサービスが展開されているECSクラスターへのトラフィックのバランスを取ります。 API Gatewayを使用する動機は、ラムダ関数を介してカスタム認証を使用することです。

システム図

enter image description here

Amazonの言葉で( https://aws.Amazon.com/api-gateway/faqs/ ): "バックエンド操作へのプロキシリクエストは、インターネット"。これにより、ELBを内部ではなくパブリック(インターネットに直接接続)にする必要があります。次に、onlyAPI GatewayがVPCの外部のELBにアクセスできることを確認する方法が必要です。

私の最初のアイデアは、API Gatwayでクライアント証明書を使用することでしたが、ELBはそれをサポートしていないようです。

どんなアイデアでも大歓迎です!

これは、プッシュされた方法を考えると、APIゲートウェイテクノロジーの大きな欠落部分のようです。 VPCの内部に面したサーバーを呼び出すことができないと、インターネットアクセスの認証フロントドアとしての有用性が大幅に制限されます。 FWIW、Azureでは、API Managementはこれをすぐにサポートします。インターネットからの要求を受け入れ、ファイアウォールで保護されていない仮想ネットワークに直接呼び出すことができます。 AWSでこれが可能と思われる唯一の方法は、Lambdasを使用することです。これにより、特に複雑なレイヤーが追加されます。さまざまなバイナリプロトコルをサポートする必要がある場合。

12
Dylan Nicholson

このサポートが追加されたようです。テストしていない、YMMV:

https://aws.Amazon.com/about-aws/whats-new/2017/11/Amazon-api-gateway-supports-endpoint-integrations-with-private-vpcs/

4
Dylan Nicholson

ヘッダーを使用して、すべてのトラフィックがAPI Gatewayを経由していることを確認することにしました。アプリの環境変数に秘密を保存し、APIを作成するときにAPI Gatewayに注入するように指示します。次に、アプリでそのキーを確認します。

これのために私たちがやっていることは次のとおりです。

基本コントローラーでキーをチェックします(ゲートウェイの背後にREST APIがあるだけです):

string ApiGatewayPassthroughHeader = context.HttpContext.Request.Headers["ApiGatewayPassthroughHeader"];

if (ApiGatewayPassthroughHeader != Environment.GetEnvironmentVariable("ApiGatewayPassthroughHeader"))
{
    throw new error;
}

Swaggerファイル(swagger.jsonをAPIのソースとして使用しています)

"x-Amazon-apigateway-integration": {
    "type": "http_proxy",
    "uri": "https://${stageVariables.url}/path/to/resource",
    "httpMethod": "post",
    "requestParameters": {
      "integration.request.header.ApiGatewayPassthroughHeader": "${ApiGatewayPassthroughHeader}"
    }
  },

Docker composeファイル(dockerを使用していますが、どの設定ファイルでも同じものを使用できます)

services:
  example:
      environment:
        - ApiGatewayPassthroughHeader=9708cc2d-2d42-example-8526-4586b1bcc74d

ビルド時に、設定ファイルからシークレットを取得し、swagger.jsonファイルで置き換えます。このようにして、設定ファイル内のキーをローテーションできます。APIゲートウェイは、アプリが探しているキーを使用するように更新されます。

3
Cale

現在、API GatewayをプライベートELBの前に配置する必要はないため、インターネットに直接接続する必要があります。私が考えることができるあなたの場合の最善の回避策は、ELBをTCPパススルーモードにし、ELBの背後のエンドホストでクライアント証明書を終了することです。

1

VPC LinkとNetwork Load Balancerを使用する場合に可能です。

この投稿をご覧ください: https://adrianhesketh.com/2017/12/15/aws-api-gateway-to-ecs-via-vpc-link/

TL; DR

  1. ターゲットグループ(VPCのインスタンス)に接続された内部Network Load Balancerを作成します
  2. API Gatewayコンソールで、VPCリンクを作成し、上記のNLBにリンクします
  3. API Gatewayエンドポイントを作成し、「VPC Link integration」を選択して、NLB内部URLを「Endpoint URL」として指定します

お役に立てば幸いです!

0
user7455457

ECSの前のApplication Load Balancer(ALB)にオーソライザーを直接追加できるようになりました。

これは、リスナーのルールで直接構成できます。詳細については、このブログ投稿を参照してください。

https://aws.Amazon.com/de/blogs/aws/built-in-authentication-in-alb/

0
Erik P