ElixirをAWS Lambdaにコンテナでデプロイするためのサンプル手順
はじめに
ElixirをAWS Lambdaにて動かしたい!
そう思ったきよまるが先人達の情報を頼りに構築したメモになります。
下記の事前準備から実施していくとサンプルアプリをデプロイできるようになっています。
下記の資料を中心に構築作業を行いました。
手順
事前準備
- dockerがインストールされていること
- awscliがインストールされていること(APIキーも設定済み)
なお、今回の手順ではM1/M2のMacは対応していません。
Elixirをlambdaで実行するためにコンテナを作成する
まずは下記のリポジトリをcloneしてきます。
手動でビルド手順を実行すると煩雑になるためシェルスクリプトにまとめました。
今回はこれを実行してプレビルドなどをやっていきます。
コンテナのプレビルド→lambdaにデプロイするためのコンテナをビルドする
export ENVIRONMENT=hogehoge
bash container-builder.sh $ENVIRONMENT
コンテナ内に設定する環境変数を引数としてサンプルではENVIRONMENTとしています。
ローカル環境で実行
起動
docker run --rm -p 9000:8080 lambda-elixir-sample:latest
動作確認コマンド
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"key1":"kiyo","key2":"maru"}'
※リクエストを受けたらそれを大文字にして返すLambdaです。
ECRにビルドしたコンテナイメージをpush
xxxxxxxxxxxx:AWSアカウントID
default: AWSのプロファイル名。defaultのみの想定のためdefaultを指定
aws ecr get-login-password --region ap-northeast-1 --profile default | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
aws ecr create-repository \
--repository-name lambda-elixir-sample \
--image-scanning-configuration scanOnPush=true \
--region ap-northeast-1 \
--profile default
docker tag lambda-elixir-sample:latest xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/lambda-elixir-sample
docker push xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/lambda-elixir-sample:latest
lambdaにデプロイ
AWSのコンソールから作っていきます。
本来はawscliがいいのですが時間の関係上GUIで設定をします。
3.ECRリポジトリ(のDockerイメージ)からビルドする手順を参照
動作確認
AWSコンソール>Lambda>今回作ったLambdaを選択>テストから実行
リクエストが大文字に帰ってくれば成功
各種ファイルの解説
// TODO 作成中
まとめ
2023/03/06時点でひとまず動くコンテナ環境を構築する手順ができました。
これをベースに作っていければと思います。
現状はM1/M2のMacだとcontainer-builder.shのdocker exec elx bash -c "mix deps.get;" でセグフォが発生して動かないので注意です。
あと、めっちゃ困ったところとしてはmixでconfigを使う場合の書き方が実行環境によってかわるので注意です。
サンプル自体はリポジトリに載せているので底を見ていただければと思います。
このあたりが解消は難しそうですがタイミング見て再調査します。
参考リンク
下記の記事を参考にして構築しました。
Discussion