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 の公式ガイドはこちらです。
この記事は公式ガイドのFlaskチュートリアルをベースに説明不足の部分を補足し、ハマリどころの解説を加えたものです。
アクセスキーを作成する
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! をもう一度実行してください。すると次のようなファイル構成になっているはずです。
1 2 3 4 |
myproject +-- myprojectenv ←virtualenvの環境が格納されたディレクトリ +-- myproject.py ←Flaskアプリのソースコード +-- requirements.txt ←必要なライブラリの一覧 |
requirements.txt をまだ作っていない場合は次のコマンドで作成します。
1 2 |
$ source myprojectenv/bin/activate ←Flaskの実行環境で (myprojectenv) $ pip3 freeze > requirements.txt ←一覧を作る |
確認のために実行してみます。
1 |
(myprojectenv) $ python3 myproject.py |
この状態で http://localhosts:5000 (ポート番号を5000以外に変更した場合は数字を変更)にアクセスすれば “Hello world!” と表示されはずでしたね。
【重要】ところが、このままでは Elastic Beanstalk にデプロイできません。Elastic Beanstalk では “application” というファイル名・変数名を探してアプリを起動します。ファイル名を myproject.py から application.py に変更し、更にその内容も次のように “app” という変数名を “application” に変更してください。
1 2 3 4 5 6 7 8 9 10 11 |
# coding: utf-8 from flask import Flask application = Flask(__name__) @application.route('/') def main(): return 'Hello world!' if __name__ == '__main__': application.run(debug=True, host='0.0.0.0') |
念の為もう一度 http://localhosts:5000 でちゃんと動くことを確認しておきましょう。
EB CLI を使ってデプロイする
EB CLI は AWS Elastic Beanstalk を扱うためのコマンドラインインターフェイスです。このコマンドも virtualenv の環境にインストールしてしまいます。
1 |
(myprojectenv) $ pip3 install awsebcli --upgrade |
ローカル環境のうち myprojectenv のディレクトリは Elastic Beanstalk には不要なので、除外するために .ebignore というファイルを作ります。.ebignore の中には1行だけディレクトリ名を書いておきます。GitHub で使用する .gitignore と同じ考え方です。
1 |
myprojectenv |
eb init コマンドを実行すると色々聞かれますので入力します。過去に eb init コマンドを実行したことがあれば、設定済の項目は表示されないかもしれません。
【重要】Elastic Beanstalk を使うときは常にリージョンを意識してください。デフォルトのままで進めるとどこにデプロイされたかわからなくなってしまい、最悪、世界中のリージョンにインスタンスが出来てしまいます。例えば「東京(ap-northeast-1)」と決めたら常に「東京」を使うようにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
(myprojectenv) $ eb init Select a default region 1) us-east-1 : US East (N. Virginia) 2) us-west-1 : US West (N. California) 3) us-west-2 : US West (Oregon) 4) eu-west-1 : EU (Ireland) 5) eu-central-1 : EU (Frankfurt) 6) ap-south-1 : Asia Pacific (Mumbai) 7) ap-southeast-1 : Asia Pacific (Singapore) 8) ap-southeast-2 : Asia Pacific (Sydney) 9) ap-northeast-1 : Asia Pacific (Tokyo) 10) ap-northeast-2 : Asia Pacific (Seoul) 11) sa-east-1 : South America (Sao Paulo) 12) cn-north-1 : China (Beijing) 13) cn-northwest-1 : China (Ningxia) 14) us-east-2 : US East (Ohio) 15) ca-central-1 : Canada (Central) 16) eu-west-2 : EU (London) 17) eu-west-3 : EU (Paris) 18) eu-north-1 : EU (Stockholm) 19) eu-south-1 : EU (Milano) 20) ap-east-1 : Asia Pacific (Hong Kong) 21) me-south-1 : Middle East (Bahrain) 22) af-south-1 : Africa (Cape Town) (default is 3): 9 ←リージョンの指定です。「東京」を指定します。 You have not yet set up your credentials or your credentials are incorrect You must provide your credentials. (aws-access-id): XXXXXXXX ←IAMユーザーのAccess key IDです。 (aws-secret-key): XXXXXXXXXXXXXXXX ←IAMユーザーのSecret access keyです。 Enter Application Name (default is "myproject"): ←好きな名前。Elastic Beanstalkのアプリ名になります。 Application myproject has been created. It appears you are using Python. Is this correct? (Y/n): Y ←Pythonであることを確認 Select a platform branch. 1) Python 3.8 running on 64bit Amazon Linux 2 2) Python 3.7 running on 64bit Amazon Linux 2 3) Python 3.6 running on 64bit Amazon Linux (Deprecated) (default is 1): 1 ←Pythonのバージョンを指定。なるべくテスト環境と同じものを。 Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization Do you want to set up SSH for your instances? (Y/n): Y ←SSHを使うので"Y" Type a keypair name. (Default is aws-eb): ←このファイルは/Users/ユーザー名/.ssh/aws-ebにできる Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): ←パスフレーズ無しならEnter Enter same passphrase again: ←もう一度Enter Your identification has been saved in /Users/xx/.ssh/aws-eb Your public key has been saved in /Users/xx/.ssh/aws-eb.pub The key fingerprint is: SHA256:xxxxxxxxxxxxxxxxxxxxxxx aws-eb The key's randomart image is: +---[RSA 3072]----+ | o*++ .| | .E===| +----[SHA256]-----+ WARNING: Uploaded SSH public key for "aws-eb" into EC2 for region ap-northeast-1. (myprojectenv) $ |
Flask用の環境を flask-env という名前で作成します。次のコマンドを実行すると、処理の進行状態が表示されます。5分ほどかかるので “Successfully launched environment” と表示されるまで待ってください。
1 2 3 4 |
(myprojectenv) $ eb create flask-env (省略) 2022-03-15 02:51:09 INFO Successfully launched environment: flask-env (myprojectenv) $ |
エラーが発生していなければWEBページを開いてみます。ローカル環境で動かしたときのように “Hello world!” と表示されれば正常です。
1 |
(myprojectenv) $ eb open |
もし動かなかったら Elastic Beanstalk の状態を確認してください。
1 |
(myprojectenv) $ eb health |
デプロイしたものの削除
デプロイした環境は eb terminate コマンドで終了できます。
1 |
(myprojectenv) $ eb terminate flask-env |
eb コマンドを実行した記録はプロジェクトのディレクトリの .elasticbeanstalk というディレクトリに残っています。このディレクトリを削除すれば初期状態に戻ります。
Elastic Beanstalk はデプロイ時にAWSの様々なインスタンスを作ります。その殆どは eb terminate コマンドで削除されますが、Amazon S3 バケットだけは削除されません。S3バケットを完全に削除してしまいたい場合は次のページの手順に従ってください。