Elastic Cloudへプライベート接続を試してみた #elastic #AWS

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
皆様、ご存知でしょうか?
7月15日にElastic社のパブリッククラウドサービスであるElastic Cloudにおいて
AWSのVPCからプライベート接続できるようになったことを。

遡ること3年前、同じIaaS上にあるElastic Cloudに対して
AWS VPCからプライベート接続できるようにして欲しいと要望を上げてきました。
待ちきれず、Amazon Elasticsearch Serviceを使ってしまったり
EC2でElastic Stackを何度構築してしまったことか。。
本記事は、以下の公式ブログ(英語)の内容をもとに「やってみた」的な
内容になっています。あまりお金もかけずに検証できますので、是非試してみてください^^
【参考】
・New on Elastic Cloud: AWS PrivateLink and IP filtering
利用環境
| product | version |
|---|---|
| Elastic Cloud | 7.8.0 |
| OS(EC2) | Amazon Linux2 (t3.micro) |
| Region | us-west-2 (Oregon) |
※投稿時点における最新版を採用しています。
【構成図】

前提
- AWSリージョンおよびElastic CloudのDeployment構成はコスト観点で選択しています。
- VPCとサブネットは、AWSアカウント作成時のデフォルトVPCを利用しています。
- Elastic Cloud環境は、接続するAWSのVPC環境と同じリージョン(今回は、us-west-2)にしておく必要があります。
- Elastic CloudとAWS VPCはAWSサービスのPrivateLink(インターフェースVPCエンドポイント)を利用します。
- VPC側からElastic Cloudにアクセスするには、VPCエンドポイントのDNS名をRoute53のプライベートホストゾーンにCNAME登録する必要があります。(VPCエンドポイントのDNS名ではAPIがはじかれます)
【参考】
・インターフェイス VPCエンドポイント
・プライベートホストゾーンの使用
実施内容
- 公式ドキュメントに則り、以下の手順で実施しています。
- VPCエンドポイント作成 (AWS)
- セキュリティグループ作成 (AWS)
- Route53ホストゾーン作成 (AWS)
- Traffic filters作成 (Elastic Cloud)
- Deployment作成 (Elastic Cloud)
- 接続テスト
【参考】
・Set up Elasticsearch Service Private
1. VPCエンドポイント作成 (AWS)
1-1. まずは、AWSマネージメントコンソールにログインします。
1-2. リージョンを米国西部(オレゴン) us-west-2に切り替えます。
1-3. [VPC] > [エンドポイント]でエンドポイントの作成をクリックします。
【VPCエンドポイント】
| 項目 | 値 |
|---|---|
| サービスカテゴリ | サービスを名前で検索 |
| サービス名 | com.amazonaws.vpce.us-west-2.vpce-svc-0e69febae1fb91870 |
| VPC | vpc-46131d22(各自VPCIDを指定) |
| サブネット | us-west-2a、us-west-2b、us-west-2c |
| プライベートDNS名を有効にする | [サービスでサポートされていません] |
| セキュリティグループ | 新規セキュリティグループを作成(別途後述します) |
| タグ(任意) | キー: Name、値: To-ElasticCloud(任意) |
※サービス名は、利用するリージョンによって異なります。(詳細は、PrivateLink traffic filters参照)
※今回は3つのAZを利用していますが、AZ障害を考慮しない場合は1つでも問題ありません。
1-4. 上記内容で作成すればOKです。

1-5. 以下の①エンドポイントIDと②DNS名は、このあとで利用しますので、メモしておきましょう。

2. セキュリティグループ作成 (AWS)
2-1. 手順1で作成したVPCエンドポイント用のセキュリティグループの内容は以下の通りとなります。
【VPCエンドポイント用セキュリティグループ】
| IN/OUT | タイプ | プロトコル | ポート範囲 | ソース | 説明(任意) |
|---|---|---|---|---|---|
| IN | HTTPS | [TCP] | [443] | 任意の場所(0.0.0.0/0) | To-ElasticCloud |
| OUT | すべてのトラフィック | [すべて] | [すべて] | 任意の場所(0.0.0.0/0) | デフォルトのまま |
※インバウンドルールでHTTPSを許可します。
※ソースは、Elastic CloudにアクセスするEC2に限定することを推奨します。
3. Route53ホストゾーン作成 (AWS)
3-1. [Route53] > [ホストゾーン]でホストゾーンの作成をクリックします。
【ホストゾーン】
| 項目 | 値 |
|---|---|
| ドメイン名 | aws.elastic-cloud.com |
| コメント(任意) | 空白 |
| タイプ | Amazon VPCのプライベートホストゾーン |
| VPC ID | vcp-46131d22(各自VPCIDを指定) |
※ドメイン名は、PrivateLink traffic filtersのRegional aliasを参考にしてください。
※タイプは、VPC内のEC2が参照するため、プライベートホストゾーンとします。
3-2. 次に作成したホストゾーンにおいて、CNAMEレコードを作成します。
3-3. レコードセットの作成をクリックします。
【レコードセット】
| 項目 | 値 |
|---|---|
| 名前 | *.vpce.us-west-2 |
| タイプ | CNAME-正規名 |
| エイリアス | いいえ |
| TTL(秒) | 300 |
| 値 | vpce-0d629ed990784b16f-7kk1w15c.vpce-svc-0e69febae1fb91870.us-west-2.vpce.amazonaws.com |
| ルーティングポリシー | シンプル |
※名前は、PrivateLink traffic filtersのRegional aliasを参考にしてください。
※値は、手順1-5の②DNS名となります。
3-4. レコードセットの保存をクリックして完了です。

4. Traffic filters作成 (Elastic Cloud)
4-1. ここからは、Elastic Cloudにログインします。
4-2. [Account] > [Traffic filters]でCreate filterをクリックします。

4-3. まずは、PrivateLink用のTraffic Filterを作成します。
【Traffic Filter(PrivateLink用)】
| 項目 | 値 |
|---|---|
| Fiter type | Private link endpoint |
| Name | test-vcp-us-west-2 (任意) |
| Description(任意) | 空白 |
| Region | us-west-2 |
| Endpoint ID | vpce-0d629ed990784b16f |
| Add to deployments | □ Include by default |
※Endpoint IDは、手順1-5の①エンドポイントIDとなります。
4-4. 次にパブリック経由でKibanaにアクセスするためのTraffic Filterを作成します。
【Traffic Filter(IP filtering用)】
| 項目 | 値 |
|---|---|
| Fiter type | IP filtering rule set |
| Name | MyOffice (任意) |
| Description(任意) | 空白 |
| Region | us-west-2 |
| Rules Source | |
| Add to deployments | □ Include by default |
【参考】
・Traffic Filtering
・IP traffic filters
・PrivateLink traffic filters
5. Deployment作成 (Elastic Cloud)
5-1. 最後にElasticsearch ClusterとKibanaをデプロイします。
5-2. [Deployments]でCreate deploymentをクリックします。
【Deployment】
| 項目 | 値 |
|---|---|
| Name your Deployment | dev-pri-ec01 |
| Select a cloud platform | Amazon Web Services |
| Select a region | US West (Oregon) |
| Elastic Stack version | 7.8.0 |
| Select a deployment to restore from one of its snapshots | □ |
| Enable monitoring by shipping metrics to a deployment | □ |
| Enable traffic filtering | ☑︎ |
| Traffic filters | test-vac-us-west-2 (Private link endpoint) |
| Optimize your deployment | I/O Optimized |
※まずは、PrivateLink用のTraffic filtersのみセットします。(接続テストのため)

6. 接続テスト
6-1. デプロイされたElasticsearchのCopy endpointをクリックします。
(https://[DEPLOYMENT ID].us-west-2.aws.found.io:9243がendpointになります)

6-2. EC2(test-vm01)にてnslookupコマンドで[DEPLOYMET ID].vpce.us-west-2.aws.elastic-cloud.comの名前解決を実施します。(1ad00dced6774d9aa343279580a77633が[DEPLOYMENT ID]です。)
sh-4.2$ nslookup > 1ad00dced6774d9aa343279580a77633.vpce.us-west-2.aws.elastic-cloud.com Server: 172.31.0.2 Address: 172.31.0.2#53</p> <p>Non-authoritative answer: 1ad00dced6774d9aa343279580a77633.vpce.us-west-2.aws.elastic-cloud.com canonical name = vpce-0d629ed990784b16f-7kk1w15c.vpce-svc-0e69febae1fb91870.us-west-2.vpce.amazonaws.com. Name: vpce-0d629ed990784b16f-7kk1w15c.vpce-svc-0e69febae1fb91870.us-west-2.vpce.amazonaws.com Address: 172.31.33.118 Name: vpce-0d629ed990784b16f-7kk1w15c.vpce-svc-0e69febae1fb91870.us-west-2.vpce.amazonaws.com Address: 172.31.29.85 Name: vpce-0d629ed990784b16f-7kk1w15c.vpce-svc-0e69febae1fb91870.us-west-2.vpce.amazonaws.com Address: 172.31.10.108
6-3. 上記のようにVPCエンドポイントのDNS名が返ってくればOKです。
6-4. 次は、同じEC2(test-vm01)からcurlコマンドでElasticsearchにAPIを投げます。
sh-4.2$ curl -u elastic: -XGET https://1ad00dced6774d9aa343279580a77633.vpce.us-west-2.aws.elastic-cloud.com
{
"name" : "instance-0000000001",
"cluster_name" : "1ad00dced6774d9aa343279580a77633",
"cluster_uuid" : "D9hQ276ATB-b_NY2bp51hA",
"version" : {
"number" : "7.8.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "757314695644ea9a1dc2fecd26d1a43856725e65",
"build_date" : "2020-06-14T19:35:50.234439Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
6-5. 上記のようにElasticsearchのノード情報が返ってくればOKです。これでプライベート接続されていることが確認できました。
6-6. この状態で自PCからパブリック経由でKibanaにブラウザアクセスしてみます。
(KibanaのURLもKibanaのCopy endpointで取得します)

6-7. すべての通信がPrivateLink経由しか受け付けない状態となっているため、失敗します。
6-8. 手順4-4で作成したIP filtering用Traffic filterをDeploymentに適用します。
([Deployment] > [dev-pri-ec01] >[Security] > [Traffic filters])

6-9. これで許可されたIPアドレスからKibanaもアクセスができ、VPC内からElasticsearchにAPIアクセスもできるようになりました。

いかがでしたでしょうか?
これまでTLS化されていたとはいえ、LogstashやBeatsからパブリック経由でのデータ取り込みに不安があった
という方は多いのではないでしょうか。
また、IPフィルタ機能も実装されたことでIPアドレスをオフィスのみに制御できることも嬉しいポイントですよね。
ぜひ、皆様も試してみてください!!
