AWS(Elastic Beanstalk)にデプロイする(Flask編)

AWS(EC2)にデプロイする ではFlaskアプリをAWSのEC2にデプロイしました。EC2を使う場合はUbuntu等のLinux環境にインストールするのと手順は変わりません。Raspberry Pi をサーバーとして使用する場合も基本的には同じ手順です。

AWSにはEC2以外にも色々なサービスがあり、Elastic Beanstalk というサービスを使うとアプリのコーディングだけを行い、Linux環境をほとんど意識すること無くクラウド上にデプロイすることができます。Heroku に似ているかもしれません。

この記事では FlaskでHello World! 等の学習を終え、ローカル環境でFlaskが使えることを前提に、そのアプリを AWS Elastic Beanstalk を使ってクラウドにデプロイします。

AWSのアカウント登録やログインの方法は AWS(EC2)にデプロイする と同じです。この記事ではAWSにログインできることを前提に説明を開始します。

Elastic Beanstalk の公式ガイドはこちらです。

AWS Elastic Beanstalk とは - AWS Elastic Beanstalk
インフラストラクチャを気にすることなく、AWS Elastic Beanstalk を使用してアプリケーションを AWS クラウドでデプロイおよび管理します。選択肢や制御を制限することなく、管理の複雑さを軽減します。

この記事は公式ガイドのFlaskチュートリアルをベースに説明不足の部分を補足し、ハマリどころの解説を加えたものです。

Elastic Beanstalk への Flask アプリケーションのデプロイ - AWS Elastic Beanstalk
EB CLI で Flask アプリケーションを作成し、設定して、AWS Elastic Beanstalk にデプロイします。

アクセスキーを作成する

AWSにアカウント登録してそのまま使っている人は “ルートユーザー” としてサインインしていると思います。

これからWEBアプリをデプロイするのですがルートユーザーのまま作業するのはセキュリティ面で好ましくありません。WEBアプリに関する権限だけを与えたIAMユーザーを作成して、そのユーザー権限下でWEBアプリを動作させます。

AWSにログインしてメニュー検索から “IAM” を探してください。”Identify and Access Management (IAM)” というサービスに入ったら、左側のメニューから “ユーザー” を選択します。さらに “ユーザーを追加” のボタンを押してください。

“ユーザーを追加” のボタンを押すと新しいユーザーに関する設定画面になりますので順に設定します。設定画面は5つの段階で進みます。

(1) ユーザー詳細の設定

  • ユーザー名 は任意の名前で構いません。今回はElasticBeanstalkを使ったオペレーションなので “ebmaster” としました。
  • AWS認証情報タイプを選択 は、”アクセスキー・プログラムによるアクセス” を選択します。
  • 次のステップ:アクセス権限 のボタンを押します。

(2) アクセス権限

ユーザーに許可するオペレーション内容を設定する重要な画面です。Elastic Beanstalk 公式ガイドに ユーザーポリシーについての解説 があるので従います。”既存のポリシーを直接アタッチ” のボタンを押して “ErasticBeanstalk” で検索すると “AdministratorAccess-AWSElasticBeanstalk” が出てくるので選択します。

【重要】Elastic Beanstalk はデプロイする時に EC2 も使います。従ってEC2に対する権限も必要です。”AmazonEC2FullAccess” というポリシーも追加しておいてください。忘れると後でエラーが出ます。

(3) タグの追加(オプション)

この画面の設定項目はオプションなので、何もせず “次のステップ:確認” を押します。

(4) 確認

ここまで設定した内容が表示されるので、確認して “ユーザーの作成” を押します。

(5) アクセスキーの入手

“成功” と表示されて、作成したユーザーのアクセスキーが表示されます。アクセスキーとシークレットアクセスキーは後で使います。CSVファイルを保存しておくと良いでしょう。保存したCSVファイルは厳重に管理してください。

Flask アプリの動作を再確認

デプロイするアプリの動作をローカル環境で再確認します。特にアプリを準備していない場合は、FlaskでHello World! をもう一度実行してください。すると次のようなファイル構成になっているはずです。

requirements.txt をまだ作っていない場合は次のコマンドで作成します。

確認のために実行してみます。

この状態で http://localhosts:5000 (ポート番号を5000以外に変更した場合は数字を変更)にアクセスすれば “Hello world!” と表示されはずでしたね。

【重要】ところが、このままでは Elastic Beanstalk にデプロイできません。Elastic Beanstalk では “application” というファイル名・変数名を探してアプリを起動します。ファイル名を myproject.py から application.py に変更し、更にその内容も次のように “app” という変数名を “application” に変更してください。

念の為もう一度 http://localhosts:5000 でちゃんと動くことを確認しておきましょう。

EB CLI を使ってデプロイする

EB CLI は AWS Elastic Beanstalk を扱うためのコマンドラインインターフェイスです。このコマンドも virtualenv の環境にインストールしてしまいます。

ローカル環境のうち myprojectenv のディレクトリは Elastic Beanstalk には不要なので、除外するために .ebignore というファイルを作ります。.ebignore の中には1行だけディレクトリ名を書いておきます。GitHub で使用する .gitignore と同じ考え方です。

eb init コマンドを実行すると色々聞かれますので入力します。過去に eb init コマンドを実行したことがあれば、設定済の項目は表示されないかもしれません。

【重要】Elastic Beanstalk を使うときは常にリージョンを意識してください。デフォルトのままで進めるとどこにデプロイされたかわからなくなってしまい、最悪、世界中のリージョンにインスタンスが出来てしまいます。例えば「東京(ap-northeast-1)」と決めたら常に「東京」を使うようにしてください。

Flask用の環境を flask-env という名前で作成します。次のコマンドを実行すると、処理の進行状態が表示されます。5分ほどかかるので “Successfully launched environment” と表示されるまで待ってください。

エラーが発生していなければWEBページを開いてみます。ローカル環境で動かしたときのように “Hello world!” と表示されれば正常です。

もし動かなかったら Elastic Beanstalk の状態を確認してください。

デプロイしたものの削除

デプロイした環境は eb terminate コマンドで終了できます。

eb コマンドを実行した記録はプロジェクトのディレクトリの .elasticbeanstalk というディレクトリに残っています。このディレクトリを削除すれば初期状態に戻ります。

Elastic Beanstalk はデプロイ時にAWSの様々なインスタンスを作ります。その殆どは eb terminate コマンドで削除されますが、Amazon S3 バケットだけは削除されません。S3バケットを完全に削除してしまいたい場合は次のページの手順に従ってください。

Amazon S3 で Elastic Beanstalk を使用する - AWS Elastic Beanstalk
Amazon S3 シンプルウェブサービスで Elastic Beanstalk を使用して、耐久性および耐障害性に優れたデータストレージを提供できます。