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 が動くことを確認できる。

  • 失敗したデプロイを削除する zappa undeploy dev
  • デプロイ済みのコードを更新する zappa update dev
  • ログを見る zappa tail dev

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

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

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

AWS Certificate Manager にて

  • dev.example.com を入力
  • 「DNSの検証」を選ぶ
  • 出てくる画面で「Route 53 でのレコードの作成」を押す
成功
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.example.com 用の zappa プロジェクト(ACM で証明書を作るときに example.com もカバーする証明書を作る)
  • example.com 用の zappa プロジェクト(証明書のARNは上記を再利用)

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

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

Python 3.9 対応

zappa.txt · 最終更新: 2021/12/01 17:25 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0