LoginSignup
50
47

More than 5 years have passed since last update.

AWS LambdaをRubyから使ってみる

Last updated at Posted at 2014-11-25

AWS LambdaはS3やKinesis、DynamoDBのイベントをトリガーにJavaScript/Node.jsで書かれたコードスニペットを実行するというサービスです。
イベントの実行元として上記以外にAPIからの直接実行も可能となっているので今回はAWS SDK for Rubyを利用してこれを試してみます。
なお、AWS Lambdaをサポートしているのはv2だけとなります。

実際のところ、Rubyアプリケーションから実行することはないと思います。
なぜならRubyのアプリを動かすということは恐らくEC2なり何らかのサーバ上で実行してると思われるからです。
でも、例えばクライアントサイドとしてRubyを使うツールを用意して少しだけサーバサイドで処理したいっていうときにEC2とか立てる必要がないのは嬉しいかも知れません。
そんなシチュエーションあるかはわかりませんが。
というわけで早速やってみます。

今回はシンプルに登録済みのLambda functionをRubyのコードから実行するだけにしますが、Lambda functionの作成から実行するコードのアップロードもRubyで実行することが可能です。

とりあえずGemfileはこんな感じにします。

Gemfile
source "https://rubygems.org"

gem 'aws-sdk', '2.0.10.pre'

まず、Lambda functionとして登録するコードを以下のように用意します。今回はシンプルに実行時に渡されるパラメータの値を読み取ってログ出力するだけです。

sample.js
exports.handler = function(event, context) {
    console.log('value1 = ' + event.key1);
    context.done(null, 'Invoke from Ruby');
};

新たにLambda functionを作成してこのコードを登録しておいてください。
今回はとりあえずのお試しなのでその他のパラメータはデフォルトで構いません。また、今回はSDKからの実行ですのでEvent Sourceの指定は行いません。
名前は適当につけます。例ではinvoke-from-rubyという名前にしました。

さて、次に作成したLambda functionを起動するRuby側のコードを用意します。

sample.rb
require 'aws-sdk'

Aws.config[:region] = "us-east-1"
lambda = Aws::Lambda::Client.new

begin
    param = { key1: "from ruby"}.to_json #=>functionに渡すパラメータをJSON形式で作成

    resp = lambda.invoke_async(function_name: "invoke-from-ruby", invoke_args: param)

    if resp[:status] == 202
        puts "success"
    end
rescue Aws::Lambda::Errors::ServiceError => e
    p e.message
end

これだけです。
functionに渡すパラメータはJSON形式で用意します。ここで指定したJSON形式のパラメータがfunction側ではeventとしてJavaScriptのmoduleに渡されます。
先ほど用意したJavaScriptのコードではkey1というキーの値を読み取っています。

レスポンスのステータスが202であれば成功しています。ただし、実際には非同期で実行されます。
また、指定したfunctionが存在しない場合やその他のエラーが発生した場合は例外が発生しますので適切に処理してください。

Lambdaでconsole.logした場合の出力はCloudWatch Logsに出力されますのでこちらを確認してみます。
マネージメントコンソール上でCloudWatchからのLogsにfunction名と同じLog Groupが存在しているので実行したfunction名のものを表示してみてください。

Screen Shot 2014-11-25 at 3.13.08 PM.png

なお、このプログラムを実行するユーザにはlambda:InvokeAsyncの権限が必要となりますので、このプログラムを実行するIAMのUserもしくはRoleにPolicyで許可しておいてください。

こんな感じでAWS LambdaとAWS SDK for Rubyを使ってEC2を使わずにサーバサイドの処理を実行することが可能になります。
たった10数行書くだけでEC2立ててゴニョゴニョしたりしなくていいのは非常に楽ですね。

最後に、大人のたしなみとしてお約束の文章を書いておきます。

免責
こちらは個人の意見で、所属する企業や団体は関係ありません。

50
47
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
50
47