yamotonalds's blog

Webアプリケーション開発における技術メモが中心です。たまにWebサービス、興味を持ったデバイス、自作PCに関する話題もあるかも。Amazon好きなのでAmazon.co.jpアソシエイト使ってます。

AWS Elastic Beanstalkで環境変数を追加する

Webアプリケーションは他のサービスと連携することが多い。

メーラー、ストレージ、決済等、何らかの他サービスを使うだろう。

他サービスを使うには大抵そのサービスのアカウント情報や接続先情報が必要になるが、それらの情報をソースコードにハードコーディングするのは良くない。

GitHub等にアップロードするとアカウント情報が漏れてしまうし、本番環境とステージング環境で接続先を変更するといったことが難しくなる。

 

そこでそれらの情報を環境変数にセットしてアプリケーションはその値を使用することにする。

で、AWS Elastic Beanstalkを使用している場合にどうやってインスタンス環境変数をセットするか、というのが今回のお話。

 

簡単に言ってしまえば各環境(Environment)ごとの環境変数はManagement Consoleから設定できる。

Beanstalkの各環境の「Edit Configuration」から、「Container」タブを開くと「Environment Properties」というフォームがあるのがそれだ。

しかし、ここでユーザーが自由に使用できるのは「PARAM1」「PARAM2」の2つだけ。

変数名も不適切だし数も足りない。

 

そこで公式ドキュメントを見てみると次のようなページがあった。

Ruby 環境のカスタマイズと設定

要するにソースコードディレクトリのトップ階層に.ebextensionsディレクトリを作って.config拡張子のファイルを作ればそれが自動的に読み込まれる。

configファイルの内容は次のような感じ。

# .ebextensions/env.config
option_settings:
  - option_name: PARAM_NAME1
    value: VALUE1
  - option_name: PARAM_NAME2
    value: VALUE2    

このようにして自由に環境変数を追加定義できる。

最初、勘違いして.elasticbeanstalkディレクトリにconfigファイルを入れていた。注意。

 

もう1つハマった点として、.ebextensionsディレクトリとconfigファイルはコミットしなければならないということ。

git aws.pushがうまいことしてくれるのかと思ったらそうでは無いらしい。

しかしコミットしてしまっては最初に挙げた問題点が解決できない。

そこで調べてみると次のような投稿が見つかった。

http://stackoverflow.com/questions/14206760/how-to-set-an-environment-variable-in-amazon-elastic-beanstalk-python#answer-15961468

http://stackoverflow.com/questions/11211007/how-do-you-pass-custom-environment-variable-on-amazon-elastic-beanstalk-aws-ebs/14491294#14491294

つまりconfigファイルはダミーの値でコミットしておいてgit aws.push後にManagement Consoleから値を変更する。

試してみると確かに「Environment Properties」フォームに項目が増えていて、値を変更するとインスタンス環境変数にも反映された。

 

環境ごとに環境変数を変更するニーズはあると思うがちょっと方法がわかりにくいと思う。

改善に期待。