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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

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

このチュートリアルでは、以下の作業を行います。

前提条件

このチュートリアルでは、基本的な Elastic Beanstalk オペレーションと Elastic Beanstalk コンソールに関する知識があることを前提としています。まだ起動していない場合は、Elastic Beanstalk の開始方法 の指示に従って、最初の Elastic Beanstalk 環境を起動します。

このガイドの手順に従うには、run command のためのコマンドラインターミナルまたはシェルが必要になります。コマンドは、該当する場合、プロンプト記号 ($) と現在のディレクトリの名前が前に付けられて、リストに示されます。

~/eb-project$ this is a command this is output

Linux および macOS では、任意のシェルとパッケージ管理者を使用できます。Windows では、Linux 用の Windows サブシステムをインストールして、Ubuntu および Bash の Windows に統合されたバージョンを入手できます。

Flask には Python 3.7 以降が必要です。このチュートリアルでは、Python 3.7 と対応する Elastic Beanstalk プラットフォームバージョンを使用します。「Elastic Beanstalk 用の Python 開発環境の設定」の手順に従って Python をインストールします

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

また、このチュートリアルでは、Elastic Beanstalk コマンドラインインターフェイス (EB CLI) も使用します。EB CLI をインストールおよび設定する手順の詳細については、「Elastic Beanstalk コマンドラインインターフェイスをインストールする」および「EB CLI の設定」を参照してください。

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

アプリケーション用のプロジェクトディレクトリと仮想環境を作成し、Flask をインストールします。

プロジェクト環境をセットアップするには
  1. プロジェクトディレクトリを作成します。

    ~$ mkdir eb-flask ~$ cd eb-flask
  2. virt という名前の仮想環境を作成してアクティブ化します。

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

    コマンドプロンプトの先頭に (virt) と表示され、仮想環境を使用していることが示されます。このチュートリアルの残りの部分では、仮想環境を使用します。

  3. pip install で Flask をインストールします

    (virt)~/eb-flask$ pip install flask==2.0.3
  4. pip freeze で、インストールされているライブラリを表示します

    (virt)~/eb-flask$ pip freeze click==8.1.1 Flask==2.0.3 itsdangerous==2.1.2 Jinja2==3.1.1 MarkupSafe==2.1.1 Werkzeug==2.1.0

    このコマンドは、仮想環境にインストールされるすべてのパッケージを一覧します。仮想環境にいるため、EB CLI などのグローバルにインストールされたパッケージは表示されません。

  5. pip freeze からの出力を、requirements.txt という名前のファイルに保存します。

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

    このファイルは、デプロイ中にライブラリをインストールするよう Elastic Beanstalk に指示します。詳細については、「Elastic Beanstalk での要件ファイルを使用した依存関係の指定」を参照してください。

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

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

このディレクトリに、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 がアプリケーションコードを見つけやすくなります。

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: 313-155-123

ウェブ・ブラウザで http://127.0.0.1:5000/ を開きます。実行中のアプリケーションが表示され、インデックスページが表示されます。

Web browser displaying "Hello World!" message and a hint about RESTful web service usage.

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

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

EB CLI でサイトをデプロイします

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

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

ただし、virt フォルダは、Elastic Beanstalk でアプリケーションを実行するために必要ありません。デプロイすると、Elastic Beanstalk によりサーバーインスタンスに新しい仮想環境が作成され、requirements.txt にリストされているライブラリがインストールされます。デプロイ中にアップロードする出典バンドルのサイズを最小化するには、virt フォルダを離れるように EB CLI に指示する .ebignore ファイルを追加します。

例 ~/eb-flask/.ebignore
virt

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

環境を作成し、Flask アプリケーションをデプロイするには
  1. eb init コマンドで EB CLI リポジトリを初期化します。

    ~/eb-flask$ eb init -p python-3.7 flask-tutorial --region us-east-2 Application flask-tutorial has been created.

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

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

    ~/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

環境の作成の所要時間は約 5 分です。以下のリソースが作成されます。

  • EC2 インスタンス – 選択したプラットフォームでウェブ・アプリケーションを実行するよう設定された Amazon Elastic Compute Cloud (Amazon EC2) 仮想マシン。

    各プラットフォームは、それぞれ特定の言語バージョン、フレームワーク、ウェブコンテナ、またはそれらの組み合わせをサポートするための、特定のソフトウェア、設定ファイル、スクリプトを実行します。ほとんどのプラットフォームでは、Apache または NGINX のいずれかをウェブアプリケーションの前にリバースプロキシとして配置します。そのプロキシがリクエストをアプリケーションに転送し、静的アセットを提供し、アクセスログとエラーログを生成します。

  • インスタンスセキュリティグループ – ポート 80 上のインバウンドトラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、ロードバランサーからの HTTP トラフィックが、ウェブ・アプリケーションを実行している EC2 インスタンスに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。

  • ロードバランサー – アプリケーションを実行するインスタンスにリクエストを分散するよう設定された Elastic Load Balancing ロードバランサー。ロードバランサーにより、インスタンスを直接インターネットに公開する必要もなくなります。

  • ロードバランサーセキュリティグループ – ポート 80 上のインバウンドトラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、インターネットからの HTTP トラフィックが、ロードバランサーに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。

  • Auto Scaling グループ – インスタンスが終了されたか利用不可になった場合にそのインスタンスを置き換えるよう設定された Auto Scaling グループ。

  • Amazon S3 バケット – Elastic Beanstalk の使用時に作成されるソースコード、ログ、その他のアーティファクトの保存場所。

  • Amazon CloudWatch アラーム – 環境内のインスタンスの負荷をモニタリングする 2 つの CloudWatch アラーム。負荷が高すぎる、または低すぎる場合にトリガーされます。アラームがトリガーされると、Auto Scaling グループはレスポンスとしてスケールアップまたはダウンを行います。

  • AWS CloudFormation スタック – 環境内でリソースを起動して、設定の変更を伝達するために、Elastic Beanstalk は AWS CloudFormation を使用します。リソースは、AWS CloudFormation コンソールに表示できるテンプレートで定義されます。

  • ドメイン名 – ウェブ・アプリケーションまでのルートとなるドメイン名であり、subdomain.region.elasticbeanstalk.com の形式です。

    ドメインセキュリティ

    Elastic Beanstalk アプリケーションのセキュリティを強化するため、elasticbeanstalk.com ドメインはパブリックサフィックスリスト (PSL) に登録されています。

    Elastic Beanstalk アプリケーションのデフォルトドメイン名に機密性のある Cookie を設定する必要がある場合は、セキュリティ強化のため __Host- プレフィックスの付いた Cookie の使用をお勧めします。このプラクティスは、クロスサイトリクエストフォージェリ (CSRF) 攻撃からドメインを防御します。詳細については、Mozilla 開発者ネットワークの「Set-Cookie」ページを参照してください。

これらのリソースはすべて Elastic Beanstalk によって管理されます。環境を終了すると、Elastic Beanstalk は含まれているすべてのリソースを終了します。

注記

Elastic Beanstalk が作成する Amazon S3 バケットは、環境間で共有され、環境の終了時に削除されません。詳細については、「Amazon S3 で Elastic Beanstalk を使用する」を参照してください。

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

~/eb-flask$ eb open

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

Browser window displaying a Flask web application with a "Hello World!" message and usage hint.

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

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

クリーンアップ

Elastic Beanstalk での作業が終了したら、環境を終了できます。Elastic Beanstalk は、Amazon EC2 インスタンスデータベースインスタンスロードバランサー、セキュリティグループ、アラームなど、お客様の環境に関連付けられているすべての AWS リソースを終了します。

コンソールから Elastic Beanstalk 環境を終了するには
  1. Elastic Beanstalk コンソールを開き、[Regions] (リージョン) リストで AWS リージョンを選択します。

  2. ナビゲーションペインで、[環境] を選択し、リストから環境の名前を選択します。

    注記

    環境が多数ある場合は、検索バーを使用して環境リストをフィルタリングします。

  3. [Actions] (アクション)、[Terminate environment] (環境の終了) の順に選択します。

  4. 画面上のダイアログボックスを使用して、環境の終了を確認します。

Elastic Beanstalk を使用すると、いつでもアプリケーション用の新しい環境を簡単に作成できます。

EB CLI の場合:

~/eb-flask$ eb terminate flask-env

次のステップ

Flask の詳細については、flask.pocoo.org を参照してください。

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