ちょうど4日ほど前に、apexにrubyサポートのPRがマージされていた。
なので、すこし試してみた。
apexのビルド
goのバージョンは1.11.4
。
GO111MODULE=on
でビルド・インストールできた。
(apexのmasterをcloneしてから) export GO111MODULE=on make make local
バージョンが更新されないのは、なんでなんだろう…?
$ apex version Apex version 1.0.0-rc2
lambdaファンクションのデプロイ
ディレクトリ構成はこんな感じ。
test ├── functions/ │ └── my_ruby/ │ ├── function.json │ └── lambda.rb └── project.json
デフォルトのファイル名はlamba.rb
でハンドラ名はhandler
。
def handler(event:, context:) {hello: 'world'} end
$ apex deploy my_ruby • config unchanged env= function=my_ruby • updating function env= function=my_ruby • updated alias current env= function=my_ruby version=1 • function updated env= function=my_ruby name=test_my_ruby version=1 $ apex invoke my_ruby {"hello":"world"}
Gemの同梱
bundlerでpathを指定すれば普通にできた。
source 'https://rubygems.org' gem 'hashie'
cd functions/my_ruby/ bundle install --path vendor/bundle
test/ ├── functions/ │ └── my_ruby/ │ ├── Gemfile │ ├── Gemfile.lock │ ├── function.json │ ├── lambda.rb │ └── vendor/ └── project.json
require 'hashie' def handler(event:, context:) {test: Hashie::Mash.new(hello: 'world')} end
require "bundler/setup"
とかは不要なよう。
C拡張の同梱
docker run -v $(pwd):/mnt -w /mnt ruby:2.5 bundle install --path vendor/bundle
とかやったらできるかと思ったら、libruby.so.2.5: cannot open shared object file
でエラー。
Amazon Linuxで拡張を作成しないとだめっぽい?ので、こちらを参考にDockerイメージを作成。
FROM amazonlinux RUN yum -y install \ gcc-c++ \ openssl-devel \ readline \ libyaml-devel \ readline-devel \ zlib \ zlib-devel \ git \ bzip2 \ tar \ make RUN git clone https://github.com/sstephenson/rbenv.git ~/.rbenv && \ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build && \ ~/.rbenv/plugins/ruby-build/install.sh ENV PATH /root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin RUN rbenv install 2.5.3 RUN bash -c 'rbenv init - > /etc/profile' RUN rbenv global 2.5.3 RUN bash -l -c 'gem install bundler' ENTRYPOINT ["bash", "-l", "-c"]
source 'https://rubygems.org' gem 'postfix_status_line'
docker run -v $(pwd):/mnt -w /mnt ruby-for-lambda bundle install --path vendor/bundle
require 'postfix_status_line' def handler(event:, context:) status_line = "Feb 27 09:02:37 MyHOSTNAME postfix/smtp[26490]: D53A72713E5: to=<myemail@bellsouth.net>, relay=gateway-f1.isp.att.net[204.127.217.16]:25, conn_use=2, delay=0.57, delays=0.11/0.03/0.23/0.19, dsn=2.0.0, status=sent (250 ok ; id=20120227140036M0700qer4ne)" {parsed: PostfixStatusLine.parse(status_line)} end
$ apex deploy my_ruby • config unchanged env= function=my_ruby • updating function env= function=my_ruby • updated alias current env= function=my_ruby version=3 • function updated env= function=my_ruby name=test_my_ruby version=3 $ apex invoke my_ruby {"parsed":{"time":"Feb 27 09:02:37","hostname":"MyHOSTNAME","process":"postfix/smtp[26490]","queue_id":"D53A72713E5","to":"*******@bellsouth.net","domain":"bellsouth.net","relay":"gateway-f1.isp.att.net[204.127.217.16]:25","conn_use":2,"delay":0.57,"delays":"0.11/0.03/0.23/0.19","dsn":"2.0.0","status_detail":"(250 ok ; id=20120227140036M0700qer4ne)","status":"sent"}}
ただこれは、Amazon Linuxが必要というわけじゃなくて、rbenvでインストールしたC拡張にlibruby.so.2.5
へのリンクがないせいじゃないだろうか?
misc
apexのアクティビティをみると、先行き不安な気がする。
https://github.com/apex/apex/graphs/contributors
前回のリリースは5月だし、https://github.com/apex/up に力を入れているようだし、うーむ…
とはいえCFnを使わないでlambdaだけに焦点をあてたメジャーなツールがapexぐらいしか見つからないので、しばらくはapexだよりかなぁ