目次

zappa

since 2020-08-08

作業環境は Windows 10 version 1909 + WSL

$ /usr/local/bin/python3.8 -m venv venv38
$ . venv38/bin/activate
$ python -m pip install -U pip
$ pip install zappa flask
$ mkdir zappa-200808
$ cd zappa-200808
$ zappa init
$ cat zappa_settings.json
{
    "dev": {
        "app_function": "hello.app",
        "aws_region": "ap-northeast-1",
        "profile_name": "default",
        "project_name": "zappa-200808",
        "runtime": "python3.8",
        "s3_bucket": "zappa-*********"
    }
}

デフォルトの project_name はカレントディレクトの名前

前述URLのコードそのまま

$ cat hello.py
import logging
from flask import Flask

app = Flask(__name__)
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

@app.route('/', methods=['GET', 'POST'])
def hello(event=None, context=None):
    logger.info('Lambda function invoked index()')
    return 'hello from Flask!\n'


if __name__ == '__main__':
    app.run(debug=True)

$ cat requirements.txt
zappa
flask
$ zappa deploy dev
Deploying API Gateway..
Deployment complete!: https://*************

表示される URL で hello.py が動くことを確認できる。

SSL証明書とかカスタムドメインとかにチャレンジする

dev.example.com を作ることにする。example.com はすでに Route 53 で管理しているとする。

「東京」で API Gateway と lambda を動かす場合であっても、 AWS Certificate Manager は「バージニア北部」で作業しなくてはならない。

AWS Certificate Manager にて

成功
DNS レコードは Route 53 ホストゾーンに書き込まれました。変更が反映され、AWS がドメインを検証するまでに最大で 30 分かかる場合があります。

になる。そしてしばらく待つと「発行済み」になる。

この AWS Certificate Manager 画面の ARN が必要。

zappa_settings.json を更新する

$ cat zappa_settings.json
{
    "dev": {
        "app_function": "hello.app",
        "aws_region": "ap-northeast-1",
        "profile_name": "default",
        "project_name": "zappa-200808",
        "runtime": "python3.8",
        "s3_bucket": "zappa-*********",
        "domain": "dev.example.com",
        "certificate_arn": "arn:aws:acm:us-east-1:************:certificate/************************************"
    }
}
$ zappa certify dev
Calling certify for stage dev..
Are you sure you want to certify? [y/n] y
Certifying domain dev.example.com..
Created a new domain name with supplied certificate. Please note that it can take up to 40 minutes for this domain to be created and propagated through AWS, but it requires no further work on your part.
Certificate updated!

Route 53 を見ると、当該ゾーンに ACM の DNS 認証と、dev サブドメインの CNAME (cloudfront.net) が設定されている。

しばらくすると

https://dev.example.com/

でさきほどの hello.py が動く。

ちなみにバージニア北部の ACM を使わなかった場合はこうなる

botocore.errorfactory.BadRequestException: An error occurred (BadRequestException) when calling the CreateDomainName operation: Invalid certificate ARN: arn:aws:acm:ap-northeast-1:*************:certificate/***************************************. Certificate must be in 'us-east-1'.

zone apex 対応

since 2021-10-12

カスタムドメインでサブドメインのないホスト名 (zone apex) を使えるのか?

やってみたらできた。

ただし Route 53 がちょっと面白い感じになる。

CNAME ではなく A レコードで hoge.cloudfront.net なのだ。。これが「エイリアスレコード」というやつらしい。

https://dev.classmethod.jp/articles/amazon-route-53-alias-records/

なお www.example.comexample.com をひとつの zappa プロジェクトでカバーする方法は今のところ見つけていない。

うまくいっている方法は下記

よく考えたら www subdomain と zone-apex をそれぞれ stage としてひとつのプロジェクトからデプロイできそうな気がする。。

(コンテンツを切り替えたい場合は Flask 側で切り替える)

Python 3.9 対応

https://github.com/zappa/Zappa/releases/tag/0.54.0 で対応したという話