Yukii's Blog

Yet Another Tech Blog.

Elastic Beanstalk についての忘備録

2019/02/20

Elastic Beanstalk は、 aws で対ユーザーの WEB サーバーを立てるときに、 ほぼほぼ毎回お世話になる。 ただ、一度設定が済んでしまうと、ほとんどその後ほとんどいじらず、勝手によろしく動いてくれるので、新規のプロジェクトの度に beanstalk の設定に苦労している気がした。 この前、久しぶりに一から設定する機会があったので、備忘を兼ねてここにまとめておく。

Elastic Beanstalk とは

heroku を aws に持ってきたようなもの。

普通の rails プロジェクトとの対応表は、大体以下のような感じ。

生 rails elasticbeanstalk
サーバー構築 Beanstalk の設定 -> CloudFormation stack の自動生成
プロビジョニング 言語ごと platform による設定 + .ebextensions での commands など
デプロイ 言語ごと platform による設定でだいたいよろしくデプロイされる

AWS のリソースとしては、ロードバランサーとそれに繋がった AutoScalingGroup (の設定) の形で実装される。 それらを設定する際に必要になる Security Group だとか IAM Role だともろもろの付随したリソースが必要になるけれども、それの管理まで一括で行ってくれる。

サーバーの構成は上記のように CloudFormation によって自動化されるが、 具体的な WebApplication のソースコードを動かすためにはもろもろのライブラリやインタプリタなどが必要になり、 ElasticBeanstalk はそれを Platform という形式で選択可能にしている。

Platform は、ElasticBeanstalk に対するデプロイ・プロヴィジョニングスクリプトもろもろを、各言語などごとにあらかじめ用意したもの。

Application と Environment

開発中のアプリを Application といい、実際にウェブアプリとしてのシステム1式を Environment という。

  • ひとつの Application に対して複数の Environment を持てる。
    • 例: Production Environment + Staging Environment
  • Environment には Application の一つのバージョンがデプロイされる
    • これを ApplicationVersion という
    • ApplicationVersion ≒デプロイ対象のビルド成果物

操作方法

大きく分けて、以下の3種類がある。

  1. 画面からぽちぽち
  2. eb の CLI ツールから操作
  3. aws の CLI ツールから操作

エンジニアとして作業する場合、最初は 2 を多用して、 安定してきたら 1 のみの操作になると思われる。

eb コマンドについて

eb コマンドは、 ElasticBeanstalk の操作をコマンドライン上からスムーズに実行するためのツール。 実行するたびに、 .elasticbeanstalk/config.yml に現在の Application や Environment についての情報を保存し、 次回以降実行するときに以前入力した情報は省略できるようになる。

具体的には Application ID や Environment ID など。 毎回入力するには面倒すぎるものが、eb がもし .elasticbeanstalk/config.yml から情報を読み出すことができれば、入力が不要になる。 (デフォルト値として利用するので、毎回、明示的に指定することもできる。)

このファイルは開発者の利便性のための設定ファイルなので、デフォルトでは .gitignore に追加され commit されないようになっている。 public repository でなければ、別に commit してしまってもあまり問題はない。

ライフサイクル

  • eb init : Application を作成する
  • eb create : Environment を作成する
  • eb deploy : 今のプロジェクト(おそらくコミットHEAD)をデプロイする
    • ApplicationVersion を作成・アップロードし、
    • それを Environment に適用するまでをやってくれる。

プロジェクトのための設定いろいろ

.ebextensions/任意名称.config にて、プロジェクトの ElasticBeanstalk に対する設定を行うことができる。 なお、 ElasticBeanstalk にはいくつか設定を行うための方法が提供されていて、その優先順位は以下のようになっている。多分。

  1. 画面 UI でぽちぽちして設定した値
  2. .ebextensions の中で設定した値
  3. もろもろのデフォルト値

ebextensions は、 ElasticBeanstalk Environment に対するありとあらゆる設定可能な項目を記述できるようになっている。

特に、大体の場合においてはアプリケーションを動かすにはそのアプリ固有のプロヴィジョニングを行う必要があるので、 エンジニアが一番いじるのは ebextensions だと思われる。

詳細は例えば以下の公式文書を参考にするとよい。

デプロイ・プロヴィジョニング関連については、基本的には Ansible や itamae のようなことが記述できる。 Linux サーバーでのソフトウェアのカスタマイズの方に、その各 clause の記述方法が載っている。 参考までに、一番よく使うであろう commands によるプロヴィジョニングは以下のようになる。

commands:
  your_command_name:
    test: "shell command # 成功ステータスで command 実行"
    command: "任意のシェルスクリプト"

なお、この config ファイルたちは、 .ebextensions ディレクトリ下に何個でも配置できる模様。 基本的に json としてマージした設定が、最終的に処理されるものになるっぽい。

commands が実行されるタイミング

ElasticBeanstalk は、特に環境の作り直しはとても時間がかかるので、デプロイのための試行錯誤をしている最中ではなるべくそれを避けたい。 commands などのプロヴィジョニング用設定項目は、各デプロイを行うたびに実行されるので、 commands のテストをするためだったらばんばんデプロイしていけばいい。 (自分はこれに気づかず、割と苦労していた。)

tags:  elastic-beanstalk  aws