メニュー
AWS Elastic Beanstalk
開発者ガイド (API Version 2010-12-01)

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

このチュートリアルでは、Python 2.7 を実行している Elastic Beanstalk 環境への単純な Flask ウェブサイトのデプロイについて説明します。デプロイメカニズムとして EB CLI を使用しますが、プロジェクトの内容を含む ZIP ファイルをデプロイするために AWS マネジメントコンソール を使用することもできます。EB CLI は、Python SDK for AWS(boto)を使用する Python で記述されたインタラクティブなコマンドラインインターフェイスです。

前提条件

Elastic Beanstalk を含め、アマゾン ウェブ サービス(AWS)を使用するには、AWS アカウントと認証情報が必要です。詳細を確認し、サインアップするには、https://aws.amazon.com/ にアクセスしてください。

このチュートリアルを実行するには、以下のパッケージを含む、インストールされている Python の一般的な前提条件をすべて満たす必要があります。

  • Python 2.7

  • pip

  • virtualenv

  • awsebcli

チュートリアルの一部として Flask フレームワークをインストールします。

注記

EB CLI を使用して環境を作成するには、サービスロールが必要です。Elastic Beanstalk 管理コンソールで環境を作成することで、サービスロールを作成できます。サービスロールがない場合は、eb create を実行したときに EB CLI によって作成されます。

Flask で Python 仮想環境を設定する

virtualenv で仮想環境を作成し、それを使用して Flask とその依存関係をインストールします。仮想環境を使用することで、アプリケーションで必要なパッケージを正確に識別し、アプリケーションを実行する EC2 インスタンスにそれらの必要なパッケージをインストールすることができます。

開発環境を設定するには

  1. eb-virt という名前の仮想環境を作成します。

    ~$ virtualenv ~/eb-virt
  2. 仮想環境をアクティブ化します。

    ~$ source ~/eb-virt/bin/activate
    (eb-virt) ~$

    コマンドプロンプトの先頭に (eb-virt) と表示され、仮想環境を使用していることが示されます。

  3. pip を使用して、次のように入力して Flask をインストールします。

    (eb-virt)~$ pip install flask==0.10.1
  4. Flask がインストールされたことを確認するには、次のように入力します。

    (eb-virt)~$ pip freeze
    Flask==0.10.1
    itsdangerous==0.24
    Jinja2==2.7.3
    MarkupSafe==0.23
    Werkzeug==0.10.1

    このコマンドは、仮想環境にインストールされるすべてのパッケージを一覧します。後でこのコマンドの出力を使用して、プロジェクトを Elastic Beanstalk で使用するために設定します。

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

次に、Elastic Beanstalk を使用してデプロイするアプリケーションを作成します。ここでは、"Hello World" という RESTful ウェブサービスを作成します。

Hello World Flask アプリケーションを作成するには

  1. 仮想環境をアクティブ化します。

    ~$ source ~/eb-virt/bin/activate
  2. プロジェクト用に eb-flask という名前のディレクトリを作成します。

    (eb-virt) ~$ mkdir eb-flask
    (eb-virt) ~$ cd eb-flask
  3. このディレクトリに、application.py という名前と以下の内容で新しいテキストファイルを作成します。

    ~/eb-flask/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()

    この例では、サービスへのアクセスに使用されるパスに基づいて変更されるカスタマイズされた挨拶を出力します。

    注記

    アプリケーションを実行する前に application.debug = True を追加することで、問題が発生した場合にデバッグ出力が有効になります。これは開発の場合に有用な方法ですが、デバッグ出力によってアプリケーションの内部的な側面が明らかになる可能性があるため、実稼働のコードではデバッグステートメントを削除する必要があります。

    ファイル名として application.py を使用し、呼び出し可能な application オブジェクト(この場合は Flask オブジェクト)を提供することで、Elastic Beanstalk がアプリケーションコードを見つけやすくなります。

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

    (eb-virt) ~/eb-flask$ python application.py

    Flask がウェブサーバーを起動し、アプリケーションにアクセスするための URL が表示されます。(例:

    * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
    * Restarting with stat
  5. この URL をウェブブラウザで開きます。実行中のアプリケーションが表示され、インデックスページが表示されます。

  6. サーバーログをチェックして、リクエストからの出力を確認します。Ctrl-C を押すと、ウェブサーバーを停止して仮想環境に戻ることができます。

デバッグ出力が表示される場合は、Elastic Beanstalk 用に設定する前に、エラーを修正し、そのアプリケーションがローカルで実行されることを確認します。

Elastic Beanstalk 用に Flask アプリケーションを設定する

アプリケーションがローカルで実行されたら、Elastic Beanstalk でのデプロイ用に設定する準備が整っています。

Elastic Beanstalk 用にサイトを設定するには

  1. 仮想環境をアクティブ化します。

    ~$ source ~/eb-virt/bin/activate
  2. pip freeze を実行して出力を requirements.txt という名前のファイルに保存します。

    (eb-virt) ~/eb-flask$ pip freeze > requirements.txt

    Elastic Beanstalk は requirements.txt を使用して、アプリケーションを実行する EC2 インスタンスにどのパッケージをインストールするかを判断します。

  3. deactivate コマンドを使用して、仮想環境を非アクティブ化します。

    (eb-virt) ~/eb-flask$ deactivate

    追加パッケージをアプリケーションに追加するか、またはアプリケーションをローカルで実行する必要があるときは、いつでも仮想環境を再アクティブ化します。

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

Elastic Beanstalk でアプリケーションをデプロイするために必要な条件をすべて追加しました。プロジェクトディレクトリは次のようになります。

~/eb-flask/
|-- application.py
`-- requirements.txt

次に、アプリケーション環境を作成し、設定済みのアプリケーションを Elastic Beanstalk を使用してデプロイします。

環境を作成し、Flask アプリケーションをデプロイするには

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

    ~/eb-flask$ eb init -p python2.7 flask-tutorial
    Application flask-tutorial has been created.

    このコマンドは、flask-tutorial という名前の新しいアプリケーションを作成し、ローカルリポジトリを設定して最新の Python 2.7 プラットフォーム設定で環境を作成します。

  2. (オプション)eb init を再度実行してデフォルトのキーペアを設定し、アプリケーションを実行している EC2 インスタンスに SSH で接続できるようにします。

    ~/eb-flask$ eb init
    Do you want to set up SSH for your instances?
    (y/n): y
    Select a keypair.
    1) my-keypair
    2) [ Create new KeyPair ]

    1 つのキーペアがすでにある場合はそれを選択するか、またはプロンプトに従って新しいキーペアを作成します。プロンプトが表示されないか設定を後で変更する必要がない場合は、eb init -i を実行します。

  3. 環境を作成し、eb create を使用してそこにアプリケーションをデプロイします。

    ~/eb-flask$ eb create flask-env

    注記

    「service role required」エラーメッセージが表示された場合は、eb create をインタラクティブに (環境名を指定せずに) 実行してください。EB CLI によってロールが作成されます。

    このコマンドは、flask-env という名前のロードバランシング Elastic Beanstalk 環境を作成します。環境の作成には約 5 分かかります。Elastic Beanstalk はアプリケーションを実行するのに必要なリソースを作成し、EB CLI がターミナルに中継する情報メッセージを出力します。

  4. 環境作成プロセスが完了したら、eb open でウェブサイトを開きます。

    ~/eb-flask$ eb open

    これにより、アプリケーション用に作成されたドメイン名を使用してブラウザウィンドウが開きます。ローカルで作成してテストしたのと同じ Flask ウェブサイトが表示されます。

アプリケーションが実行されていることを確認できない場合や、エラーメッセージが表示される場合は、エラーの原因を判断する方法のヒントを得るために「デプロイのトラブルシューティング」を参照してください。

アプリケーションが実行されていることを実際に確認できた場合は、Elastic Beanstalk での最初の Flask アプリケーションのデプロイが正常に完了しています。

クリーンアップと次のステップ

インスタンス時間と開発セッション間の他の AWS リソースを保存するには、eb terminate を使用して Elastic Beanstalk 環境を終了します。

~/eb-flask$ eb terminate flask-env

このコマンドは、環境とその中で実行されているすべての AWS リソースを終了します。これによってアプリケーションが削除されることはありません。したがって eb create を実行することで、いつでも同じ設定でさらに環境を作成することができます。EB CLI コマンドの詳細については、「EB CLI による Elastic Beanstalk 環境の管理」を参照してください。

サンプルアプリケーションで実行した場合は、プロジェクトフォルダーと仮想環境を削除することもできます。

~$ rm -rf ~/eb-virt
~$ rm -rf ~/eb-flask

詳細なチュートリアルを含め Flask の詳細については、公式ドキュメント を参照してください。

別の Python ウェブフレームワークを試す場合は、「Elastic Beanstalk への Django アプリケーションのデプロイ」をチェックアウトしてください。