第2回 作りながら覚えるFlask+Pipenv 〜Zappaを使用してAWSへのデプロイ〜

#概要
●記事一覧
<a href="https://qiita.com/ryohei0109_develop/items/b726efe02424e655e819">第1回 作りながら覚えるFlask+Pipenv 〜フォルダごとのURLルーティングについて〜</a>
第2回 作りながら覚えるFlask+Pipenv 〜Zappaを使用してAWSへのデプロイ〜 ※本記事
<a href="https://qiita.com/ryohei0109_develop/items/493f93de86edc1c4a858">第3回 作りながら覚えるFlask+Pipenv 〜AWSへのデプロイ後、ドメインでアクセスできるように設定〜</a>


前回作成したFlaskアプリケーションをZappaを使用してAWSへデプロイしていきます。
※あらかじめAWSアカウントはご準備下さい。

#手順1. AWS ポリシー作成
ZappaからAWSにアクセスするにあたり、
セキュリティ対策のために必要最低限の権限(ポリシー)を作成します。

・AWSへアクセスし、IAMサービスに移動
![スクリーンショット 2021-02-18 14.21.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/39660097-e7be-272d-d1f6-f026a6bb96e9.png)

・レフトナビから「ポリシー」をクリック
<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/7c18219a-a61e-c9d1-e0b5-8243c1e3c07a.png">

・「ポリシーの作成」をクリック
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/09049fb9-1530-a641-f6cd-681067f97b0e.png">

・「JSON」タブをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/0610d118-5754-654e-de77-2219b8362303.png">

・以下ポリシールールをコピペ

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:*",
                "cloudfront:*",
                "s3:*",
                "apigateway:*",
                "logs:*",
                "route53:*",
                "lambda:*",
                "cloudformation:*",
                "dynamodb:*",
                "events:*"
            ],
            "Resource": "*"
        }
    ]
}
```

・画面右下の「次のステップ:タグ」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/19f26832-1c49-9427-3165-5754ffd9ecc3.png">

・画面右下の「次のステップ:確認」をクリック
※今回はタグは設定しません。
![スクリーンショット 2021-02-18 14.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/6df245c0-f238-01d5-393f-6c667ad8db17.png)

・任意のポリシーの名前を入力
![スクリーンショット 2021-02-18 14.32.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/42c5c841-d27b-6b7f-d0ef-887618841ab3.png)

・最後に画面右下の「ポリシーの作成」をクリックし、ポリシー作成完了

#手順2. AWS IAM作成
手順1で作成したポリシーを設定したIAMを作成します。
AWS IAMとは、AWSを操作するためのアカウントのことです。

・IAMの画面のレフトナビで「ユーザー」をクリック
<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/c29b75d3-782f-ee7c-2527-09179d39bde8.png">

・画面上部の青い「ユーザーを追加」ボタンをクリック
![スクリーンショット 2021-02-18 14.39.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/953f2646-a2ef-89c1-ee0d-45fa6cd01e8a.png)

・任意の「ユーザー名」を入力
・「プログラムによるアクセス」にチェック
・画面右下の青い「次のステップ:アクセス権限」ボタンをクリック
![スクリーンショット 2021-02-18 14.40.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/c4bd0515-656a-10f2-3565-49a624172ad4.png)

・「既存のポリシーを直接アタッチ」をクリック
・先程作成したポリシーにチェック
・画面右下の青い「次のステップ:タグ」ボタンをクリック
![スクリーンショット 2021-02-18 14.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/8dd27c39-35a3-f9f0-9fea-34ffceafe2e6.png)

・画面右下の青い「次のステップ:確認」ボタンをクリック
※今回はタグは設定しません。
![スクリーンショット 2021-02-18 14.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/3452b054-76be-dc3c-d678-69f5aead7a97.png)

・最終確認画面が表示されるので、問題なければ画面右下青い「ユーザーの作成」ボタンをクリック
![スクリーンショット 2021-02-18 14.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/0bce1539-3432-8927-80b8-685b3ec66238.png)

・ユーザーの作成が完了すると、このユーザーを使用してAWSへアクセスするための「アクセスキーID」および「シークレットアクセスキー」が表示されます。
・「.csvのダウンロード」ボタンからキーをダウンロードできるので、大切に保管しておきましょう。
※アクセスキーID及びシークレットアクセスキーは、ユーザー作成直後のこの画面でしか確認できないため、必ずダウンロードもしくはメモをとるようにしましょう。
もしメモを忘れた場合は、新しくユーザーを作成し直す必要があります。
![スクリーンショット 2021-02-18 14.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694199/dd243747-1a9f-aae1-acac-8f2cf5917517.png)

#手順3. AWS CLIインストール
AWS CLIとは、AWSをコマンドから操作するためのパッケージです。
下記コマンドでインストールできます。

```
% pipenv install awscli
```

#手順4. AWS CLI設定
AWS CLIのインストールが完了したら、
手順2で取得したアクセスキーID及びシークレットキーを用いて、プロファイルの設定を行います。

プロファイル設定コマンド
※「Flask-Sample」の部分は任意の名前で大丈夫です。

```
% aws configure --profile Flask-Sample
```
すると

```
AWS Access Key ID [None]:
```
と聞かれるので、AWSのユーザー作成完了画面でメモしたアクセスキーを貼り付け、Enter。

```
AWS Secret Access Key [None]:
```
次はシークレットアクセスキーを聞かれるので、
先程と同様、AWSのユーザー作成完了画面でメモしたものを貼り付け、Enter。

```
Default region name [None]:
```
次はリージョンを聞かれるので、東京リージョンを表す

```
ap-northeast-1
```
を入力してEnter。
※AWSでは東京、香港等どのリージョンのサービスを使うか指定できます。

```
Default output format [None]: 
```

最後に出力するフォーマットを聞かれるので、

```
json
```
と入力してEnter。

これでAWS CLIのプロファイルの設定は完了したので、
コマンドからAWSの操作ができるようになります。


#手順5. Zappaインストール
続いてZappaをインストールします。
Zappaとは、AWSのLambdaやAPI Gateway等のサービスを利用して、アプリを構築するPythonのサーバーレスフレームワークです。
Zappaを利用することにより、各サービスの細かい設定をしなくても手軽にサーバーレスアプリをデプロイできます。

インストールは下記コマンドでOK。

```
% pipenv install zappa
```

#手順6. Zappa config設定
Zappaを用いてAWSへデプロイするために、設定ファイルを作成します。
まずは下記コマンドでZappaの設定ファイルを生成していきます。

```
% zappa init
```

```
What do you want to call this environment (default 'dev'):
```
デプロイ環境の名前を聞かれるので、そのままでよければEnter。
任意の名前をつけてもOK。

```
We found the following profiles: test1, test2, Flask-Sample, and default. Which would you like us to use? (default 'default'): 

```

手順4のプロファイル設定時に入力したプロファイル名を入力しEnter。
今回の例では「Flask-Sample」と入力します。

```
What do you want to call your bucket? (default 'zappa-2hhgpln8q'):
```
続いてソースコードをアップロードするS3のバケット名を聞かれます。
ランダムに生成された名前でもよければこのままEnter。
※「S3」とは「Simple Storage Service」の頭文字S3つをとって、「S3」といいます。
　AWSのストレージサービスのことをさします。

```
Where is your app's function? (default 'flask_sample.__init__.app'):
```
次にFlaskアプリケーションの起動ファイルを聞かれます。
今回は察してくれているように「\_\_init\_\_.app」なのでこのままEnter。

```
Would you like to deploy this application globally? (default 'n') [y/n/(p)rimary]:
```
次にAPI Gatewayのアクセスについて、グローバルに最適化するかどうか聞かれます。
今回はそこまでのパフォーマンスは必要ないのでデフォルトでこのままEnter。

```
Does this look okay? (default 'y') [y/n]:
```
最後に確認してくれるので、問題なければこのままEnter。
するとアプリケーションフォルダ内に「zappa_settings.json」ファイルが自動生成されます。


#手順7. AWSへデプロイ
いよいいよAWSへデプロイします。
といっても、ここまで準備ができたら、あとはコマンド1つで完了です。

```
% zappa delopy
```

少しまってデプロイが完了すると、

```
Your updated Zappa deployment is live!: https://14m3qo7f7d.execute-api.ap-northeast-1.amazonaws.com/dev
```
こんな形でデプロイしたURLが表示されるので、ブラウザからアクセスして表示されれば完了です！

お疲れ様です！

※ちなみに、ソースコードを更新して再度デプロイする場合のコマンドは、

```
% zappa update
```
でできます！

<a href="https://qiita.com/ryohei0109_develop/items/b726efe02424e655e819">第1回 作りながら覚えるFlask+Pipenv 〜フォルダごとのURLルーティングについて〜</a>
第2回 作りながら覚えるFlask+Pipenv 〜Zappaを使用してAWSへのデプロイ〜 ※本記事
<a href="https://qiita.com/ryohei0109_develop/items/493f93de86edc1c4a858">第3回 作りながら覚えるFlask+Pipenv 〜AWSへのデプロイ後、ドメインでアクセスできるように設定〜</a>