.ebextensionsに欠けているもの
elastic beanstalk環境を構築する上で便利な機能である.ebextensionsですが、環境ごとの設定ができないという欠点があります。
このへんでも議論されてます。
上記ポスト内でamazonの中の人は、環境ごとに別のコードベースを使えばいいんじゃないかといっています。
vcsでリリースブランチを環境ごとに分けろといった提案なのだと思うのですが、正直管理が煩雑になるし、たとえばstagingと本番に別のコードがデプロイされ得るというのでは検証環境の意味がなくなってしまいます。
具体的事案
td-agentの設定ファイルを環境ごとに切り替えたかったのですが、.ebextensionsのfilesディレクティブだけでは不可能でした。
以前とっていた方法
.ebextensionsディレクトリを空にしておき、デプロイ用に手製のスクリプトで必要な.ebextensions設定ファイルをコピーしてくるという方法をとっていました。
やりたかったことは実現できていたのですが、そのスクリプト経由でしかデプロイできなくなるという欠点がありました。
また、vcsのコードがそのままデプロイされないという点で一抹の不安も残ります。
そこで
files:
"/path/to/workspace/development.conf":
owner: root
group: root
content: |
略
files:
"/path/to/workspace/production.conf":
owner: root
group: root
content: |
略
というふうに複数の設定ファイルをどこか適当な場所に作る.ebextensions設定を追加し、
files:
"/etc/td-agent/apply_td_config.sh" :
mode: "000755"
owner: root
group: root
content: |
#!/bin/sh
if [ 'production' == "$RAILS_ENV" ]; then
cp /path/to/workspace/production.conf /etc/td-agent/td-agent.conf
else
cp /path/to/workspace/development.conf /etc/td-agent/td-agent.conf
fi
touch /etc/td-agent/using-$RAILS_ENV-conf
container_commands:
# commands実行時点だと環境変数が見れなかった
01-command:
command: sh /etc/td-agent/apply_td_config.sh
02-command:
command: /etc/init.d/td-agent restart
というふうに、環境変数を見て設定ファイルをコピーしてくる.ebextensions設定を追加することで実現しました。
あとで環境を確認したときにどちらの設定ファイルを使っているかを確認しやすくするようにtouchしていますが必要はないです。
注意点としては、上記ファイルのコメントにも書いていますが、commandsディレクティブ実行時点では環境変数が設定されていなかったので、container_commandsで実行する必要がありました。
追記
2016/09/01にaws側で変更があったようで、.ebextensions以下のファイルにマルチバイト文字列が含まれているとデプロイに失敗するようになりました。
上記の例には日本語コメントが入っているので、ご注意ください。