elastic beanstalkの設定ファイルを活用する

最近AWSを使う仕事がちょくちょくあります。

そのうちの一つに、git submoduleに多数依存しているプロジェクトをelastic beanstalkに移行するというものがありました。

elastic beanstalkではデプロイするだけではsubmoduleを自動で取ってきてくれないので、依存するsubmoduleをプロジェクトの管理下に直接含めたり、デプロイ時に手動で更新するなどの対応が必要です。

今回はこれをelastic beanstalkの設定ファイルを使って解決してみました。

elastic beanstalkの設定ファイル

設定ファイルはyaml形式のファイルで、プロジェクトルートに.ebextentions/*.configとして置くことで利用することができます。

containerの種類やOSによって設定できることが多少異なりますが、どれもとても便利です。 例えば、linuxの場合、

  • パッケージマネージャからパッケージのインストール
  • ユーザやグループの作成
  • ファイルの新規作成/配置
  • シェルのコマンドの実行
  • サービスの設定
  • コンテナの設定

などが色々なことができます。

詳しくは下記ドキュメントを参照。

git submoduleを使ったプロジェクトのセットアップ例

今回は以下のような設定ファイルを書いてみました。

# .ebextentions/01-git-submodule.config

container_commands:
  10-rm-dirs:
    command: 'rm -r submodules/hoge src/fuga/piyo'
  11-git-init:
    command: 'git init'
  20-git-add-1:
    cwd: '/var/app/ondeck/'
    command: 'git submodule add git://github.com/hoge/hoge.git  submodules/hoge'
  21-git-checkout-1:
    cwd: '/var/app/ondeck/submodules/hoge'
    command: 'git checkout e1ad2bde9c2cf12e65a89ef5eadcccd048f1af0c'
  30-git-add-2:
    cwd: '/var/app/ondeck/'
    command: 'git submodule add git://github.com/fuga/piyo.git src/fuga/piyo'
  31-git-checkout-2:
    cwd: '/var/app/ondeck/src/fuga/piyo'
    command: 'git checkout d49febf9eaf66bd89205f1e39b0290dfcbec5dfd'

やっていることとしては、

  1. git initする
  2. submoduleの展開先ディレクトリを削除する
  3. git submodule addし直す
  4. 指定したコミットをチェックアウトする

という感じです。

各submoduleの設定は.git/configに書き込まれているのですが、デプロイするプロジェクトには.gitが存在しないため上記ではその代わりの作業を行っています。

submoduleが増えるたびに追記する必要があるのでちょっと泥臭いですが、それ以外では余計な運用が増えないメリットもあります。

知っとくといいかもしれないこと

ディレクトリ

container_command実行時には/var/app/ondeckがワーキングディレクトリとなっています。

ここはプロジェクトのzipが展開される準備用のディレクトリで、ここから/var/app/currentにコピーされてデプロイが完了します。

設定ファイルの適用履歴

設定ファイルの適用内容はログに書き出されるので、設定失敗時に見ると役立ちます。

ログはelastic beanstalkのマネジメントコンソールからLogsページでSnapshot Logsで取得できます。

まとめ

こんな感じで環境設定をテキスト管理できるのはなにかと便利ですね。 ただし設定ファイルはデプロイ毎に実行されて時間がかかるので、AMIも同時に活用するとよりいい感じだと思います。

elastic beanstalkは最近使い始めたので知らないことだらけです。 今回のgit submoduleのやり方を含め、「こうすると便利だよ!」という情報があればぜひ教えてください!