

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

# Elastic Beanstalk への Flask アプリケーションのデプロイ
<a name="create-deploy-python-flask"></a>

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

このチュートリアルでは、以下の作業を行います。
+ [Flask で Python 仮想環境を設定する](#python-flask-setup-venv)
+ [Flask アプリケーションを作成する](#python-flask-create-app)
+ [EB CLI でサイトをデプロイします](#python-flask-deploy) 
+ [クリーンアップ](#python-flask-tutorial-cleanup) 

## 前提条件
<a name="python-flask-prereq"></a>

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

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

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

Linux および macOS では、任意のシェルとパッケージ管理者を使用できます。Windows では、[Linux 用の Windows サブシステムをインストール](https://docs.microsoft.com/en-us/windows/wsl/install-win10)して、Ubuntu および Bash の Windows に統合されたバージョンを入手できます。

このチュートリアルでは、Python 3.11 と対応する Elastic Beanstalk プラットフォームバージョンを使用します。「[Elastic Beanstalk 用の Python 開発環境の設定](python-development-environment.md)」の手順に従って Python をインストールします

チュートリアルのパートとして [Flask](http://flask.pocoo.org/) フレームワークをインストールします。

また、このチュートリアルでは、Elastic Beanstalk コマンドラインインターフェイス (EB CLI) も使用します。EB CLI をインストールおよび設定する手順の詳細については、「[セットアップスクリプトを使用して EB CLI をインストールする (推奨)](eb-cli3.md#eb-cli3-install)」および「[EB CLI の設定](eb-cli3-configuration.md)」を参照してください。

## Flask で Python 仮想環境を設定する
<a name="python-flask-setup-venv"></a>

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

**プロジェクト環境をセットアップするには**

1. プロジェクトディレクトリを作成します。

   ```
   ~$ mkdir eb-flask
   ~$ cd eb-flask
   ```

1. `virt` という名前の仮想環境を作成してアクティブ化します。

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

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

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

   ```
   (virt)~/eb-flask$ pip install flask==3.0.3
   ```

1. `pip freeze` で、インストールされているライブラリを表示します

   ```
   (virt)~/eb-flask$ pip freeze
   blinker==1.8.2
   click==8.1.7
   Flask==3.0.3
   importlib_metadata==8.5.0
   itsdangerous==2.2.0
   Jinja2==3.1.4
   MarkupSafe==2.1.5
   Werkzeug==3.0.4
   zipp==3.20.2
   ```

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

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

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

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

## Flask アプリケーションを作成する
<a name="python-flask-create-app"></a>

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

このディレクトリに、`application.py` という名前と以下の内容で新しいテキスト・ファイルを作成します。

**Example `~/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.\]](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/images/eb_flask_test_local.png)


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

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

## EB CLI でサイトをデプロイします
<a name="python-flask-deploy"></a>

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

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

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

**Example \$1/eb-flask/.ebignore**  

```
virt
```

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

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

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

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

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

1. （オプション）**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** を実行します。

1. 環境を作成し、**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 グループはレスポンスとしてスケールアップまたはダウンを行います。
+ **CloudFormation スタック** – Elastic Beanstalk は CloudFormation を使用して環境内のリソースを起動し、設定変更を伝達します。リソースは、[CloudFormation コンソール](https://console.aws.amazon.com/cloudformation)に表示できるテンプレートで定義されます。
+ **ドメイン名** – ウェブ・アプリケーションまでのルートとなるドメイン名であり、**subdomain*.*region*.elasticbeanstalk.com* の形式です。
**ドメインセキュリティ**  
Elastic Beanstalk アプリケーションのセキュリティを強化するため、*elasticbeanstalk.com* ドメインは[パブリックサフィックスリスト (PSL)](https://publicsuffix.org/) に登録されています。  
Elastic Beanstalk アプリケーションのデフォルトドメイン名に機密性のある Cookie を設定する必要がある場合は、セキュリティ強化のため `__Host-` プレフィックスの付いた Cookie の使用をお勧めします。このプラクティスは、クロスサイトリクエストフォージェリ (CSRF) 攻撃からドメインを防御します。詳細については、Mozilla 開発者ネットワークの「[Set-Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes)」ページを参照してください。

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

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

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

```
~/eb-flask$ eb open
```

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

![\[Browser window displaying a Flask web application with a "Hello World!" message and usage hint.\]](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/images/eb_flask_deployed.png)


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

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

## クリーンアップ
<a name="python-flask-tutorial-cleanup"></a>

デモコードの操作が完了したら、環境を終了できます。Elastic Beanstalk は、[Amazon EC2 インスタンス](using-features.managing.ec2.md)、[データベースインスタンス](using-features.managing.db.md)、[ロードバランサー](using-features.managing.elb.md)、セキュリティグループ、[アラーム](using-features.alarms.md#using-features.alarms.title)など、関連するすべての AWS リソースを削除します。

リソースを削除しても Elastic Beanstalk アプリケーションは削除されないため、いつでもアプリケーションの新しい環境を作成できます。

**コンソールから Elastic Beanstalk 環境を終了するには**

1. [Elastic Beanstalk コンソール](https://console.aws.amazon.com/elasticbeanstalk)を開き、**リージョン**リストで を選択します AWS リージョン。

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

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

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

EB CLI の場合:

```
~/eb-flask$ eb terminate flask-env
```

## 次の手順
<a name="python-flask-more-info"></a>

Flask の詳細については、[flask.pocoo.org](http://flask.pocoo.org/) を参照してください。

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