apexでrubyをデプロイする

ちょうど4日ほど前に、apexにrubyサポートのPRがマージされていた。

github.com

なので、すこし試してみた。

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のアクティビティをみると、先行き不安な気がする。

f:id:winebarrel:20181217231739p:plain https://github.com/apex/apex/graphs/contributors

前回のリリースは5月だし、https://github.com/apex/up に力を入れているようだし、うーむ…

とはいえCFnを使わないでlambdaだけに焦点をあてたメジャーなツールがapexぐらいしか見つからないので、しばらくはapexだよりかなぁ