Nim + AWS Lambda + API GatewayでサーバレスAPIを作る
作ったもの
slackbot (Slash command) を作っただけ 用語
カスタムランタイムと関数というワードがでてくる
カスタムランタイムはユーザが自分で作るランタイムのこと
通常のランタイムはAWSが管理してるランタイムのこと 逆にいうと、ここに載っていない言語を使いたい場合はカスタムランタイムを作成する必要がある
関数
数学でいう関数ではなく、AWSの機能として「関数」と呼ばれているもの
サーバレスに動作する小さなプログラム
カスタムランタイムを作る
カスタムランタイムではプログラムの始点が必要で、bootstrapという名前の実行可能ファイルが必要
この名前は固定
カスタムランタイムはzipファイルでアップロードする
zip直下にbootstrapが必要
作る時はzip bootstrap.zip bootstrapとかって実行して作ることになる
作ったZipファイルはAWS Lambdaのコンソールのレイヤーとして登録する
レイヤーとして登録すると、なんらかのAWS Lambda関数を作るときにレイヤーを関数にマージできる
AWS Lambdaで任意の言語を使うときはカスタムランタイムとしてbootstrapを毎回作らないといけない
でも関数ごとにbootstrap作って配置するのはダルいので、レイヤーにカスタムランタイムだけ作っておいて、関数にレイヤーをマージすることで無駄を省ける、というものらしい
関数を作る
Nimで作るので実行可能ファイルをビルドしてZIPで固めてアップロードするだけでよい 注意点として、実行可能ファイルの実行に必要な依存ライブラリがLambdaの実行環境に存在しなくてエラーになったり、SSLで実行時エラーになった
遭遇したエラーは以下の通り
Error: unhandled exception: SSL support is not available. Cannot connect over SSL. Compile with -d:ssl to enable. HttpRequestError Slackのresponse_urlに返すときにhttps通信が必要
Nimではhttps通信をさせたいときはビルドするときに-d:sslというフラグをわたしてビルドしないと実行時にエラーになる
./randombot: /lib64/libc.so.6: version `GLIBC_2.27' not found (required by ./randombot)
Lambdaの実行環境にglibcが存在しない
仕方ないのでmuslというパッケージを使ってstatic buildしてglibcを動的にロードしないようにした
code:bash
apt update -y
apt install -y musl-tools
ただしこれだけだとまだ問題がある(後述)
could not load: libcrypto.so(.1.1|.1.0.2|.1.0.1|.1.0.0|.0.9.9|.0.9.8|.48|.47|.46|.45|.44|.43|.41|.39|.38|.10|)
どうもmuslを使った静的ビルドが不十分だったらしく、https通信時にlibcrypt.soを探しにいっていた
このへんの静的ビルド用のNimのオプション周りは全然把握していないので、すでにあるスクリプトに頼った
muslを使った静的ビルドをかなり網羅したもの
config.nimsとしてリポジトリに配置すれば、ビルドタスクとして使い回せる
結果
https://gyazo.com/de0a5c943f1e6598f268b23d324397d9
こんな感じで結果が返ってくるだけのbotができた
役に立つかどうかは不明だけれど、サーバレスなアプリが作れたので満足している