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'.
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.com
と example.com
をひとつの zappa プロジェクトでカバーする方法は今のところ見つけていない。
うまくいっている方法は下記
www.example.com
用の zappa プロジェクト(ACM で証明書を作るときに example.com
もカバーする証明書を作る)example.com
用の zappa プロジェクト(証明書のARNは上記を再利用)よく考えたら www subdomain と zone-apex をそれぞれ stage としてひとつのプロジェクトからデプロイできそうな気がする。。
(コンテンツを切り替えたい場合は Flask 側で切り替える)