Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Docker+Zappa+Flask+AWSでサーバーレスWebアプリ構築を手軽に体験する

More than 1 year has passed since last update.

電子書籍 本田崇智著 Pythonで作るはじめてのサーバレスアプリケーション Kindle版(以降、書籍)を参考に、書籍内で紹介されている手順を一部アレンジしつつ、Flaskを利用したサーバーレスWebアプリのサンプルをAWSに構築した際の手順メモ。

  • 本記事では、書籍内の章構成のうち「PipEnvの導入」章から「サーバレスアプリケーションを導入する」章までの手順をトレースしつつ、サーバーレスWebアプリの構築を手軽に素早く行えるようアレンジした手順を紹介している。
  • 本記事の手順中で書籍の参照を必要とする項目があるため、Kindleで書籍を購入済みであることを前提とする。なお、書籍はKindle Unlimited対象本(2019/6/1現在)である。
  • Macのマシン環境を汚さないように、コード作成からZappaによるAWSへのデプロイまでをDockerコンテナ上で完結させている。(書籍のオリジナルの手順ではMacローカル上に直接環境を作成している)
  • 書籍の著者がGithubで公開している書籍向けのサンプルコードをgit cloneし、コード作成を省略している。(書籍のオリジナルの手順ではひとつひとつのコードを解説しながら作成している)
  • PynamoDBによるローカルでのWebアプリ動作確認は省略している。

2019/6/19更新:
Zappa、Flalsk、PynamoDBに対する理解が少し深まったため、手順を大きく見直した。(見直し前の手順は記事末尾に残してあります。)

環境

  • OSX 10.13.6
  • Docker Desktop for Mac 2.0.0.3
  • Amazon Web Services(リージョン:ap-northeast-1)

手順

AWS IAMの作成

1.「AWS IAMの作成」章(書籍内60%位置付近)を参考に、アプリ(Lambda関数)がDynamoDBにアクセスするためのAWS IAMを作成。
2.「zappa用のAWS IAMの作成」章(書籍内65%位置付近)を参考に、ZappaがDocker上からAWSにアプリをデプロイするためのAWS IAMを作成。

MAC上のターミナルでDockerコンテナの作成

3.Python3.6の公式イメージを利用してコンテナを作成、ログイン

$ docker run -it python:3.6 /bin/bash

Dockerコンテナ上のbashでコード作成、デプロイ

4.サンプルコードをダウンロード

$ git clone https://github.com/chaingng/serverless_python_tutorial.git

5.applicationフォルダに移動

$ cd serverless_python_tutorial/application

6.Pipenvのインストール。Zappaを利用するのに仮想環境が必要

$ pip install pipenv

7.Python3仮想環境の初期化

$ pipenv --three

8.Pipenvシェル有効化

$ pipenv shell

9.Pipfileに記載のパッケージをインストール

$ pipenv install

10.AWS CLIをインストール

$ pipenv install awscli

11.AWS CLIプロファイルを作成

$ aws configure

上記コマンドを実行すると対話式で入力を求められるので以下のように入力。

AWS Access Key ID [None]: [項番2で作成したIAMアクセスキーID]
AWS Secret Access Key [None]: [項番2で作成したIAMシークレットアクセスキー]
Default region name [None]: ap-northeast-1
Default output format [None]: #Enter押下

12.環境変数の設定。

$ export SERVERLESS_BLOG_CONFIG=production

13.DynamoDBテーブルの作成

$ python manage.py init_db

14.変数の指定

$ SERVERLESS_USER=[本番環境でのユーザーログインパスワード(任意の文字列)]
$ SERVERLESS_SECRET_KEY=[本番環境でのsecret(任意の文字列)]
$ SERVERLESS_AWS_ACCESS_KEY_ID=[項番1で作成したIAMアクセスキーID]
$ SERVERLESS_AWS_SECRET_KEY=[項番1で作成したIAMシークレットアクセスキー]

15.Zappa設定ファイルを編集

$ cat << EOF > zappa_settings.json
{
    "dev": {
        "app_function": "server.app",
        "aws_region": "ap-northeast-1",
        "project_name": "application",
        "runtime": "python3.6",
        "s3_bucket": "serverless-blog-bucket-$RANDOM"
        "environment_variables": {
            "SERVERLESS_BLOG_CONFIG":"production",
            "SERVERLESS_USER_PW":"${SERVERLESS_USER}",
            "SERVERLESS_SECRET_KEY":"${SERVERLESS_SECRET_KEY}",
            "SERVERLESS_AWS_ACCESS_KEY_ID":"${SERVERLESS_AWS_ACCESS_KEY_ID}",
            "SERVERLESS_AWS_SECRERT_KEY":"${SERVERLESS_AWS_SECRET_KEY}"
        }
    }
}
EOF

16.Docker上のコードをAWSへデプロイ

$ zappa deploy

動作確認

前項13の実行結果に表示されるURLhttps://xxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/devにブラウザでアクセス。

アクセスできた。
ユーザ名(john)とパスワード(本番環境でのユーザーログインパスワード)でログインしてみる。

ログインできた。

新規投稿してみる。

新規投稿できた。

続きを読んで見る。

編集してみる。

編集できた。

後始末

デプロイしたWebアプリをAWS上から削除したい場合は、以下を実行

$ zappa undeploy dev

S3バケットはundeployコマンドで削除されないため、下記より手動で削除
https://s3.console.aws.amazon.com/s3/home

2019/6/8追記:
Lambda実行用のIAMも自動で削除されないため、下記より手動で削除
https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles

2019/6/19追記:
DynamoDBテーブルも自動で削除されないため、下記より手動で削除
https://ap-northeast-1.console.aws.amazon.com/dynamodb/home?region=ap-northeast-1#tables

手順(見直し前)

クリックで展開

AWS IAMの作成

1.「AWS IAMの作成」章(書籍内60%位置付近)を参考に、アプリがDynamoDBにアクセスするためのAWS IAMを作成。
2.「zappa用のAWS IAMの作成」章(書籍内65%位置付近)を参考に、ZappaがAWSにコードをデプロイするためのAWS IAMを作成。

MAC上のターミナルでDockerコンテナの作成

3.Python3.6の公式イメージを利用してコンテナを作成、ログイン

$ docker run -it --name pyserverless python:3.6 /bin/bash

Dockerコンテナ上のbashでコード作成、デプロイ

4.Pipenvのインストール。Zappaを利用するのに必要

$ pip install pipenv

5.サンプルコードをダウンロード

$ git clone https://github.com/chaingng/serverless_python_tutorial.git

6.applicationフォルダに移動

$ cd serverless_python_tutorial/application

7.Python3仮想環境の初期化

$ pipenv --three

8.Pipenvシェル有効化

$ pipenv shell

9.変数の指定

$ SERVERLESS_USER=[本番環境でのユーザーログインパスワード(任意の文字列)]
$ SERVERLESS_SECRET_KEY=[本番環境でのsecret(任意の文字列)]
$ SERVERLESS_AWS_ACCESS_KEY_ID=[項番1で作成したIAMアクセスキーID]
$ SERVERLESS_AWS_SECRET_KEY=[項番1で作成したIAMシークレットアクセスキー]

10.Pipfileに記載のパッケージとAWS CLIをインストール

$ pipenv install
$ pipenv install awscli

11.bashrcの設定

$ cat << EOF >> ~/.bashrc
export SERVERLESS_BLOG_CONFIG=production
export SERVERLESS_USER=${SERVERLESS_USER}
export SERVERLESS_SECRET_KEY=${SERVERLESS_SECRET_KEY}
export SERVERLESS_AWS_ACCESS_KEY_ID=${SERVERLESS_AWS_ACCESS_KEY_ID}
export SERVERLESS_AWS_SECRET_KEY=${SERVERLESS_AWS_SECRET_KEY}
EOF

12.bashrc読み込み

$ . ~/.bashrc

13.AWS CLIプロファイルを作成

$ aws configure --profile serverless-blog

上記コマンドを実行すると対話式で入力を求められるので以下のように入力。

AWS Access Key ID [None]: [項番2で作成したIAMアクセスキーID]  #を入力
AWS Secret Access Key [None]: [項番2で作成したIAMシークレットアクセスキー] #を入力
Default region name [None]: ap-northeast-1 #を入力
Default output format [None]: #Enter押下

14.Zappa設定ファイルを編集

2019/6/8追記:
S3バケット名の重複エラー回避のため、s3_bucketの値がランダム値となるようにした。

$ cat << EOF > zappa_settings.json
{
    "dev": {
        "app_function": "server.app",
        "aws_region": "ap-northeast-1",
        "profile_name": "serverless-blog",
        "project_name": "application",
        "runtime": "python3.6",
        "s3_bucket": "serverless-blog-bucket-$RANDOM"
        "environment_variables": {
            "SERVERLESS_BLOG_CONFIG":"production",
            "SERVERLESS_USER_PW":"${SERVERLESS_USER}",
            "SERVERLESS_SECRET_KEY":"${SERVERLESS_SECRET_KEY}",
            "SERVERLESS_AWS_ACCESS_KEY_ID":"${SERVERLESS_AWS_ACCESS_KEY_ID}",
            "SERVERLESS_AWS_SECRERT_KEY":"${SERVERLESS_AWS_SECRET_KEY}"
        }
    }
}
EOF

15.Docker上のコードをAWSへデプロイ

$ zappa deploy

以上

r-wakatsuki
クラウド技術(主にAWS)、Docker、Pythonなどの小ネタ中心。
https://dev.classmethod.jp/author/wakatsuki-ryuta/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away