production.log

株式会社リブセンスでエンジニアをやっている星直史のブログです。

VPCにあるAWS Elasticsearch ServiceのPrivate IPをALBに追加するシェルスクリプト

概要

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などで定期実行することで、手作業がなくなります。