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


概要

●記事一覧
第1回 作りながら覚えるFlask+Pipenv 〜フォルダごとのURLルーティングについて〜
第2回 作りながら覚えるFlask+Pipenv 〜Zappaを使用してAWSへのデプロイ〜 ※本記事
第3回 作りながら覚えるFlask+Pipenv 〜AWSへのデプロイ後、ドメインでアクセスできるように設定〜

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

手順1. AWS ポリシー作成

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

・AWSへアクセスし、IAMサービスに移動

・レフトナビから「ポリシー」をクリック

・「ポリシーの作成」をクリック

・「JSON」タブをクリック

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

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

・画面右下の「次のステップ:タグ」をクリック

・画面右下の「次のステップ:確認」をクリック
※今回はタグは設定しません。

・任意のポリシーの名前を入力

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

手順2. AWS IAM作成

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

・IAMの画面のレフトナビで「ユーザー」をクリック

・画面上部の青い「ユーザーを追加」ボタンをクリック

・任意の「ユーザー名」を入力
・「プログラムによるアクセス」にチェック
・画面右下の青い「次のステップ:アクセス権限」ボタンをクリック

・「既存のポリシーを直接アタッチ」をクリック
・先程作成したポリシーにチェック
・画面右下の青い「次のステップ:タグ」ボタンをクリック

・画面右下の青い「次のステップ:確認」ボタンをクリック
※今回はタグは設定しません。

・最終確認画面が表示されるので、問題なければ画面右下青い「ユーザーの作成」ボタンをクリック

・ユーザーの作成が完了すると、このユーザーを使用してAWSへアクセスするための「アクセスキーID」および「シークレットアクセスキー」が表示されます。
・「.csvのダウンロード」ボタンからキーをダウンロードできるので、大切に保管しておきましょう。
※アクセスキーID及びシークレットアクセスキーは、ユーザー作成直後のこの画面でしか確認できないため、必ずダウンロードもしくはメモをとるようにしましょう。
もしメモを忘れた場合は、新しくユーザーを作成し直す必要があります。

手順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

でできます!

第1回 作りながら覚えるFlask+Pipenv 〜フォルダごとのURLルーティングについて〜
第2回 作りながら覚えるFlask+Pipenv 〜Zappaを使用してAWSへのデプロイ〜 ※本記事
第3回 作りながら覚えるFlask+Pipenv 〜AWSへのデプロイ後、ドメインでアクセスできるように設定〜