Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

AWS LambdaでRubyを使ってみた:Serverlessフレームワークによるデプロイ実践ガイド

AWS LambdaによるRubyサポートが発表されたとき、私はすぐにでも試したいほどワクワクしました。Honeybadgerでは以前からLambdaを活用しており、関数をRubyで書けるようになる日をずっと待ち望んでいたからです。新しいRubyサポートを数時間ほど触ってみた結果、Node.jsやGo、Pythonに割いていた時間を減らせるだろうと確信するに至りました。

簡単なサンプル

AWSの公式ブログを読めばRuby on Lambdaをすぐに始められますが、本記事ではServerlessフレームワークを使ってRubyのLambda関数をデプロイする方法をご紹介します。このフレームワークは、Lambda関数開発における煩わしさを取り除いてくれる点で非常に優れています。執筆時点のバージョン1.34では、Rubyプロジェクト向けのテンプレート生成機能はまだ利用できませんでした(この記事を書き始める数時間前についにPRがマージされたところです)が、ジェネレーターがなくても十分簡単に始められます。

以下は、本チュートリアルで使用する設定ファイルの例です。S3オブジェクトが作成されると、そのオブジェクトに関連付けられたメタデータをDynamoDBテーブルに登録するシンプルな関数を実装していきます。

設定ファイルのresourcesセクションにより、新しいDynamoDBテーブルが自動的に作成され、そのテーブル名は関数の環境変数に格納されます。この環境変数は後ほどコード内で使用します。関数は、事前に作成済みのSNSトピックに対するSNSイベントによってトリガーされる仕組みです。このSNSトピックは、手動で作成したS3バケットへのPUTイベントの通知を受け取ります。

Rubyのコードは以下の通りです:

コード自体はそれほど複雑ではありません。SNSイベントを受信し、メッセージ内の各レコードをループ処理して、作成されたS3オブジェクトの情報を取得します。次に、S3オブジェクトに対してHEADリクエストを送ってメタデータを取得し、DynamoDBテーブルにアイテムを作成または更新します。この関数の唯一の依存関係はAWS SDKであり、これはランタイム環境に標準で含まれているため、Gemfileを用意する必要すらありません。もちろん、追加のgemを使いたい場合も簡単に対応できます。デプロイの説明の中で、追加のgemを組み込む方法も見ていきましょう。

デプロイ

Serverlessフレームワークのおかげで、現状のコードをLambdaへデプロイするのは非常に簡単です。必要なコマンドはたった一つ:

sls deploy

この一つのコマンドが、以下のすべてを自動的に実行してくれます:

  • コードのZIP圧縮
  • ZIPファイルのS3へのアップロード
  • Lambda関数のデプロイ(環境変数とSNSトリガーの設定込み)
  • IAMポリシーの作成
  • DynamoDBテーブルの作成

デプロイが完了すれば、あとはバケットにオブジェクトを作成するだけで、DynamoDBテーブルに新しいアイテムがどんどん追加されていきます。

依存関係(gem)の管理

デプロイする関数に追加のgemを含めるのも簡単です。Gemfileを作成し、必要なgemを記述して、bundle install --path vendor/bundleを実行するだけです。これにより、gemがローカルディレクトリにバンドルされ、他のコードと一緒にZIPファイルにまとめられて関数へアップロードされます。

ただし、一点だけ注意が必要なのが、C拡張のコンパイルを必要とするgemです。開発環境とLambdaのランタイム環境はほぼ異なるため、AWS上で動作するように拡張機能をコンパイルするにはひと工夫が求められます。幸い、lambciが公開しているDockerイメージと、そのRubyイメージをベースに筆者が作成したDockerイメージのおかげで、決して難しい作業ではありません。依存関係を適切にコンパイルしながらバンドルするには、以下のようにDockerイメージを実行してください:

docker run --rm -v $(pwd):/var/task stympy/lambda-ruby2.5

このコマンドは、前述のbundlerコマンドを実行するだけで、gemがvendor/bundle配下に配置されます。これでdeployコマンドが生成するZIPファイルに組み込む準備が整います。

以上で準備完了です。皆さんも筆者と同じように、Lambda上でのRuby実行をぜひ楽しんでください。

  1. AWS LambdaでRailsアプリを動かす方法!Lambyを使ったデプロイ手順を徹底解説

    サーバーレスコンピューティングは、サーバーの管理やプロビジョニングの作業をクラウドプロバイダーにオフロードできる仕組みとして、多くのテックチームで急速に標準になりつつあります。その代表格がAWS Lambdaです。LambdaはNode.js、Java、Python、Rubyといった主要なプログラミング言語を幅広くサポートしています。しかし、言語そのものだけでなく、それらの言語で構築されたフレームワークの機能に依存するサーバーレス関数を実行したいケースもあるでしょう。 本記事では、RailsアプリケーションをAWS Lambda上で実行する方法を解説します。サーバーレスコンピューティングとAW

  2. Ruby 2.6の新機能9選|コード例でわかる注目ポイントを徹底解説

    Ruby 2.6には、開発者の生産性を高める新しい機能やパフォーマンス改善が多数盛り込まれています。 本記事では、Ruby 2.6で導入された9つの注目新機能を、実際のコード例とともにわかりやすく紹介します。最新のRuby動向をキャッチアップしたい方は、ぜひ最後までご覧ください。 1. 無限Range(Endless Range) Ruby 2.5以前でもFloat::INFINITYを使えば終端のない範囲を表現できましたが、Ruby 2.6ではさらに直感的な記法が使えるようになりました。 新しい無限Rangeは次のように書きます。 (1..) 通常のRangeが(1..10)のように終端