AWS¶
AWS API Gateway + Lambda + mangum + FastAPI な Python アプリケーションに POST された JSON を処理する
以前に mangum + FastAPI で ASGI な Python アプリケーションを AWS Lambda + API Gateway 上で動かすというメモを書きました。 mangum と mangum-cli を使うと FastAPI を使った Web アプリケーションを AWS の Lambda と API Gateway を使って簡単に公開することが出来ます。
mangum-cli が無い場合は作成したアプリケーションを手動でアプリケーションをアップロードする必要があります。 CloudFormation を使うにしてもテンプレートを作成する必要があり、面倒です。 mangum-cli があればこれらの作業を自動化出来、手間なく、迅速にアプリケーションを配置することが出来ます。
FastAPI で REST API のエンドポイントを作成する場合、POST リクエストを受け付ける必要があります。 こういった場合の「POST された JSON を FastAPI な Python アプリケーションで処理する方法」をメモしておきます。
AWS Lambda における S3 Put イベントのサンプル
先日、AWS Lambda で CloudWatch Event からトリガーした場合の event サンプルというメモを書きました。 Lambda のテスト用イベントとして予め用意されている Amazon S3 Put の内容を自分用にメモしておきます。
AWS CLI v2 をインストールし、ページャを無効化する
AWS CLI v2 is now generally available でアナウンスされましたが AWS CLI v2 が正式リリースされました。 従来は pip 経由でインストールしていましたが、v2 からは .zip ファイルをダウンロードし、インストーラを使ったインストール手順に変わっています。
mangum + FastAPI で ASGI な Python アプリケーションを AWS Lambda + API Gateway 上で動かす
mangum を使うと FastAPI や responder といった ASGI アプリケーションを AWS Lambda + API Gateway 上へ簡単にデプロイすることが出来ます。 今回は FastAPI で書いた ASGI アプリケーションを mangum を使って AWS 上でデプロイする手順をメモしておきます。
AWS Lambda で CloudWatch Event からトリガーした場合の event サンプル
AWS Lambda を cron 式で指定時間にトリガーする場合、トリガーには Cloud Watch Event を指定します。 この場合、Lambda のイベントハンドラへ渡される event (JSON オブジェクト) のサンプルは Event Patterns in CloudWatch Events に掲載されています。 実際に CloudWatch Event からトリガーされた場合の event サンプルをメモしておきます。 python-lambda-local からローカル実行する際などにも活用出来ると思います。
python-lambda-local と lambda-uploader を使ってローカル環境で Lambda 開発を行う
AWS の Lambda で開発を行う際、Web 管理コンソール上で開発 / デバッグするのは大変です。 python-lambda-local を使うとローカル環境で Lambda を実行出来、更に lambda-uploader を使うとローカル環境から簡単に Lambda へ関数をアップロードすることが出来ます。 Python の外部ライブラリを使う場合、外部ライブラリを含めた .zip ファイルを作成して Web 管理コンソールからアップロードする必要がありますが、lambda-uploader を使えば .zip ファイルを作成することなく、必要なライブラリもアップロードしてくれます。 今回は python-lambda-local と lambda-uploader の使い方をメモしておきます。
GCP 上で Route53 DNS 認証を使い lego で Let's Encrypt のワイルドカード証明書を取得する
lego を利用して Let's Encrypt の証明書を取得する手順については以前に下記のメモを書きました。
- Cisco ASA 9.1 に Let's Encrypt なワイルドカード証明書を SSL-VPN 用にインポートする
- AmazonLinux2 で lego を使い Route53 認証でサーバ証明書を取得する
- lego で Let's Encrypt の証明書を Route53 DNS 認証で取得する
今回は以下の環境で証明書を取得する手順をメモしておきます。 尚、今回は GCP 上の仮想マシンに CentOS8 を使いました。
- GCP と AWS を併用している
- GCP 上の仮想マシンで証明書を取得する
- 証明書はワイルドカード証明書を取得する
- 証明局は Let's Encrypt を利用する
- 証明書の取得には Route53 による DNS 認証を用いる
- 証明書の取得には
legoを利用する
Lambda 用の .zip ファイルを作成する場合は「zip -r .」を使う方がベター
AWS Lambda で (標準パッケージ以外の) 外部パッケージを利用したい場合は、Python のソースコードと依存するパッケージを .zip アーカイブにして、Lambda へアップロードする必要があります。 詳しくは AWS Lambda Deployment Package in Python に記載されていますが、boto3 だけは例外的に .zip へ含める必要がありません。 AWS の公式ドキュメントでは、依存モジュールを .zip アーカイブへ含める際に以下のような手順になっていました。
~/my-function$ pip install --target ./package Pillow
~/my-function/package$ zip -r9 ${OLDPWD}/function.zip .
~/my-function/package$ cd $OLDPWD
~/my-function$ zip -g function.zip lambda_function.py
ネット上の公開情報では zip -r * しているケースをよく見るのですが、bash で作業する場合、これでは . で始まる隠しファイル/隠しディレクトリは .zip ファイルに含まれません。 これらを含めたい場合は AWS 公式ページにあるように zip -r . とピリオドを使う必要があります。 現在ディレクトリのひとつ上のディレクトリに AWS Lambda アップロード用の .zip ファイルを作成するには、例えば以下のように実行します。
参考
Python の boto3 で S3 とダウンロード/アップロードする
以前に Python の boto3 で S3 の操作を行うサンプルというメモを書きました。 今回はアップロード / ダウンロードサンプルをメモしておきます。