LoginSignup
5
2

More than 1 year has passed since last update.

AWS Lambda with Ruby3

Posted at

2023年3月時点で AWS Lambda は Ruby3 をサポートしておりません。Ruby2 は 2023年3月末で EOL の予定です。
AWS Lambda Base Container Images は 2023年3月末までにコンテナイメージを公開するようです。

2020年12月に AWS Lambda はコンテナイメージをサポートし、任意のバージョンを利用することができます。
そこで SAM CLI のコマンドを利用して Ruby3 による Lambda 関数の構築を紹介します。

SAM Init

  • SAM CLI のバージョンは 1.77.0 を利用します。
    • Ruby のランタイムは 2.7 のみサポートしています。 (Ruby3 をサポートしておりません。)
$ sam --version # SAM CLI, version 1.77.0
$ sam init --help | grep ruby # ruby2.7
  • sam init コマンドは Hello World! の コンテナイメージを利用します。
    • X-Ray tracingCloudWatch monitoring は利用しません。
$ sam init --name sam-ruby-version-check --base-image amazon/ruby2.7-base --app-template hello-world-lambda-image --no-tracing --no-application-insights
$ cd sam-ruby-version-check

SAM Build

Ruby Version 2

  • hello_world/app.rb の戻り値に RUBY_VERSION を追加します。
require 'json'

def lambda_handler(event:, context:)
  {
    statusCode: 200,
    body: {
      message: "Hello World!",
      ruby_version: RUBY_VERSION
    }.to_json
  }
end
  • sam buildsam local invoke コマンドを実行すると ruby_version2.7.7 が出力されます。
$ sam build
$ sam local invoke HelloWorldFunction --event events/event.json # {"statusCode":200,"body":"{\"message\":\"Hello World!\",\"ruby_version\":\"2.7.7\"}"}

Ruby Version 3

  • hello_world/DockerFileAWS Lambda Ruby Runtime Interface Client の Example を記述します。
    • Example の CMD ["app.App::Handler.process"]CMD ["app.lambda_handler"] に変更します。
  • 2023年3月中旬に Amazon Linux 2023 がリリースされて FROM amazonlinux:latestRuby3.2 がサポートされています。
    • Example の amazon-linux-extras install -y ruby2.6dnf install -y ruby3.2 に変更します。
FROM amazonlinux:latest

# Define custom function directory
ARG FUNCTION_DIR="/function"

# Install ruby
RUN dnf install -y ruby3.2

# Install the Runtime Interface Client
RUN gem install aws_lambda_ric

# Copy function code
RUN mkdir -p ${FUNCTION_DIR}
COPY app.rb ${FUNCTION_DIR}

WORKDIR ${FUNCTION_DIR}

ENTRYPOINT ["/usr/local/bin/aws_lambda_ric"]

CMD ["app.lambda_handler"]
  • hello_world/app.rb の require にio/consolestringio を追加します。
    • aws_lambda_ric は Ruby3 に対応していないので uninitialized constant #<Class:AwsLambda::Marshaller>::StringIO が発生します。
require 'json'
require 'io/console'
require 'stringio'

def lambda_handler(event:, context:)
  {
    statusCode: 200,
    body: {
      message: "Hello World!",
      ruby_version: RUBY_VERSION
    }.to_json
  }
end
  • sam buildsam local invoke コマンドを実行すると ruby_version3.2.1 が出力されます。
$ sam build
$ sam local invoke HelloWorldFunction --event events/event.json # {"statusCode":200,"body":"{\"message\":\"Hello World!\",\"ruby_version\":\"3.2.1\"}"}

SAM Deploy

  • sam deploy コマンドを実行で AWS Lambda にリリースします。
$ sam deploy
  • API Gateway でアクセスすると ruby_version3.2.1 が出力されます。
{ "message": "Hello World!", "ruby_version": "3.2.1" }

Ruby3 で AWS Lambda 関数の構築が確認できました。これで Ruby2 がサポート終了(EOL)されても安心です。

Cleanup CloudFormation

  • aws cloudformation コマンドを実行で AWS にリリースしたリソースを削除します。
$ aws cloudformation delete-stack --stack-name sam-ruby-version-check

CloudFormation は自動でリソースを削除されるので便利です。(ECR は削除されないので手動で削除してください。)

Tips

  • SAM CLI で作成される Docker の コンテナにアクセスする方法を紹介します。
  • template.yamlResourcesMetadata で Docker の指定をしています。
Resources:
  HelloWorldFunction:
    Metadata:
      DockerTag: ruby2.7-v1
      DockerContext: ./hello_world
      Dockerfile: Dockerfile
  • sam build コマンドで REPOSITORYhelloworldfunctionTAGruby2.7-v1 のイメージが作成されます。
  • docker run コマンドを実行するとコンテナにアクセスできます。
$ sam build
$ docker run --rm -it --entrypoint bash helloworldfunction:ruby2.7-v1
bash-5.2# dnf search all ruby | grep ruby3.2.x86_64 # ruby3.2.x86_64 : An interpreter of object-oriented scripting language

この記事が公開されてしばらく経つと AWS Lambda で Ruby3 がサポート されるようになります。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2