ユニファ開発者ブログ

ユニファ株式会社システム開発部メンバーによるブログです。

EC2のタグ情報で設定ファイルを切り替える

おはこんばんにちは、インフラのすずきです。

先日iPhone 6s Plusがお風呂にダイブして、新型iPhoneが出る直前で本体交換しないといけないのか!?
とドキドキしていましたが、なんとか無事で今も順調に動いてくれています。
少なくともiPhone X発売まで頑張って頂きたいところです。

本題ですが、AWSのEC2タグ情報を利用して設定ファイルを切り替える方法をご紹介します。

以前から動いているサービスなどは、開発環境や本番環境毎に設定が異なり設定が変わるたびにその環境毎にイメージを取るなどしています。開発環境はサーバが入れ替わらないのでめったに取らないですが…

ただイメージの撮り忘れや、環境毎に設定が異なるなどして混乱を招きます。
環境差異が無いに越したことありませんよね…、弊社はAWSを利用しているのでEC2のタグに環境情報を入力しその情報を元に設定ファイルを切り替えるようにしています。

例えばの話でFluentd(td-agent)を利用します。
td-agentの起動スクリプト内部で /etc/sysconfig/td-agent を読み込んでいるのでそこにシェルスクリプトを書いていきます。
内容としては、EC2のタグ情報を自身で取得し、自身の環境変数としてセットする。
セットされた環境変数を利用してtd-agentの設定ファイルを切り替える。と言った感じです。

# file: /etc/sysconfig/td-agent
TMP=/var/tmp/ec2_env

export AWS_DEFAULT_REGION=ap-northeast-1

ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

# サービスごとにアカウントが分割されているのでowner_idとサービス名の紐付けリストからサービス名を取得
OWNER=$(aws ec2 describe-instances --instance-ids $ID | jq -rc '.Reservations[].OwnerId')
SERVICE=$(grep $OWNER /opt/infra/accounts.conf | awk '{print $1}')

# サービス名がない場合は OWNER IDを入れる
if [ $SERVICE = '' ]; then
  echo SERVICE=$OWNER > $TMP
else
  echo SERVICE=$SERVICE > $TMP
fi

# 不要なタグ
ESCAPE="aws:cloudformation|aws:autoscaling"

aws ec2 describe-tags --filters Name=resource-id,Values=$ID | jq -rc '.Tags[]|"\(.Key)=\(.Value)"' |grep -v -E "$ESCAPE" | perl -pe 's/^([a-z]*)=/\U\1=/g' >> $TMP

# 環境変数がセットしてあるリストの読み込み
. $TMP

# セットされた環境変数を利用して設定ファイルの切り替え
BASE=/etc/td-agent/conf.d
CONF=''

if [ -f "${BASE}/td-agent_${SERVICE}_${ENV}.conf" ]; then
  CONF="${BASE}/td-agent_${SERVICE}_${ENV}.conf"
elif [ -f "${BASE/}td-agent_${ENV}.conf" ]; then
  CONF="${BASE}/td-agent_${ENV}.conf"
else
  CONF="${BASE}/td-agent.conf"
fi

TD_AGENT_OPTIONS="--use-v1-config --config $CONF"

Fluentd自体も設定ファイル内部で環境変数の呼び出しもできるので tag "#{ENV['ENV']}.#{ENV['SERVICE']}.nginx.access" といった利用もできます。

今回はFluentdで例を上げましたが、nginxも /etc/sysconfig/nginx を読み込むようになっているので同じようなことができるかなと思います。

またRailsアプリなどのDBの接続情報はEC2のパラメータストアとタグ情報を利用しWebサーバならWebサーバの、バッチサーバならバッチサーバの情報を取得して起動できるようにしています。 こちらも機会があればご紹介しようと思います。

ざっくりでしたが、EC2のタグ情報を利用して設定ファイルを切り替えて利用する方法をご紹介しました。

今回はこれにて

もっといい方法あるよーとかあればご連絡いただけたりするとうれしいです。

すずき