fbpx

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

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

New call-to-action

皆様、ご存知でしょうか?
7月15日にElastic社のパブリッククラウドサービスであるElastic Cloudにおいて
AWSのVPCからプライベート接続できるようになったことを。
image.png

遡ること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)

※投稿時点における最新版を採用しています。

【構成図】
image.png

前提


  • 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エンドポイント
プライベートホストゾーンの使用

実施内容


  • 公式ドキュメントに則り、以下の手順で実施しています。
  1. VPCエンドポイント作成 (AWS)
  2. セキュリティグループ作成 (AWS)
  3. Route53ホストゾーン作成 (AWS)
  4. Traffic filters作成 (Elastic Cloud)
  5. Deployment作成 (Elastic Cloud)
  6. 接続テスト

【参考】
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です。
image.png

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

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 filtersRegional 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 filtersRegional aliasを参考にしてください。
※値は、手順1-5の②DNS名となります。

3-4. レコードセットの保存をクリックして完了です。
image.png

4. Traffic filters作成 (Elastic Cloud)

4-1. ここからは、Elastic Cloudにログインします。
4-2. [Account] > [Traffic filters]でCreate filterをクリックします。
image.png
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のみセットします。(接続テストのため)
image.png

6. 接続テスト

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

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で取得します)
image.png

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

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

いかがでしたでしょうか?
これまでTLS化されていたとはいえ、LogstashやBeatsからパブリック経由でのデータ取り込みに不安があった
という方は多いのではないでしょうか。

また、IPフィルタ機能も実装されたことでIPアドレスをオフィスのみに制御できることも嬉しいポイントですよね。
ぜひ、皆様も試してみてください!!

Author

ログ分析基盤のアーキテクチャデザインやクラウドにおけるセキュリティ実装方式を研究するElasticエバンジェリスト。
国内エンジニアの貴重なリソースを効率良く活用できるよう、技術ナレッジを惜しみなく発信するよう心がけている。

日比野恒の記事一覧

新規CTA