この記事について
Lambda初心者(WorkShopでは触ったことがあるが、実際の開発ではつかったことがない人)がちょっとしたアプリの実装をやってみた際の迷い、詰まり、学びをつらつらと書きます。
作っているもの
Googleカレンダーのその日の予定を確認し、お昼ご飯が食べられる時間をずんだもんが教えてくれるBot。
お昼ご飯が食べられないとかなしいのだ。
構成図(計画性低)
とりあえずここまで実装してみました。
迷い&詰まり&学びポイント
Lambda-Layersをどう構成するか?
Lambdaのランタイムはサイズを小さくするために必要最小限の構成になっています。
そのため必要なライブラリやパッケージは自分でLambda-Layersに配置する必要があります。
今回の実装ではPythonを利用しましたが、Pythonの場合はpipでインストールしたパッケージをzipに固めてLambda-Layersにアップロードし、関数に関連付けをする必要があります。
また実装の内容としてはGoogleCalendarから空き時間を取得して計算するため、GoogleのAPIを扱うライブラリやタイムゾーンを扱うパッケージが必要でした。
GoogleのAPIはともかくタイムゾーンにも必要だとほとんどの実装で配置することになりそうなので、zipに固めてアップするという手順はやや面倒に感じました。
また今回のような小さな実装では特に問題はなかったですが、たくさんのLambdaを組み合わせて大きな実装をする際にはどのような構成にするか迷いそうだな、と感じました。
1つの関数に関連付けできるLambda-Layersは5つまでとなっており、Lambda-Layers内のパッケージは重複してもエラーになることは無いようだったので、用途に応じたパッケージの固まりをLambda-Layersにしておいて、利用するのが良いのかなと思いました。
参考
例)
- Google Calendarを利用する関数で使うパッケージのLambda-Layers
- Googleの認証用のパッケージ
- Google Calendar用のパッケージ
- Google Driveを利用する関数で使うパッケージのLambda-Layers
- Googleの認証用のパッケージ
- Google Drive用のパッケージ
認証用のパッケージは重複するが気にしない
コンテナを利用したLambda
今回の実装ではずんだもんに喋ってもらうため実行環境にVOICEVOXが必要でした。
通常のLambdaのランタイムではできないため、VOICEVOXをインストールしたコンテナイメージを作成し、そのイメージをLambdaで実行する形にしました。
こちらは先人がいらっしゃったため、かなりすんなり進みました。
大変助かりました!ありがとうございます!!
ただ私の知識不足からいくつか詰まったポイントがあったので恥ずかしながら記載します。
ECRのPublic registryとPrivate registryの違い
料金を確認したところPublic registryの方が安かったため、イメージはPublic registryに配置しようと思いました。
しかしそもそもLambdaではPublic registryのイメージは利用できませんでした。
これを知らず、Lambdaの実装を聞いたコンテキストがある状態で、ChatGPTに「ECRへのイメージの配置方法を教えて」と聞きながら実装を進めていました。
そのためPrivate registryへの配置と判断され、なかなかうまくいきませんでした。
ただ何度かやりとりをしてPublic registryにイメージを配置したいことが伝わると、コマンドが違うことを強調して教えてくれたりして、助かりました。
思い込みもあったのですが、個人的にはコマンドが違うことにはちょっとおどろきました。
その後Lambdaでイメージを指定しようとしてできなかった時。
Public registryとPrivate registryの違いを学習できました。
Public registry
- CLIのコマンドは
aws ecr-public
- IAMポリシーのPrefixは
ecr-public
- Regionは
us-east-1
のみ - Lambdaの実行イメージとしては使えない
- 料金はほぼかからない
Private registry
- CLIのコマンドは
aws ecr
- IAMポリシーのPrefixは
ecr
- Regionは任意のリージョンを選択できる
- Lambdaの実行イメージとして使える
- 料金はちょっとかかる(4GBのイメージで月50円ぐらい)
ちゃんとマニュアルを読みましょう。
初期タイムアウト設定は3秒
これはWorkShopやJAMイベントでも頻出なので、進研ゼミでやったやつだ!
という感じですが、Lambdaの初期タイムアウト時間は3秒です。
音声ファイルを扱ったりするバッチ処理的なものだとほぼタイムアウトするため伸ばす必要があります。
つづく。