VPCにあるAmazon Elasticsearch ServiceにALBを追加してKibanaだけPublicにする

ども、大瀧です。
先日Amazon ESがVPCに対応し、アクセス制限のバリエーションが大幅に増えました。設定する様子は以下の記事を参照ください。

Amazon ESでは、以下のような使い分けをしたくなることがあると思います。

  • APサーバーからElasticsearch APIでのデータ投入およびクエリ発行
  • 管理者マシンからKibanaでのデータ分析

ESのみの機能ではElasticsearch APIとKibanaを区別するアクセス制限ができないことから、今回はパスルーティングが設定できるALB(Application Load Balancer)を追加して上記の使い分けを実現してみました。構成図にすると以下になります。

esvpc-alb02

KibanaをEC2インスタンスでサービスする構成もあります。以下のブログ記事を参考にしてください。
VPCにあるAmazon Elasticsearch ServiceのKibanaだけPublicにするもう一つの方法 | Developers.IO

1. ESドメインの構成

ESドメインは、ネットワーク構成を「VPCアクセス」にしておきましょう。セキュリティグループはAPサーバーとALBからのTCP80番やTCP443番を許可しておきましょう。

esvpc-alb03

ESドメインをALBのターゲットとするためには、インスタンス単位ではなくPrivate IP単位でターゲットグループに登録する必要があります。ESドメインのPrivate IPはEC2管理画面の[ネットワークインターフェース]一覧から、[説明]がES <ドメイン名>のもので確認できます。

esvpc-alb01

2. ALBの構成

ALBではKibanaのパスのみESドメインに向くよう、パスルールを調整します。以下で設定してみました。

  • デフォルトパスが必須なので、ちょっとかっこ悪いですが登録インスタンスが0のダミー用ターゲットグループtg0を作成
  • Kibanaで使用するパス(/_plugin/kibana/*/_plugin/kibana/app/kibana/*)をESドメインを登録するターゲットグループtgに設定

esvpc-alb04

ターゲットグループtgのターゲットには、以下のように先ほどのPrivate IPアドレスを指定します。

esvpc-alb05

これでOKです。

3. 動作確認

では、ALBのDNS名にブラウザからアクセスしてみます。まずは/(ルートパス)から。

esvpc-alb06

こちらはダミーのターゲットグループを向くので、健全なインスタンスが無いことから503エラーが返ってくる想定した動作です。

続いて/_plugin/kibana/(Kibanaのパス)にアクセスすると...

esvpc-alb08

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にアクセスする構成をご紹介しました。