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 サブシステムをインストールして、Windows 統合バージョンの Ubuntu と Bash を取得できます。

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 WorldRESTful」ウェブサービスを作成します。

このディレクトリに、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 にリストされているライブラリがインストールされます。デプロイ中にアップロードするソースバンドルのサイズを最小限に抑えるには、EB にvirtフォルダを省略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。

    ~/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 コンソール を開き、リージョンリストで を選択します 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 アプリケーションのデプロイ」をチェックしてください