VPCにあるAmazon Elasticsearch ServiceにALBを追加してKibanaだけPublicにする
ども、大瀧です。
先日Amazon ESがVPCに対応し、アクセス制限のバリエーションが大幅に増えました。設定する様子は以下の記事を参照ください。
Amazon ESでは、以下のような使い分けをしたくなることがあると思います。
- APサーバーからElasticsearch APIでのデータ投入およびクエリ発行
- 管理者マシンからKibanaでのデータ分析
ESのみの機能ではElasticsearch APIとKibanaを区別するアクセス制限ができないことから、今回はパスルーティングが設定できるALB(Application Load Balancer)を追加して上記の使い分けを実現してみました。構成図にすると以下になります。
KibanaをEC2インスタンスでサービスする構成もあります。以下のブログ記事を参考にしてください。
VPCにあるAmazon Elasticsearch ServiceのKibanaだけPublicにするもう一つの方法 | Developers.IO
1. ESドメインの構成
ESドメインは、ネットワーク構成を「VPCアクセス」にしておきましょう。セキュリティグループはAPサーバーとALBからのTCP80番やTCP443番を許可しておきましょう。
ESドメインをALBのターゲットとするためには、インスタンス単位ではなくPrivate IP単位でターゲットグループに登録する必要があります。ESドメインのPrivate IPはEC2管理画面の[ネットワークインターフェース]一覧から、[説明]がES <ドメイン名>
のもので確認できます。
2. ALBの構成
ALBではKibanaのパスのみESドメインに向くよう、パスルールを調整します。以下で設定してみました。
- デフォルトパスが必須なので、ちょっとかっこ悪いですが登録インスタンスが0のダミー用ターゲットグループ
tg0
を作成 - Kibanaで使用するパス(
/_plugin/kibana/*
と/_plugin/kibana/app/kibana/*
)をESドメインを登録するターゲットグループtg
に設定
ターゲットグループtg
のターゲットには、以下のように先ほどのPrivate IPアドレスを指定します。
これでOKです。
3. 動作確認
では、ALBのDNS名にブラウザからアクセスしてみます。まずは/
(ルートパス)から。
こちらはダミーのターゲットグループを向くので、健全なインスタンスが無いことから503エラーが返ってくる想定した動作です。
続いて/_plugin/kibana/
(Kibanaのパス)にアクセスすると...
Kibanaの初期画面が表示されました!
留意事項
- Kibanaの全ての動作を確認したわけではないので、パスが不足していると正常に動作しないことがあります。適宜パスルーティングのルールを調整してください。
- ALBのリスナに紐付くセキュリティグループで、Kibanaへのアクセスを許可するIPアドレスを絞っても良いでしょう。
- ALBではHTTPリスナの他に、HTTPSリスナを構成することも多分できます(未検証)。ACMの証明書と組み合わせるのも良いでしょう。
- ESドメインに紐付くENI数はドキュメントにあるとおり、クラスタのノード数に1.5(ゾーン対応がオフの場合は3)をかけた数で結構多めに取られます。
- ESのPrivate IPは可変なので、定期的にALBのターゲットとなるPrivate IPをメンテナンスする必要があります。CloudWatch EventsのスケジュールからのLambdaの実行やEC2でのcronジョブなどを検討しましょう。AWS CLIでは、以下のようにPrivate IP一覧を取得できます。
$ aws ec2 describe-network-interfaces \ --query 'NetworkInterfaces[?Description==`ES vpctest`].PrivateIpAddress' [ "172.31.23.124", "172.31.25.149", "172.31.17.84" ]
ALBのターゲットグループのIPアドレス一覧は、AWS CLIの以下のコマンドで取れます。
$ aws elbv2 describe-target-health \ --target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/tg/XXXXXXXXXXXX \ --query 'TargetHealthDescriptions[].Target.Id' [ "172.31.17.84", "172.31.23.124", "172.31.25.149" ]
まとめ
VPCに配置したAmazon ESドメインにALBを追加し、インターネットからKibanaにアクセスする構成をご紹介しました。