AWS PrivateLinkの使い方と注意点 ~VPCピアリングとの使い分け~
プラットフォーム技術部の小林正彦です。
本記事ではVPCサービスとして提供されているPrivateLinkについて、2017年11月のリリース以降エンハンスされた機能も含めた現行機能の整理と、PrivateLinkの使いどころや注意点などをまとめます。
最後に、実際にPrivateLinkを使ってプライベートサブネットからインターネットを経由せずにKinesisに対してAPIコールを実行する手順を掲載します。
PrivateLinkって何?
PrivateLinkとは「AWSへのAPIアクセスをインターネットを経由せずに行えるインターフェースタイプのVPCエンドポイント」です。
PrivateLinkを使うことでインターネットに出る必要がなくなるため「IGW、NATデバイス、VPNコネクション、パブリックIP」の導入・設定が不要になり、環境設計が必要なコンポーネントを減らすことができます。また、セキュリティ要件の厳しいシステムやクローズドな環境での稼動が必須となるシステムをAWS上に構築する際に役立ちます。
そもそもVPCエンドポイントって何?
さきほどのPrivateLinkの説明の中で、「PrivateLinkはインターフェースタイプのVPCエンドポイント」と書きましたが、そもそもVPCエンドポイントとは何でしょうか。
VPCエンドポイントとは、VPCと他のサービス間の通信を可能にするVPCコンポーネントで、その実態は仮想デバイスです。VPCエンドポイントをVPCに作成することで、VPC内のインスタンスとVPC外のサービスとで通信ができるようになります。(詳細はVPCエンドポイントのガイドを参照してください。)
VPCエンドポイントは下記の2つのタイプが提供されています。
- インターフェースタイプ
- PrivateLinkと呼んでいる
- 実態はプライベートアドレスをもつENI
- ゲートウェイタイプ
- ルートテーブルで送信先に対するターゲットとして指定する
二つのタイプのVPCエンドポイントを使用した構成例を下図に示します。タイプによって、インスタンスとサービス間での通信経路が異なります。
ゲートウェイタイプを使用する場合はルーティング設定が必要です。図に示したルートテーブルにあるように、Destinationとして「使用するサービスのエンドポイント(この場合は東京リージョンのS3のpl-id(プレフィックスリストID))」、Targetとして「作成したVPCエンドポイントのID(vpce-id)」を指定します。このルートを設定することでVPC内部からVPC外のサービスへの通信ができるようになります。
タイプによる違いを整理:ゲートウェイとインターフェース
ゲートウェイタイプとインターフェースタイプで異なる制限を下表に整理します。
項目 | ゲートウェイ | インターフェース |
---|---|---|
対応サービス | S3とDynamoDBのみ | S3、DynamoDBを除いたAWSプリンシパルサービス、 独自サービス、マーケットプレイスサービス (詳細は「カテゴリとサービス一覧」の節を参照) |
NACL | アウトバウンドルールでプレフィックスリスト ID を指定して アウトバウンドトラフィックを制御することはできない | エンドポイントを作成したサブネットの CIDR ブロックに 出入りするトラフィックを許可する適切なルールを追加する |
セキュリティグループ | エンドポイントにアクセスするインスタンスの アウトバウンドルールにpl-idを指定することで制御 | VPCエンドポイント自体にセキュリティグループを関連付けて、 イン/アウトを制御可能 |
接続の延長 | VPN、VPCピアリング、AWS Direct Connect接続を 通じたアクセスは不可 | AWS Direct Connect接続を通じたアクセスが可能 (VPN接続、VPCピアリング接続は不可) |
作成単位 | VPC単位 サブネット単位 | |
ポリシー | 設定可能 デフォルトではすべてのリソースへのフルアクセスが 許可されている | 設定不可(サポートされてない) フルアクセスが許可されている状態から変更できない |
帯域 | 記載無し | 10Gbps |
トラフィック | IPv4のみ | TCP IPv4のみ |
クロスリージョン | 不可 | 不可 |
タグ | 使用不可 | 使用不可 |
数の上限[/VPC] | 20(255まで引き上げ可能) | 20(上限引き上げには対応していない) |
カテゴリとサービス一覧
タイプによって利用できるカテゴリとサービスが異なりますので、それぞれ利用できるものを整理します。
カテゴリ一覧
まずはカテゴリの一覧です。2018年5月時点で利用できるカテゴリは下表のとおりです。
カテゴリ名 | サービスの内容 | 対応しているタイプ |
---|---|---|
AWSサービス | AWSプリンシパルサービス | Gateway,Interface |
サービスを名前で検索 | 独自サービス(VPCエンドポイントサービス) | Interface |
ご使用のAWSマーケットプレイスサービス | マーケットプレイスサービス | Interface |
サービス一覧
つぎは各カテゴリで利用可能なサービスについて整理します。
AWSサービス
まず1つめの「AWSサービス」カテゴリでは、AWSプリンシパルなサービスが提供するエンドポイントを選択できます。
下表に、現時点で提供されているサービスと対応するエンドポイントタイプ、エンドポイントをまとめています。
サービス※ | タイプ | エンドポイント | 更新日 |
---|---|---|---|
CLoudWatch Logs | Interface | com.amazonaws.ap-northeast-1.logs | 201711 |
DynamoDB | Gateway | com.amazonaws.ap-northeast-1.dynamodb | |
EC2 API | Interface | com.amazonaws.ap-northeast-1.ec2 | 201711 |
ELB API | Interface | com.amazonaws.ap-northeast-1.elasticloadbalancing | 201711 |
Kinesis Date Streams | Interface | com.amazonaws.ap-northeast-1.kinesis-streams | 201711 |
KMS | Interface | com.amazonaws.ap-northeast-1.kms | 201801 |
S3 | Gateway | com.amazonaws.ap-northeast-1.s3 | |
Service Catalog | Interface | com.amazonaws.ap-northeast-1.servicecatalog | 201711 |
SNS | Interface | com.amazonaws.ap-northeast-1.sns | 201804 |
Systems Manager | Interface | com.amazonaws.ap-northeast-1.ec2messages | 201711 |
Systems Manager | Interface | com.amazonaws.ap-northeast-1.ssm | 201711 |
※ ”amazon”、”aws”という語は省略してサービス名順に並べています
昨年11月のre:invent 2017で紹介されたサービスや、2018年になって新たに追加されたサービスも記載しています。いずれも東京リージョンで利用可能なサービスです。VPCエンドポイントに対応するサービスはどんどん追加されていきますので、VPCエンドポイントを使用する際にはその時点でどのサービスが利用可能なのかを確認するようにしましょう。
なお、公式のVPCエンドポイントのガイドに掲載されているサービス一覧表は最新の状態にアップデートされていないため、2018年5月時点ではこちらの表に記載の内容が正しいです。ご注意ください。
独自サービス
2つめは「独自サービス(VPCエンドポイントサービス)」です。
マネジメントコンソールでは「サービスを名前で検索」というカテゴリで表示されています。インターフェイスタイプのエンドポイントが利用可能なカテゴリです。
独自に作成したサービスをVPCエンドポイントサービスとして公開し、AWSネットワークに閉じて利用することができます。利用するにはNLBの作成が必須です。
独自サービスを利用するために図に示したように3つのステップで設定していきます。①独自アプリケーションの前段にNLBを配置して、②NLBを指定してVPCエンドポイントサービスを作成します(例:com.amazonaws.vpce.ap-northeast-1.vpce-svc-xxxxxxxxx)。③そのVPCエンドポイントサービスに接続するインターフェースVPCエンドポイントを作成します。エンドポイントサービスの作成にはNLBの関連付けが必須となりますのでご注意ください。
図に示したように、PrivateLinkとNLBのVPCエンドポイントサービスを使用することで異なるVPC間の通信が可能になります。となると、VPCピアリングとの使い分けについても気になると思いますがそちらについては「VPCピアリングとの違い」の節でまとめていますので参考にしてください。
マーケットプレイスサービス
3つめはマーケットプレイスサービスです。
マネジメントコンソールでは「ご使用のAWSマーケットプレイスサービス」として表示されています。このカテゴリは2017年11月に追加されたカテゴリです。AWSマーケットプレイスが提供するサービスを利用できます。対応するタイプはインターフェイスタイプのみです。マーケットプレイスでSaaSとして提供されているサービスに対してVPCエンドポイントを作成することで、インターネットを介さずにSaaSを利用することができます。
2018年5月時点で利用可能なVPCエンドポイント対応のマーケットプレイスサービスは下表のとおりです。
販売者 | 製品 |
---|---|
Aqua Security | Aqua Container Image Security Scanner |
CA Networks | CA App Experience Analytics Essentials |
Cisco | Cisco Stealthwatch Cloud | Public Cloud Monitoring |
Dynatrace | Cloud Native Monitoring powred by AI |
SigOpt | SigOpt |
セキュリティ関連のSaaSが利用可能になっているようです。こちらも随時対応サービスが拡張されていくと思いますので、VPCエンドポイントを使用したSaaS利用を検討している方はチェックしておきましょう!
VPCピアリングとの違い
独自アプリケーションのVPCエンドポイントサービスを作成することができるようになり、異なるVPC間での通信が可能になりました。「異なるVPC間での通信」という観点で、PrivateLink機能を利用するべきか、VPCピアリングを利用するべきかを検討する際の参考情報として下表に機能の違いを整理しました。
機能 | VPCピアリング | VPCエンドポイントサービス (PrivateLink) |
---|---|---|
実装方法 | リクエスタVPCからアクセプタVPCへ接続リクエストを作成。 アクセプタ側で承認を行う。 アクセプタVPCのセグメント、ピアリングIDをルートテーブルに設定する | NLBのVPCエンドポイントサービスに対して インターフェースVPCエンドポイントを作成する。 |
接続範囲 | VPC単位で接続後、ルーティング/NACL/SGなどによる設定で 接続可能な範囲を限定する | 特定のNLBを指定するので、そのNLBのターゲットグループとして 登録されているインスタンス(IF)のみ接続対象となる |
ルーティング | VPN 接続または AWS Direct Connect 接続経由のルーティングは不可 | AWS Direct Connect 接続経由のルーティングは可能 |
承認/承諾 | アクセプタVPC所有者の承認が必須 | エンドピポイントサービス側でエンドポイント接続の承諾を行う。 承諾の要否はエンドポイントサービスの作成時に選択ができる |
クロスアカウント | 可能 | 可能 |
クロスリージョン | 可能 | 不可能 |
トラフィック | IPv4/IPv6 | TCP 経由の IPv4のみ |
CIDR | IPv4/IPv6 CIDR ブロックが一致または重複する VPC 間で VPC ピアリング接続を作成することはできない | 重複していても接続可能 |
上限 | 50(制限緩和後の上限は125) | 20(上限引き上げ不可) |
接続数 | 特定のVPC間で1つのピアリング接続 | 複数接続可能 |
タグ | 使用可能 | 使用不可 |
ユースケース
上記の比較を受けて、PrivateLinkはどのような状況で使用するべきでしょうか。
独自のサービスにクローズドな環境で通信をしたい場合はPrivateLinkが適しているかもしれません。また、そのサービスがマーケットプレイスでエンドポイントサービスとして提供されているものである場合はPrivateLinkを選択しましょう。
Direct Connect接続経由のエッジツーエッジルーティングを実現したい場合は、VPCピアリング接続では実現できないのでPrivarteLinkを選択する必要があります。
VPCのCIDRブロックが重複している場合も、VPCピアリング接続での実現ができないのでPrivateLinkを使用します。すでに存在するVPC同士を接続する場合は、CIDRブロックを確認してVPCピアリング接続が可能かどうかを確認しましょう。
現在のネットワーク構成やセキュリティ要件、通信要件からはVPCピアリングとPrivateLinkのどちらを使用しても大差ないという状況であれば、設計・構築・運用の作業の大変さ、という観点でどちらがいいかを検討するのもよいでしょう。
VPCピアリングを使用する場合は、ルートテーブル/NACL/SGでアクセスを限定していくので詳細な制御ができる反面、設計や構築作業、構築後のメンテナンスが複雑になってしまうかもしれません。PrivateLinkを使用することで通信経路が可視化され構成図がシンプルになる可能性もあります。現行の運用方法に即して選択することをおすすめします。
PrivateLinkを使ってみる
実際にPrivateLinkを使ってみます。今回は下図のような簡易な構成を作成していきます。
プライベートサブネット内のインスタンスからインターネットを経由しないでKinesisのエンドポイントにAPIアクセスをしてみます。
PrivateLinkの作成
VPCサービスから「エンドポイント > エンドポイントの作成」と選択します。
サービスカテゴリは「AWSサービス」を選択します。
表示されたサービス名の一覧から「Kinesis-streams」サービスを選択します。(東京リージョンで作業をしているので、com.amazonaws.ap-northeast-1.kinesis-streamsと表示されています)
つづいて、VPC、AZ、プライベートDNS設定、セキュリティグループを選択していきます。
VPCをプルダウンから選択すると利用可能なAZとサブネットが表示されるので、VPCエンドポイントを作成するサブネットを選択します。
プライベートサブネット内のインスタンスから、AWS CLI によってVPCエンドポイントに対してHTTPS で API コールを実行します。そのため、VPCエンドポイントのセキュリティグループには、TCP ポート 443 でのインバウンド接続のみ有効にしたルールを設定します。
セキュリティグループのインバウンドルール
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
カスタム TCP ルール | TCP | 443 | 0.0.0.0/0 |
カスタム TCP ルール | TCP | 443 | ::/0 |
すべての項目を設定して「エンドポイントの作成」をクリックし、エンドポイント作成の完了です。
コンソールでエンドポイント画面を見ると先ほど作成したVPCエンドポイントが表示されています。
詳細情報欄にはDNS名として「サービスデフォルトのDNSホスト名」と「エンドポイント固有のDNSホスト名」の2種類のDNSホスト名が表示されています。
表示されているDNSホスト名のどちらを使用するかは、プライベートDNSの設定〔有効/無効〕によって変わってきます。下表に示すように、プライベートDNSの設定値によって、各DNSホスト名を指定した場合の経路が変わります。
有効 | 無効 | |||
---|---|---|---|---|
デフォルトDNSホスト名を指定 | エンドポイント固有DNSホスト名を指定 | デフォルトDNSホスト名を指定 | エンドポイント固有DNSホスト名を指定 | |
パブリックから | VPCエンドポイント経由 | VPCエンドポイント経由 | インターネット経由 | VPCエンドポイント経由 |
プライベートから | VPCエンドポイント経由 | VPCエンドポイント経由 | 疎通不可 | VPCエンドポイント経由 |
プライベートDNSを有効にした場合はどちらのDNSホスト名を指定してもVPCエンドポイントを経由します。つまり、パブリックサブネット上のインスタンスがサービスデフォルトのDNSホスト名を指定した場合でもインターネットを経由せずにAPIアクセスをすることができます。
プライベートDNSを無効にした場合は、どこからアクセスするかによってインターネットを経由するか、そもそも疎通ができない、VPCエンドポイントを経由する、というように結果が異なってきますので注意が必要です。
プライベートDNSを有効にする場合はVPC 属性のenableDnsHostnames およびenableDnsSupport を true に設定する必要がありますので、設定を変更する際は「VPCのDNSサポートを更新する」を参照して作業を行ってください。
PrivateLink経由でKinesisにAPIアクセスをしてみる
プライベートサブネット内のインスタンスからさきほど作成したPrivateLinkを経由して、Kinesisに対してAPIコールを実行してみます。
準備
パブリックサブネットに踏み台サーバを設置し、踏み台サーバからプライベートサブネット内のインスタンスサーバへログインします。ログインしたサーバでaws configureを行い、AWS CLIコマンドを実行する環境を整備します。(手順は割愛します)
プライベートサブネット内のインスタンスでAWS CLIコマンドを実行する準備ができましたので、Kinesisに対して基本的なストリームオペレーションを実行していきます。
ストリームの表示
まず、現時点で存在するストリームを表示してみます。–endpoint-url オプションでVPCエンドポイント固有DNSホスト名を指定します。
今の時点ではストリームは何も作成されていません。
$ aws kinesis list-streams --endpoint-url https://vpce-xxxxxxxxxxxxxxxxxx-xxxxxxxx.kinesis.ap-northeast-1.vpce.amazonaws.com
{
"StreamNames": []
}
ストリームの作成
つぎに、create-streamコマンドを実行してFooストリームを作成します。さきほどと同じように–endpoint-url にエンドポイント固有のDNSホスト名を指定しています。
create-streamコマンドを実行後に結果を確認すると、FooストリームのStreamStatusがACTIVEになっていることからストリームを使用する準備ができたことがわかります。また、今回リクエストした単一のシャードに関する情報が表示されています。
$ aws kinesis create-stream --stream-name Foo --shard-count 1 --endpoint-url https://vpce-xxxxxxxxxxxxxxxxxx-xxxxxxxx.kinesis.ap-northeast-1.vpce.amazonaws.com
$ aws kinesis describe-stream --stream-name Foo --endpoint-url https://vpce-xxxxxxxxxxxxxxxxxx-xxxxxxxx.kinesis.ap-northeast-1.vpce.amazonaws.com
{
"StreamDescription": {
"KeyId": null,
"EncryptionType": "NONE",
"StreamStatus": "ACTIVE",
"StreamName": "Foo",
"Shards": [
{
"ShardId": "shardId-000000000000",
"HashKeyRange": {
"EndingHashKey": "340282366920938463463374607431768211455",
"StartingHashKey": "0"
},
"SequenceNumberRange": {
"StartingSequenceNumber": "49584239740445610367505881482844466786565739057732648962"
}
}
],
"StreamARN": "arn:aws:kinesis:ap-northeast-1:xxxxxxxxxxxx:stream/Foo",
"EnhancedMonitoring": [
{
"ShardLevelMetrics": []
}
],
"StreamCreationTimestamp": 1525684537.0,
"RetentionPeriodHours": 24
}
}
ストリームの存在確認
list-streams コマンドを使用してストリームを表示すると、先ほど作成したFooストリームが存在することが確認できました。
$ aws kinesis list-streams --endpoint-url https://vpce-xxxxxxxxxxxxxxxxxx-xxxxxxxx.kinesis.ap-northeast-1.vpce.amazonaws.com
{
"StreamNames": [
"Foo"
]
}
つづいて、コンソール画面でKinesisのダッシュボードの状態を確認してみます。こちらにも先ほど作成したFooストリームが表示されています。
プライベートサブネット内のインスタンスからKinesisに対してAPIコールを実行できました。
補足
今回はプライベートDNSを「有効」にしているので、VPCエンドポイント固有のDNSホスト名ではなくサービスデフォルトのDNSホスト名を指定しても同じ結果が得られます。
デフォルトのDNSホスト名で解決されるので、–endpoint-url を指定しなくてもさきほどと同じ結果が得られます。
$ aws kinesis list-streams
{
"StreamNames": [
"Foo"
]
}
あるいは、–endpoint-url にデフォルトのDNSホスト名を指定しても同様の結果となります。
$ aws kinesis list-streams --endpoint-url https://kinesis.ap-northeast-1.amazonaws.com
{
"StreamNames": [
"Foo"
]
}
プライベートサブネット内のインスタンスから他のサービスに対してAPIコールを実行できないことも確認してみます。
今回はKinesisを利用するエンドポイントのみを作成しているので、他のサービスに対してAPIコールを実行してもアクセスはできないはずです。
試しにEC2に対してAPIコールを実行してみるとタイムアウトエラーで終了しました。EC2用のVPCエンドポイントを作成していないので接続できないことが確認できました。
$ aws ec2 describe-vpc-endpoints
HTTPSConnectionPool(host='ec2.ap-northeast-1.amazonaws.com', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<botocore.awsrequest.AWSHTTPSConnection object at 0x7f844cee0d10>, 'Connection to ec2.ap-northeast-1.amazonaws.com timed out. (connect timeout=60)'))
まとめ
PrivateLinkを利用する際の情報を整理し、実際にプライベートサブネット内のインスタンスからKinesisに対してインターネットを経由することなくAPIコールを実行できることを確認しました。
VPCエンドポイントとは
VPCと他のサービス間の通信を可能にするVPCコンポーネント(仮想デバイス)です。VPCエンドポイントをVPCに作成することで、VPC内のインスタンスとVPC外のサービスの間で通信ができるようになります。
VPCエンドポイントには2つのタイプがある
VPCエンドポイントにはインターフェイスとゲートウェイタイプの2種類があります。タイプによって制限や利用可能なサービスが異なるので利用したいサービスに対応しているエンドポイントのタイプと、タイプの制限を確認しましょう。
VPCエンドポイントのサービス内容は日々エンハンスされていくので、現時点でどのサービスが利用可能なのかを事前に確認しましょう。
VPCピアリングとの使い分け
PrivateLinkのユースケースを検討する際にはVPCピアリングとどう使い分けるのかが問題になると思います。両VPCのネットワーク構成や利用用途、あるいは現行の運用方法などを考慮してVPCピアリングとPrivateLinkのどちらを利用するのが適切であるかを検討しましょう。