ElixirをAWS Lambdaにコンテナでデプロイするためのサンプル手順

2023/03/06に公開

はじめに

ElixirをAWS Lambdaにて動かしたい!
そう思ったきよまるが先人達の情報を頼りに構築したメモになります。
下記の事前準備から実施していくとサンプルアプリをデプロイできるようになっています。

下記の資料を中心に構築作業を行いました。
https://qiita.com/RyoWakabayashi/items/366b05239af67b128f43

手順

事前準備

  • dockerがインストールされていること
  • awscliがインストールされていること(APIキーも設定済み)

なお、今回の手順ではM1/M2のMacは対応していません。

Elixirをlambdaで実行するためにコンテナを作成する

まずは下記のリポジトリをcloneしてきます。
https://github.com/kiyomaryu/aws-lambda-run-elixir-container-sample

手動でビルド手順を実行すると煩雑になるためシェルスクリプトにまとめました。
今回はこれを実行してプレビルドなどをやっていきます。

コンテナのプレビルド→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イメージ)からビルドする手順を参照
https://qiita.com/sasaco/items/b65ce36c05c50a74ac3e#3lambda関数に-amazon-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を使う場合の書き方が実行環境によってかわるので注意です。
サンプル自体はリポジトリに載せているので底を見ていただければと思います。
このあたりが解消は難しそうですがタイミング見て再調査します。

参考リンク

下記の記事を参考にして構築しました。

https://qiita.com/erin/items/2aa7a70c34b0b2a64e5b
https://qiita.com/RyoWakabayashi/items/366b05239af67b128f43
https://qiita.com/torifukukaiou/items/10661ee167ec2d2fe99b
https://hexdocs.pm/elixir/main/Config.html#module-config-runtime-exs
https://blog.emattsan.org/entry/2019/10/20/131228
https://elixir-lang.org/getting-started/mix-otp/config-and-releases.html
https://qiita.com/saitotak/items/d2ede050e7a2224da46d#fn1
https://docs.google.com/presentation/u/1/d/1QDykDwy_92r2KUDSCZCHbOo5d_wAgTN8BW63DS_oQjQ/htmlpresent
https://twitter.com/kiyomaryu/status/1626093385261133827?s=20

GitHubで編集を提案

Discussion