Application Load Balancer または Network Load Balancer を使用して API Gateway プライベート API を呼び出すにはどうすればよいですか?

最終更新日: 2022 年 11 月 3 日

API Gateway のプライベート API をロードバランサーの背後のターゲットとして設定したいと考えています。その後、自分のアカウントまたは別の AWS アカウントを使用して、Application Load Balancer または Network Load Balancer からプライベート API にアクセスしたいと考えています。これを設定するにはどうすればよいですか?

簡単な説明

AWS Direct Connect または Amazon Route 53 を使用してプライベート API にアクセスするには、「プライベート API を呼び出す方法」を参照してください。インターフェイス VPC エンドポイントを使用して、別の AWS アカウントの API Gateway プライベート REST API にアクセスすることもできます。

次の設定では、プライベート API がロードバランサーのターゲットとして追加されます。これは Amazon Virtual Private Cloud (Amazon VPC) エンドポイントの Elastic Network Interface IP アドレスを使用して行われます。

重要: カスタムドメイン名はプライベート API ではサポートされていません。回避策として、ドメインを呼び出してロードバランサーにアタッチできます。その後、この記事で説明されている設定を使用してプライベート API を呼び出します。

解決方法

Amazon VPC エンドポイントを作成する

1.    Amazon VPC コンソールを開き、[Endpoints] (エンドポイント) を選択し、[Create endpoint] (エンドポイントを作成) を選択します。
注: API execute-api を使用して VPC で既に Amazon VPC エンドポイントを設定している場合は、プライベート DNS が無効になっていることを確認してください。

2.    [Services] (サービス) で、[com.amazonaws.com.your-region.execute-api] を選択します。

3.    [VPC] で、Amazon VPC を選択します。

4.    [Subnets] (サブネット) で、異なるアベイラビリティーゾーン (AZ ID) にある 2 つのサブネットを選択し、[Create endpoint] (エンドポイントを作成) を選択します。

5.    エンドポイントを選択し、[subnets] (サブネット) を選択して、[IP address] (IP アドレス) をコピーします。この IP アドレスは別のステップで使用します。

詳細については、「API Gateway のインターフェイス VPC エンドポイント execute-api を作成する」を参照してください。

プライベート REST API を作成して Amazon VPC エンドポイントに許可を付与する

1.    API Gateway コンソールを開き、[Create API] (API を作成) を選択します。

2.    [REST API] で [Build] (ビルド) を選択します。

3.    [Settings] (設定) で、次のように入力します。
[API name] (API 名) で、API の名前を入力します。
[Endpoint Type] (エンドポイントタイプ) で、[Private] (プライベート) を選択します。
[Endpoint IDs] (エンドポイント ID) で、前に作成したエンドポイント ID を入力します。

4.    [Create API] (API を作成) を選択します。

5.    ナビゲーションペインで、[Resource Policy] (リソースポリシー) を選択します。

6.    リソースポリシーエディタで、次のポリシーを貼り付けます:
注:
vpce-<id> を VPC エンドポイント ID に置き換えます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "arn:aws:execute-api:<region>:<account :<api-id>/*/*/*",
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpce": "vpce-081234d1ad408e"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "execute-api:Invoke",
      "Resource": "arn:aws:execute-api:<region>:<account-id>:<api-id>/*/*/*"
    }
  ]
}

7.    [Save] (保存) を選択します。

詳細については、「API Gateway コンソールを使用してプライベート API を作成する」を参照してください。

AWS Certificate Manager のパブリック証明書を作成またはインポートする

まだ行っていない場合は、次のいずれかを実行してください。

パブリック証明書をリクエストします

-または-

証明書をインポートする

Application Load Balancer または Network Load Balancer を作成する

まだ行っていない場合は、次のいずれかを実行してください。

Application Load Balancer を作成する

-または-

Network Load Balancer を作成する

ターゲットグループを作成する

1.    Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開きます。

2.    ナビゲーションペインの [Load Balancing] (負荷分散) で、[Load Balancers] (ロードバランサー) を選択し、[Target Groups] (ターゲットグループ) を選択してから、[Create target group] (ターゲットグループを作成) を選択します。

3.    [target type] (ターゲットタイプ) で、[IP addresses] (IP アドレス) を選択します。

4.    [Target group name] (ターゲットグループ名) で、名前を入力します。

Application Load Balancer

[Protocol] (プロトコル) で、[HTTPS] を選択します。
[Port] (ポート) で、[443] を選択します。
[VPC] で、VPC を選択します。
[Health check] (ヘルスチェックパス) で、200,403 と入力します。(これにより、VPC エンドポイントがターゲットグループで [Healthy] (正常) と表示されるようになります)

Network Load Balancer

[Protocol] (プロトコル) で、[TLS] を選択します。
[Port] (ポート) で、[443] を選択します。
[VPC] で、VPC を選択します。

5.    [次へ] を選択します。

6.    [Specify IPs] (IP を指定) で、[Create an interface Amazon VPC endpoint] (インターフェイス Amazon VPC エンドポイントを作成) セクションにコピーした IP アドレスを入力し、[Add IPv4 address] (IPv4 アドレスを追加) を選択します。

7.    [Create target group] (ターゲットグループの作成) を選択します。

ロードバランサーを設定する

1.    EC2 コンソールを開きます。

2.    ナビゲーションペインで [Load Balancers] (ロードバランサー) を選択して、その後に [Create Load Balancer] (ロードバランサーを作成) を選択します。

Application Load Balancer

[Scheme] (スキーム) で、設定に応じて [Internet-facing] (インターネット向け) または [Internal] (内部) を選択します。
[Protocol] (プロトコル) で、[HTTPS] を選択します。
[VPC][subnet] (サブネット) で、VPC とサブネットを選択します。

Network Load Balancer [Scheme] (スキーム) で、設定に応じて [Internet-facing] (インターネット向け) または [Internal] (内部) を選択します。
[Protocol] (プロトコル) で、[TLS] を選択します。
[VPC][subnet] (サブネット) で、VPC とサブネットを選択します。
[Security policy] (セキュリティポリシー) で、デフォルトポリシー [ELBSecurityPolicy-TLS (recommended)] (ELBSecurityPolicy-TLS (推奨)) を選択します。
[Default SSL/TLS certificate] (デフォルト SSL/TLS 証明書) で、[From ACM] (ACM から) を選択します。
[Select a certificate] (証明書を選択) ドロップダウンメニューを選択し、証明書を選択します。

3.    [Create load balancer] (ロードバランサーの作成) を選択します。

注: ロードバランサーのターゲットは、VPC エンドポイントが作成した Elastic Network Interface の IP アドレスである必要があります。これらはステップ 1 で実行しました。これらの伸縮自在なネットワークインターフェイスは、VPC エンドポイントを選択して [Subnets] (サブネット) タブを開くと表示されます。

Amazon Route 53 のパブリックホストゾーンまたはプライベートホストゾーンにレコードを作成する

まだ行っていない場合は、次のいずれかを実行してください。

パブリックホストゾーンを作成する

-または-

プライベートホストゾーンを作成する

その後、CNAME レコードを作成し、Application Load Balancer または Network Load Balancer に関連付けます。

テスト

パブリックロードバランサーの場合は、ローカルマシンから curl リクエストを実行できます。

プライベートロードバランサーの場合は、ロードバランサーのサブネットの 1 つで新しい EC2 インスタンスを起動します。その後、次のような curl リクエストを実行します。

curl -v https://{custom-domain-name}/<stage-name>/<resource-path> -H 'Host: <api-id>.execute-api.<region>.amazonaws.com'

-または-

curl -v https://{custom-domain-name}/<stage-name>/<resource-path> -H 'x-apigw-api-id:{api-id}'

リクエストが成功すると、「200 OK」のレスポンスコードが返されます。リクエストが失敗すると、「403 Forbidden」(403 禁止) レスポンスコードまたは DNS 解決エラーが返されます。問題が発生した場合は、「ロードバランサーのトラブルシューティング」を参照してください。