他アカウントのVPCエンドポイントを使用してプライベートAPI Gatewayにアクセスする

他アカウントのVPCエンドポイントを使用して、プライベートAPI Gatewayにアクセスしてみたいと思います。パブリックDNS名とプライベートDNS名でアクセス方法が異なるのでそれぞれ確認してみます。
2019.11.24

プライベートAPI GatewayにアクセスするにはVPCエンドポイントが必要になります。

本エントリでは、アクセス元アカウント(Aアカウント)にVPCエンドポイントはなく、アクセス先にあるVPCエンドポイントを利用してAPI Gatewayに接続してみたいと思います。

構成のイメージは以下となります。

00

前提

ここでは、上記構成については構築済みであることを前提とします。また、VPCエンドポイント(com.amazonaws.ap-northeast-1.execute-api)のプライベートDNS名の設定が有効化されていることとします。

プライベートDNS名の設定が有効な場合、パブリックDNS名とプライベートDNS名がエンドポイントに設定されます。

  • パブリックDNS名:vpce-XXXX-XXXX.execute-api.<リージョン名>.vpce.amazonaws.com
  • パブリックDNS名:vpce-XXXX-XXXX-.execute-api.<リージョン名>.vpce.amazonaws.com
  • プライベートDNS名:execute-api.<リージョン名>.amazonaws.com
  • プライベートDNS名:*.execute-api.<リージョン名>.amazonaws.com

以下、参考ドキュメントです。

パブリックDNS名を利用したアクセス

パブリックDNS名を使用してAPI Gatewayにアクセスするには、以下のようにホストヘッダーの指定が必要になります。

  • curl -H "Host:.execute-api..amazonaws.com" https:////

AアカウントのPrivateサブネットに配置したEC2から、BアカウントのVPCエンドポイント(API Gateway)にアクセスしてみたいと思います。

[ec2-user@ip-10-0-1-141 ~]$ curl -H "Host:41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com" https://vpce-0219fb661c4c41165-f32rjlc5.execute-api.ap-northeast-1.vpce.amazonaws.com/v1/pets/
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]
[ec2-user@ip-10-0-1-141 ~]$ curl -H "Host:41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com" https://vpce-0219fb661c4c4115-f32rjlc5-ap-northeast-1a.execute-api.ap-northeast-1.vpce.amazonaws.com/v1/pets/
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]
[ec2-user@ip-10-0-1-141 ~]$

アクセスすることができ、API Gatewayからレスポンスがありました。なお、ホストヘッダーの指定がないと動作しません。

[ec2-user@ip-10-0-1-141 ~]$ curl https://vpce-0219fb661c4c41165-f32rjlc5.execute-api.ap-northeast-1.vpce.amazonaws.com/v1/pets/
{"message":"Forbidden"}

プライベートDNS名を利用したアクセス

名前解決確認

プライベートDNS名は、VPCエンドポイントが存在するVPCでのみ名前解決が可能です。そのためAアカウントでは名前解決できず、Bアカウントでは名前解決されました。

A アカウント

[ec2-user@ip-10-0-1-141 ~]$ dig 41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.amzn2.0.2 <<>> 41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 42273
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com. IN	A

;; AUTHORITY SECTION:
execute-api.ap-northeast-1.amazonaws.com. 60 IN	SOA ns-798.awsdns-35.net. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 3 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Sun Nov 24 10:45:01 UTC 2019
;; MSG SIZE  rcvd: 161

[ec2-user@ip-10-0-1-141 ~]$

B アカウント

[ec2-user@ip-172-31-33-151 ~]$ dig 41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.amzn2.0.2 <<>> 41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33150
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com. IN	A

;; ANSWER SECTION:
41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com. 60	IN CNAME execute-api.ap-northeast-1.amazonaws.com.
execute-api.ap-northeast-1.amazonaws.com. 60 IN	A 172.31.54.168

;; Query time: 8 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Sun Nov 24 10:08:27 UTC 2019
;; MSG SIZE  rcvd: 110

[ec2-user@ip-172-31-33-151 ~]$

先の構成図では、BアカウントにEC2は存在していませんが、一時的にEC2を作成し本確認を行いました。

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

AアカウントからプライベートDNS名を使用して、API Gatewayにアクセスさせたい場合は、アクセス元アカウント(Aアカウント)のRoute 53にて、プライベートホストゾーンを作成します。

  • ドメイン名:.execute-api..amazonaws.com
  • タイプ:Amazon VPCのプライベートホストゾーン
  • VPC ID:接続元 VPC(ここではAアカウントのVPC)

レコードセットを作成します。Aレコードのエイリアスとして、Bアカウントに存在するVPCエンドポイントの、プライベートDNS名を設定します。

AアカウントのEC2より名前解決を確認しました。

[ec2-user@ip-10-0-1-141 ~]$ dig 41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.amzn2.0.2 <<>> 41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43086
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com. IN	A

;; ANSWER SECTION:
41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com. 60	IN A 172.31.54.168

;; Query time: 3 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Sun Nov 24 10:13:39 UTC 2019
;; MSG SIZE  rcvd: 96

[ec2-user@ip-10-0-1-141 ~]$

名前解決が確認できたので、API Gatewayにアクセスしました。

[ec2-user@ip-10-0-1-141 ~]$ curl https://41i1ebivrf.execute-api.ap-northeast-1.amazonaws.com/v1/pets/
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]
[ec2-user@ip-10-0-1-141 ~]$

プライベートホストゾーンを作成することで、AアカウントからプライベートDNS名を使用してアクセスすることができました。

アクセスできない時

本構成(他アカウントのVPCエンドポイントを使用)にて、想定できる範囲でアクセスできない原因を上げてみたいと思います。

VPC ピアリング

プライベートIPで通信しますので、ピアリング接続は必須となります。ステータスがアクティブになっていることを確認しましょう。

ルーティング

アクセス元/先のサブネットに指定したルートテーブルにて、ピアリング接続宛てのルートがあるか確認しましょう。

A アカウント

B アカウント

セキュリティグループ

VPCエンドポイントへアタッチされたセキュリティグループに、HTTPS(443)にてアクセス元が許可されているか確認しましょう。

リソースポリシー確認

該当APIのリソースポリシーで、アクセス元が許可されているか確認しましょう。

なお、リソースポリシーを変更した場合は、API gatewayの再デプロイが必要になりますのでご注意ください。

さいごに

他アカウントのVPCエンドポイントを使用して、プライベートAPI Gatewayにアクセスする方法をご紹介しました。誰かのお役に立てれば幸いです。

参考