概要
Snapmartの検索サーバーはAmazon Elasticsearch Service(以下ESS)で運用しているのですが、Kibanaを使ってデータ分析をしたくなりました。
ESSはVPC内にあるため、アプリケーションサーバーからElasticsearch APIで検索実行は問題なく行えますが、 管理者PCからKibanaのエンドポイントへのアクセスはできません。
そのため、ESSの前段にALBを配置してアクセスする必要があります。 設定は以下の記事を参考にしました。 dev.classmethod.jp
しかし、
ESSのPrivate IPは可変なので、定期的にALBのターゲットとなるPrivate IPをメンテナンスする必要があります
と記載があるため、この処理を行うシェルスクリプトを書きました。
シェルスクリプト
#!/bin/sh ALB_ARN=arn:aws:elasticloadbalancing:** # ALBに登録されているIPを全て削除 aws elbv2 describe-target-health \ --target-group-arn $ALB_ARN \ --query 'TargetHealthDescriptions[].Target.Id' \ --output json \ | grep -o '".*"' \ |awk '{ print "aws elbv2 deregister-targets --target-group-arn '"$ALB_ARN"' --targets Id="$1"" }' \ |sh # ESSのPrivateIPをALBに登録 aws ec2 describe-network-interfaces \ --filters "Name=status,Values=in-use" \ --query 'NetworkInterfaces[?Description==`ES ドメイン名`].PrivateIpAddress' \ --output json \ | grep -o '".*"' \ |awk '{ print "aws elbv2 register-targets --target-group-arn '"$ALB_ARN"' --targets Id="$1"" }' \ |sh
解説
ALBに登録されているIPを全て削除
現在ALBに登録されているターゲットのIDを全て取得するAWS CLIコマンドを実行し、その結果を使ってALBからターゲットを削除していきます。
現在ALBに登録されているターゲットのIDを全て取得するAWS CLIコマンドはaws elbv2 describe-target-health
です。
ALBからターゲットを削除するためには、IDが必要になるので、--query
オプションでIDを取得します。
aws elbv2 describe-target-health \ --target-group-arn $ALB_ARN \ --query 'TargetHealthDescriptions[].Target.Id' \ --output json
この部分が、ALBからターゲットを削除するAWS CLIコマンドです。
aws elbv2 register-targets
を使用します。
|awk '{ print "aws elbv2 register-targets --target-group-arn '"$ALB_ARN"' --targets Id="$1"" }' \
ESSのPrivateIPをALBに登録
現在ESSがVPC内で使用しているPrivateIPを取得します。AWSマネジメントコンソール-EC2-Network interfacesの画面で確認できる項目なので、AWS CLIはaws ec2 describe-network-interfaces
を使用します。
絞り込み条件はStatusがin-useのPrivateIPでとします。
また、ESSで使用しているPrivateIPはDescriptionが"ES ドメイン名"となるため、--query
オプションでそれを指定しつつ、PrivateIpAddressを取得します。
aws ec2 describe-network-interfaces \ --filters "Name=status,Values=in-use" \ --query 'NetworkInterfaces[?Description==`ES ドメイン名`].PrivateIpAddress' \ --output json
上記のIPをALBに登録します。
|awk '{ print "aws elbv2 register-targets --target-group-arn '"$ALB_ARN"' --targets Id="$1"" }' \
これをcronなどで定期実行することで、手作業がなくなります。