電子書籍 本田崇智著 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
以上