かくすけのいろいろ作るブログ

かくすけの開発者ブログです。開発の他いろいろなモノづくりについて書きます。

【Lambda】【Ruby】Rubyを使ったLambda関数を実行する(AWSコンソール使用)

開発環境OS CeonOS7 Rubyのバージョン 2.5.0

こんにちは。かくすけです。
前回、rubyを使って自分が投稿しているYoutubeの動画情報をランダムで1つ取得するコードを書きました。

前回記事 kakusuke98.hatenablog.com

今回はそのRubyのコードを AWS の Lambdaを使って実行します。
前回はRubyのバージョン2.6で動作させてしまったのですが、Lambdaが2019/05/03時点でRubyのバージョン2.5しか対応していなかったので、2.5で動作させることにしました。
※私はLambda使うの初めてです。

手順1:Lambda関数の作成

まずはAWSコンソールにログインします。
コンソールにログイン後、ヘッダーにある「サービス」をクリックします。
AWSのサービス一覧が表示されますので、「Lambda」をクリックしましょう。
検索欄があるのでそちらを使った方がはやいですね。

f:id:kakusuke98:20190502183239p:plain

Lambda関数の一覧画面が表示されます。
「関数の作成」をクリックします。
f:id:kakusuke98:20190502183510p:plain

関数の作成画面が表示されます。

今回はすでにRubyコードを準備しているので「一から作成」を選択。
関数名は「tweetRandomVideo1」としました。
ランタイムは「Ruby 2.5
実行ロールは「基本的なLambdaアクセス権限で新しいロールを作成」を選択しました。
LambdaではAmazon CloudWatch Logsにログを出力するので、Amazon CloudWatch Logsにログをアップロードする権限を持つロールが作成されます。
普段使っているロールがある場合は適宜変更してください。

すべて入力したら「関数の作成」ボタンをクリックします。

f:id:kakusuke98:20190502185248p:plain

しばらく待つと作成した関数の編集画面が表示されます。
これでLambda関数が作成されました!

手順2:関数コードのアップロードと処理実行

開発環境で準備済のRubyをLambdaにアップロードします。
AWSコンソールのLambda関数の編集画面(手順1最後に表示された画面)でzipをアップロードできます。
zipファイルを準備しましょう。

使用gemのbundle install
上のコードでは'rest-client'というgemを使用しているので、'rest-client'の内容もLambdaにアップロードするzipに含めてあげる必要があります。
ちなみに別に読み込んでいる'json'はLambdaにデフォルトで含まれているので気にしなくて大丈夫です。
rbファイルと同じディレクトリに「Gemfile」というファイルを作成し、次のような内容にします。

source 'https://rubygems.org'
gem 'rest-client'

コマンドラインでGemfileと同じディレクトリに移動し、次のコマンドを実行します。

bundle install --path vendor/bundle

vendorフォルダが生成されます。

zipに固める
上で生成されたvendorフォルダとrbファイルをzipに固めます。
私の使用しているCentOS7ではデフォルトでzipコマンドが使えなかったので次のページを参考にzipをインストールしました。

CentOS7にzipが入っていなかった件 - Log.log(work)

rbファイルと同じディレクトリでコマンドを実行します。
(lambda_function.rbはファイル名です。適宜読みかえてください。)

zip -r function.zip lambda_function.rb vendor

「function.zip」というzipファイルが生成されました。

AWSコンソールを使ったzipファイルアップロード
ブラウザでAWSコンソールのLambda関数の編集画面を表示します。
画面中ごろにある「関数コード」の項目でコードエントリタイプを「.zipファイルをアップロード」に設定します。
すると、zipファイルをアップロードするためのボタンが表示されます。
そこで先ほど生成したzipファイルを選択してください。
ハンドラの項目はどのメソッドを呼び出すかを指定できます。
私は「lambda_function.rb」の「lambda_handler」がメイン関数なので次のような設定になります。

f:id:kakusuke98:20190503201202p:plain

「10MBより大きいファイルの場合は、Amazon S3を使用したアップロードを検討してください。」という注意書きにある通り、ファイルが大きい場合はS3を使用した方が良いみたいです。
ファイルサイズは10MB以下ですし、いろいろ面倒なので今回はブラウザ上でのアップロードを使用しています。

環境変数の設定
コード内で「ENV['TEST']」のようにして環境変数を読み込んでいる場合、Lambdaでも環境変数を使用できます。
環境変数」の項目で次のように設定できます。

f:id:kakusuke98:20190503201829p:plain

保存とテスト
編集した内容を保存しましょう。
画面右上にある「保存」ボタンをクリックしてください。
内容によっては結構時間かかります。
f:id:kakusuke98:20190503202332p:plain

保存が完了したら動作を確認してみましょう。
「テスト」ボタン左のプルダウンからテストイベントの設定を選択します。
f:id:kakusuke98:20190503202612p:plain

テストイベントの設定モーダルが表示されます。
ラジオボタンは「新しいテストイベントの作成」を設定
イベント名はお好きなテスト名をつけてください。
イベント名下の欄はリクエストデータです。
私の使用する関数はリクエストデータ内容使用しない場合は{}だけで大丈夫です。
「作成」ボタンを押します。

f:id:kakusuke98:20190503203004p:plain

作成したテストイベントが選択されているのを確認し、「テスト」ボタンを押します。

f:id:kakusuke98:20190503203442p:plain

テストの実行結果が表示されます。
ここで「詳細」を押すことで成功/失敗だけでなく詳細な内容を確認することができます。

f:id:kakusuke98:20190503203629p:plain