ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録。投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

VPCエンドポイントを使ってみる

VPCエンドポイントとは

通常、S3やDynamoDB, API Gatewayなどのサービスはインターネットを経由してアクセスする。しかしVPCエンドポイントを利用すれば、インターネット上に出ることなくこれらのサービスにアクセスすることができる。これを使うと以下のようなメリットがある。

  • よりセキュアな通信
  • 通信コストの削減
  • アクセス対象のリソース制御

インターフェイスエンドポイントとゲートウェイエンドポイント

インターフェイスエンドポイント

超簡単に説明すると、VPCの中にローカルIPアドレスを持ったNICを作って、そこを宛先にして各サービスへアクセスする。アベイラビリティゾーン毎にデプロイ可能。セキュリティグループも紐付けることができるので送信元IPによる制御も可能。

作成時に プライベートDNS を有効にすることで、サービスデフォルトのDNS名をインターフェイスエンドポイントに変更することができる。これを利用すれば、VPC内のEC2でAWS CLI, AWS SDKを使ったアクセスがインタフェイスエンドポイント経由になる。ただし、API Gatewayの場合は後述する罠があるので注意。

f:id:oneal-desu:20181106190148p:plain

ゲートウェイエンドポイント

ルートテーブルに紐づくエンドポイント。設定したサービスの通信がここで作成した経路に捻じ曲げられる。現在はS3とDynamoDBでしか利用しない。今回はためしてない。

作ってみた(インターフェイスエンドポイント)

API Gatewayで検証してみる

事前確認

プライベートなAPI Gateway

$ nslookup XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com
Server:         10.169.62.85
Address:        10.169.62.85#53

** server can't find XXXXXX.execute-api.ap-northeast-1.amazonaws.com: NXDOMAIN

グローバルなAPI Gateway

$ nslookup XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com
Server:         10.169.62.85
Address:        10.169.62.85#53

Non-authoritative answer:
Name:   XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com
Address: グローバルIPが返ってくる
Name:   XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com
Address: グローバルIPが返ってくる

VPCエンドポイント作成

以下を参考に作成。今回はプライベートDNS名を有効化して作成。 https://dev.classmethod.jp/cloud/apigateway-supports-vpc-endpoint/

事後確認

プライベートなAPI Gateway

$  nslookup XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com
Server:         10.169.62.85
Address:        10.169.62.85#53

Non-authoritative answer:
XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com     canonical name = execute-api.ap-northeast-1.amazonaws.com.
Name:   execute-api.ap-northeast-1.amazonaws.com
Address: 10.169.62.190
Name:   execute-api.ap-northeast-1.amazonaws.com
Address: 10.169.63.75

グローバルなAPI Gateway

$ nslookup XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com
Server:         10.169.62.85
Address:        10.169.62.85#53

Non-authoritative answer:
XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com     canonical name = execute-api.ap-northeast-1.amazonaws.com.
Name:   execute-api.ap-northeast-1.amazonaws.com
Address: 10.169.62.190
Name:   execute-api.ap-northeast-1.amazonaws.com
Address: 10.169.63.75

両方ともインターフェイスエンドポイントのIPが返ってきた

API Gatewayの罠

VPCエンドポイントを作成する際、プライベートDNS名を有効化してしまうとAPI Gatewayのエンドポイントタイプが リージョナル , エッジ最適化APIもプライベートリンク経由の接続となる。この場合、VPC内から上記タイプのAPI Gatewayにアクセスできなくなる。

同じVPCから プライベート , リージョナル , エッジ最適化API Gatewayを併用する場合、VPCエンドポイントはプライベートDNS名を無効化して作成する必要がある。また、このケースでプライベートなAPI GatewayへアクセスするにはパブリックDNS名を利用し、かつリクエストヘッダを追加 or ホストヘッダを修正してアクセスする必要がある。パブリックというだけあって外部からも名前解決はできるが、ローカルIPなのでもちろんアクセスはできない。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-private-apis.html#w2aac12c15c23c29c11

メモ

API GatewayHTTPSでしかアクセスできない

https://aws.amazon.com/jp/api-gateway/faqs/

感想

もともとはVPCエンドポイントをさっくり試す記事にしようと思ったけど、API Gatewayの罠にハマって結構時間がかかった。これまで表面的にしか分かってなかったけど、実際に使って仕組みを理解すると面白い。

参考

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html#apigateway-private-api-test-invoke-url

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints.html

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints-access.html(