インターフェイス VPC エンドポイントを使用して、別の AWS アカウントの API Gateway にあるプライベート REST API にアクセスする方法を教えてください。

最終更新日: 2020 年 5 月 8 日

インターフェイス VPC エンドポイント を使用して、別の AWS アカウントの Amazon API Gateway にあるプライベート REST API にアクセスしたいと考えています。どうすればできますか?

簡単な説明

1 つのアカウント (「アカウント A」) の Amazon Virtual Private Cloud (Amazon VPC) にインターフェイスエンドポイントを作成します。もう 1 つのアカウント (アカウント B) で、インターフェイスエンドポイントからの呼び出しを許可するリソースポリシーを含むプライベートな REST API を、API Gateway に作成します。

解決方法

アカウント A でインターフェイスエンドポイントを作成する

1.    アカウント A の Amazon VPC コンソールから、[Endpoints] ページを開きます。

2.    [エンドポイントを作成] をクリックします。

3.    [エンドポイントを作成] ページで、次の操作を実行します。
[サービスカテゴリー] で [AWS のサービス] をクリックします。
[VPC] で、インターフェイスエンドポイントを作成する Amazon VPC を選択します。
[サブネット] で、エンドポイントネットワークインターフェイスを作成するサブネットを選択します。インターフェイスエンドポイントにアベイラビリティーゾーンの障害に対する耐障害性を確保するため、異なるアベイラビリティーゾーンで複数のサブネットを選択します。
[DNS 名を有効化] で、[このエンドポイントで有効] チェックボックスをオンにし、インターフェイスエンドポイントのプライベート DNSを有効にします。プライベート DNS を有効にすると、プライベートまたはパブリックな DNS を使用して、プライベート API に接続できるようになります。
注: インターフェイス VPC エンドポイントのプライベート DNS を有効にすると、API Gateway のパブリック API に対し、Amazon VPC からのアクセスができなくなります。詳細については、「VPC から API ゲートウェイ API に接続するときに HTTP 403 Forbidden エラーが発生するのはなぜですか?」をご参照ください。
[セキュリティグループ] には、エンドポイントネットワークインターフェイスに関連付けるセキュリティグループを少なくとも 1 つ選択します。選択したセキュリティグループには、Amazon VPC の IP アドレス範囲からの、もしくは、Amazon VPC 内の別のセキュリティグループからの TCP ポート 443 インバウンド HTTPS トラフィックを許可するルールが必要です。これらの要件を満たすセキュリティグループがない場合は、[新規セキュリティグループの作成] をクリックして、セキュリティグループを作成します。セキュリティグループを特別に指定しない場合、デフォルトのセキュリティグループがエンドポイントネットワークインターフェイスに関連付けられます。
[ポリシー] で、[フルアクセス] を選択します。
[エンドポイントを作成] をクリックします。
[サービス名] で、API Gateway のサービスエンドポイントを選択します。これは、com.amazonaws.region.execute-api のようになります。region は現在の AWS リージョンに置き換えられます。たとえば、com.amazonaws.us-east-1.execute-api のような形式になります。

4.    新しいインターフェイスエンドポイントの VPC エンドポイント ID をコピーします。これは、vpce-1a2b3c456d7e89012のような形式になります。この ID は、プライベート API の作成と設定の際に必要となります。

5.    [閉じる] をクリックします。

6.    Amazon VPC コンソールの [エンドポイント] ページにある [詳細] タブから、DNS 名を記録しておきます。インターフェイスエンドポイントのパブリック DNS 名をコピーします。これは、vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com のような形式になります。

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

アカウント B でプライベート REST API を作成する

1.    アカウント B で、API Gateway コンソールを開きます。

2.    [API を作成] を選択します。

3.    [REST API プライベート] の下で、[構築] をクリックします。

4.    [作成] ページでは、[プロトコルの選択] を [REST] に設定します。

5.    [新しい API の作成] で、[新規 API] を選択します。

6.    [設定] では、次の操作を実行します。
[API 名] に、API の名前を入力します。
(オプション) [説明] に、APIの説明を入力します。
[エンドポイントタイプ] は、[プライベート] に設定します。
[VPC エンドポイント ID] に、先にコピーしてあるインターフェイスエンドポイント ID を貼り付け、[追加] をクリックします。
注: インターフェイスエンドポイントをプライベート REST API に関連付けると、API Gateway は、新しい Amazon Route 53 エイリアスレコードを生成します。Route 53 エイリアスは、プライベート API のアクセスに使用できます。

7.    [API を作成] を選択します。

詳細については、「Amazon API Gateway でプライベート API を作成する」をご参照ください。

プライベート REST API のリソースポリシーを設定する

1.    API Gateway コンソールの左側ナビゲーションペインでご自身の API を見つけ、その下の [リソースポリシー] をクリックします。

2.    [リソースポリシー] ページのテキストボックスに、次の例に示すリソースポリシーを貼り付けます。

注: vpce-1a2b3c456d7e89012 の部分は、先にコピーしたインターフェイスエンドポイント ID で置き換えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "execute-api:/*/*/*",
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpce": "vpce-1a2b3c456d7e89012"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "execute-api:/*/*/*"
        }
    ]
}

詳細については、「プライベート API のリソースポリシーをセットアップする」をご参照ください。

プライベート REST API のメソッドをセットアップする

1.    API Gateway コンソールの左側ナビゲーションペインでご自身の API を見つけ、その下の [リソース] をクリックします。

2.    [リソース] ペインで、[アクション]、[メソッドを作成] の順にクリックします。

3.    リソースノード / の下のドロップダウンリストで、[ANY] を選択し、チェックマークアイコンをクリックします。

4.    [/ - ANY - セットアップ] ペインの [統合タイプ] で、[モック] を選択します。モック統合は到達したすべての要求に応答するもので、後のテストに役立ちます。

5.    [保存] をクリックします。

詳細については、「API Gateway で REST API メソッドをセットアップする」をご参照ください。

プライベート REST API をデプロイする

1.    API Gateway コンソールの [リソース] ペインで、[アクション]、[API のデプロイ] の順にクリックします。

2.    [API のデプロイ] ダイアログで、次の操作を実行します。
[デプロイされるステージ] で、[新規ステージ] を選択します。
[ステージ名] に名前を入力します。例としては、devtest などとなります。
[デプロイ] をクリックします。

3.    [ステージエディター] ペインで、プライベート API の呼び出し URL と共に、メッセージ ("If Private DNS is enabled, use this URL:") の内容をメモしておきます。テスト用に URL をコピーします。

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

アカウント A からプライベート API をテストする

1.    アカウント A において、インターフェイスエンドポイントと同じ Amazon VPC に、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを起動します 。セットアップの際、インターフェイスエンドポイントに関連付けした既存のセキュリティグループを選択します 。

2.    EC2 インスタンスに接続します

注: EC2 インスタンスに接続すると、AWS アカウントでの料金が発生する場合があります。このテストのためだけにインスタンスを作成している場合は、料金が繰り返し発生することを防ぐために、完了後には必ずインスタンスを終了してください。

3.    EC2 インスタンスのコマンドラインから、次のいずれかの curl コマンドを使用して、アカウント B のプライベート API を呼び出します。curl の詳細については cURL プロジェクトのウェブサイトをご参照ください。

プライベート DNS 名:

curl -i https://a1bc234d5e.execute-api.region.amazonaws.com/stage-name

注: https://a1bc234d5e.execute-api.region.amazonaws.com/stage-name の部分を、API Gateway コンソールでコピーしてあるプライベート API の呼び出し URL に置き換えます。このコマンドは、インターフェイスエンドポイントでプライベート DNS を有効にした場合にのみ機能します。詳細については、「プライベート DNS 名を使用してプライベート API を呼び出す」をご参照ください。

Route 53 エイリアス:

curl -i https://a1bc234d5e-vpce-1a2b3c456d7e89012.execute-api.region.amazonaws.com/stage-name

注: a1bc234d5e の部分を、ご自身の API の ID で置き換えます。
vpce-1a2b3c456d7e89012 の部分を、インターフェイスエンドポイント ID で置き換えます。
region の部分は、API があるリージョンで置き換えます。(例: us-east-1)
stage-name の部分は、プライベート API をデプロイしたステージの名前に置き換えます。詳細については、「Route 53 エイリアスを使用したプライベート API へのアクセス」をご参照ください。

ホストヘッダーを含むパブリック DNS 名:

curl -i https://vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com/stage-name -H "Host: https://a1bc234d5e.execute-api.region.amazonaws.com"

注: vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com の部分を、Amazon VPC コンソールで記録してあるパブリック DNS 名で置き換えます。
stage-name の部分は、プライベート API をデプロイしたステージの名前に置き換えます。
https://a1bc234d5e.execute-api.region.amazonaws.com の部分は、API Gateway コンソールで記録してあるプライベート API の呼び出し URL に置き換えます。

x-apigw-api-id ヘッダーを含むパブリック DNS 名:

curl -i https://vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com/stage-name -H "x-apigw-api-id:a1bc234d5e"

注: vpce-1a2b3c456d7e89012-f3ghijkl.execute-api.region.vpce.amazonaws.com の部分を、Amazon VPC コンソールで記録してあるパブリック DNS 名で置き換えます。
stage-name の部分は、プライベート API をデプロイしたステージの名前に置き換えます。
a1bc234d5e の部分を、API の ID に置き換えます。

詳細については、「エンドポイント固有のパブリック DNS ホスト名を使用したプライベート API の呼び出し」をご参照ください。

4.    コマンドの出力を確認します。接続に成功すると、API Gateway から 200 OK レスポンスを受け取ります。