初心者向け『Elastic Beanstalk への Flask アプリケーションのデプロイ』をやってみた

2019.11.09

大阪オフィスのちゃだいんです。

手を動かして学ぶために、公式ドキュメントのチュートリアルをやってみました。

今回は、Elastic Beanstalk を AWS EB CLI でデプロイできる教材をやってみました。

Elastic Beanstalk への Flask アプリケーションのデプロイ - AWS Elastic Beanstalk

Flask は、Python のオープンソースのウェブアプリケーションフレームワークです。このチュートリアルでは、Flask アプリケーションを生成して AWS Elastic Beanstalk 環境にデプロイする手順を示します。

前提条件

以下がローカル環境に必要となります。

  • Python 2.7 または 3.4 以降
  • pip
  • virtualenv
  • awsebcli

早速やってみた

1.仮想環境を設定する

ここでは、アプリケーション用のプロジェクトディレクトリと仮想環境を作成し、Flask をインストールしました。
まとめると以下のような感じです。

  • プロジェクトディレクトリを作成する
  • virtという名前の仮想環境を作成する
  • virtという名前の仮想環境をアクティブ化する
  • pip installで Flask をインストールする
  • pip freezeでインストールされているライブラリを表示する
  • pip freezeからの出力を、requirements.txt という名前のファイルに保存する

特に詰まることなく実行できました。

2.Flask アプリケーションを作成する

アプリケーションコードを作成します。内容としては、いわゆる"Hello World"を表示する RESTful Webサービスです。

ドキュメントに記載のある以下のコードをapplication.pyというファイル名で保存します。

from flask import Flask

# print a nice greeting.
def say_hello(username = "World"):
    return '<p>Hello %s!</p>\n' % username

# some bits of text for the page.
header_text = '''
    <html>\n<head> <title>EB Flask Test</title> </head>\n<body>'''
instructions = '''
    <p><em>Hint</em>: This is a RESTful web service! Append a username
    to the URL (for example: <code>/Thelonious</code>) to say hello to
    someone specific.</p>\n'''
home_link = '<p><a href="/">Back</a></p>\n'
footer_text = '</body>\n</html>'

# EB looks for an 'application' callable by default.
application = Flask(__name__)

# add a rule for the index page.
application.add_url_rule('/', 'index', (lambda: header_text +
    say_hello() + instructions + footer_text))

# add a rule when the page is accessed with a name appended to the site
# URL.
application.add_url_rule('/<username>', 'hello', (lambda username:
    header_text + say_hello(username) + home_link + footer_text))

# run the app.
if __name__ == "__main__":
    # Setting debug to True enables debug output. This line should be
    # removed before deploying a production app.
    application.debug = True
    application.run()

pythonを使用してapplication.pyを実行します。

(virt) ~/eb-flask$ python application.py
 * Serving Flask app "application" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 758-843-500

これでローカル仮想環境上でアプリケーションが実行できました。

ウェブブラウザで http://127.0.0.1:5000/ を開くと、インデックスページが表示されました。

また、以下の通りサーバーログとして、リクエストの出力が確認できます。

127.0.0.1 - - [09/Nov/2019 21:28:10] "GET / HTTP/1.1" 200 -

3.EB CLI でサイトをデプロイする

とても簡単なチュートリアルなので、すでに Elastic Beanstalk でデプロイするために必要な条件は全て揃ったことになります。

ただ、プロジェクトディレクトリにあるvirtフォルダは、アプリケーションの実行には必要ないので、これを無視する設定を追加します。

具体的には.ebignoreファイルにvirtと記述し、保存します。

次に、eb initコマンドでEB CLI リポジトリを初期化します。

~/eb-flask$ eb init -p python-3.6 flask-tutorial --region us-east-2

そして、eb createコマンドで環境を作成します。

~/eb-flask$ eb create flask-env
Creating application version archive "app-191109_213408".
Uploading flask-tutorial/app-191109_213408.zip to S3. This may take a while.
Upload Complete.
Environment details for: flask-env
  Application name: flask-tutorial
  Region: us-east-2
  Deployed Version: app-191109_213408
  Environment ID: e-m3peyvj3qc
  Platform: arn:aws:elasticbeanstalk:us-east-2::platform/Python 3.6 running on 64bit Amazon Linux/2.9.3
  Tier: WebServer-Standard-1.0
  CNAME: UNKNOWN
  Updated: 2019-11-09 12:34:12.635000+00:00
Printing Status:
2019-11-09 12:34:11    INFO    createEnvironment is starting.
2019-11-09 12:34:12    INFO    Using elasticbeanstalk-us-east-2-123456789012 as Amazon S3 storage bucket for environment data.
2019-11-09 12:34:37    INFO    Created security group named: sg-0656ad0c10fe23b63
...

上記のように作成状況を実況中継してくれます。

5分程度で環境が作成されました。

マネジメントコンソールをみると、ちゃんとできてますね。

最後に、eb openコマンドでウェブサイトを稼働させます。

~/eb-flask$ eb open

特に出力はなく、しれっと稼働しました。

flask-envのページにて、URLが生成されているので、それを開いてみます。

ちゃんとWebサービスが表示されました。

"Append a username to the URL(for example: /Thelonious) to say hello to some specific."と書かれているので、やってみました。

taroに挨拶できました。

感想

とても簡単なチュートリアルではありますが、EB CLI で Elastic Beanstalk を使用することができました。
「1時間以内でちょっと EB CLI を触りたいんだけど」という方にはうってつけです。(そんな人いる?)

それでは今日はこのへんで。大阪オフィスのちゃだいんでした。