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

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

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

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

Prerequisites

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

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

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

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

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

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

また、このチュートリアルでは、Elastic Beanstalk コマンドラインインターフェイス (EB CLI) も使用します。EB CLI をインストールおよび設定する手順の詳細については、「EB CLI のインストール」および「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==1.1.2
  4. pip freeze で、インストールされているライブラリを表示します

    (virt)~/eb-flask$ pip freeze click==7.1.2 Flask==1.1.2 itsdangerous==1.1.0 Jinja2==2.11.3 MarkupSafe===1.1.1 Werkzeug==1.0.1

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

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

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

    このファイルは、デプロイ中にライブラリをインストールするよう 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/ を開きます。実行中のアプリケーションが表示され、インデックスページが表示されます。

サーバーログをチェックして、リクエストからの出力を確認します。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.6 flask-tutorial --region us-east-2 Application flask-tutorial has been created.

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

  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 のいずれかをウェブアプリケーションの前にリバースプロキシとして配置します。そのプロキシがリクエストをアプリケーションに転送し、静的アセットを提供し、アクセスログとエラーログを生成します。

    重要

    Let's Encrypt クロス署名 DST Root CA X3 証明書は 2021 年 9 月 30 日有効期限切れになりました。このため、Amazon Linux 2 および Amazon Linux AMI オペレーティングシステムで実行されている Beanstalk 環境は、Let's Encrypt 証明書を使用してサーバーに接続できない場合があります。

    2021 年 10 月 3 日、Elastic Beanstalk では、更新された CA 証明書を使用して Amazon Linux AMI および Amazon Linux 2 の新しいプラットフォームバージョンをリリースしました。これらのアップデートを受け取り、この問題に対処するには、管理された更新をオンにするか、プラットフォームを手動で更新します。詳細については、AWS Elastic Beanstalk リリースノートプラットフォーム更新のリリースノートを参照してください。。

    この AWS ナレッジセンターの記事に説明されている手動回避策を適用することもできます。Elastic Beanstalk はロックされた GUID を AMI に提供するため、記事に記載されている sudo yum install コマンドを使用することをお勧めします。システムを手動で変更する場合は、代わりに記事に記載された sudo sed コマンドを使用することもできます。

  • インスタンスセキュリティグループ – ポート 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 によって管理されます。環境を終了すると、Elastic Beanstalk は含まれているすべてのリソースを終了します。

注記

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

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

~/eb-flask$ eb open

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

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

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

Cleanup

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

Elastic Beanstalk 環境を終了するには

  1. Elastic Beanstalk コンソールを開き、[Regions] (リージョン) リストで AWS リージョンを選択します。

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

    注記

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

  3. [環境アクション] を選択してから、[環境の終了] を選択します。

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

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

EB CLI の場合:

~/eb-flask$ eb terminate flask-env

次のステップ

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

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