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

RubyでのAWSLambda関数の記述

AWS Lambdaを使用すると、オーバーヘッドを最小限に抑えながらスケーラブルな関数をセットアップできます。 Ruby on Railsアプリ全体を作成、ホスティング、保守する代わりに、Lambda関数を使用して個々のイベントに個別に応答できます。この記事では、AWSの初心者から、独自のLambda関数でRubyを作成する方法について説明します。

Lambdaを使用すると、サーバーを管理しなくても、イベントに応答してコードを実行できます。このイベント駆動型アーキテクチャにより、コードの支払いは、アイドリング中ではなく、機能している間だけになります。 Lambdaは、S3バケット内のファイルの削除など、AWSエコシステム内のイベントに応答するために最も一般的に使用されますが、AWSAPIGatewayと連携してAPIとして機能するように構成することもできます。

Lambdaを使用して、Cron Jobsなどの時間に基づいて、またはイベントに応答してタスクを自動化できます。これは、多くの場合、DynamoDBなどの他のAWSサービスを使用したデータ処理、またはスケーラブルなAPIにまで拡張できます。たとえば、Amazonのドキュメントの次の図は、モバイルクライアントがHTTPリクエストを作成し、おそらくデータベースでCRUDアクションを実行する単純なアーキテクチャを示しています。 API Gatewayはリクエストを対応するLambda関数にルーティングし(RailsがHTTPリクエストをコントローラーにルーティングするのと同じように)、ビジネスロジックを実行し、AWSDynamoDBと通信してリクエストを実行します。

RubyでのAWSLambda関数の記述

コードはコンテナで実行されるため、Amazonのインフラストラクチャは、関数が使用されていないときに、関数をある種のスリープモードに自動的に置きます。新しいリクエストが届くと、コンテナはコールド状態から開始する必要があります。これにより、実行時間が最大2000ミリ秒長くなる可能性があります。これは、応答時間の点でサービスの品質を低下させるだけでなく、コストもかかる可能性があります。このため、ユーザーの電子メールの送信やUIイベントへの応答など、時間に敏感なタスクにLambdaを使用すると、ボトルネックが発生する可能性があります。 AWS CloudWatchをスケジュールして、関数を「ウォーム」に保つように定期的にリクエストすることで、この問題を軽減できますが、これによりホスティングコストが増加します。

AWSLambdaを使用する理由

アマゾンウェブサービス(AWS)は、世界で最も人気のあるクラウドコンピューティングサービスです。独立した開発者が使用するのは簡単ですが、世界最大の企業のインフラストラクチャとして機能するのに十分なほど強力でスケーラブルです。

AWS Lambdaは、「サーバーレスコンピューティングサービス」として機能するAmazonのそのようなオファリングの1つであり、イベントに応答してのみコードを実行できます。これにより、オーバーヘッドが削減され、サーバー全体をホストしたりアプリ全体を構築したりすることなく、API呼び出しなどの何かにプログラムで対応できるようになります。

適切なユースケースでは、このサーバーレスアーキテクチャにより、コストを大幅に節約できます。料金は、リクエストあたりのコストと計算時間の期間あたりのコストで計算されます。特定の月の最初の100万リクエストの後、価格は100万リクエストあたり$0.20ですプラス 関数が使用する計算時間のGB秒ごとに$0.0000166667。ご想像のとおり、このレートベースの価格設定により、同じレートで無限にスケーリングするオプションを維持しながら、ラムダで小さなサービスを実行するのが非常に安価になります。

Ruby開発者は、API呼び出しやその他のAWSイベントに対応するステートレスな方法としてこのクラウドサービスを使用することで、このクラウドサービスの恩恵を受けることができます。

トライアルAWSアカウントの設定

AWSは、AWS Lambdaを使用して、100万件の無料リクエストと1か月あたり最大320万秒のコンピューティング時間を含むかなり寛大な無料枠を提供しています。すでにアカウントをお持ちの場合は、この手順をスキップできますが、アカウントの設定は非常に簡単です。

ここにサインアップして、開始するためにあなたの情報を入力してください! RubyでのAWSLambda関数の記述

アカウントの種類や連絡先情報などの詳細情報を入力するよう求められます。また、無料枠以外の使用をカバーするために、クレジットカード/デビットカードの情報を入力する必要があります。 Lambdaの簡単な使用法は無料枠に含まれていますが、偶発的な超過が心配な場合は、使用量を管理し、予期しない請求を防ぐための予算を設定できます。

Rubyを使用したLambda関数の作成

登録したら、製品にカーソルを合わせます 、次に計算ラムダを選択します 。

RubyでのAWSLambda関数の記述

Lambda Consoleに入ると(「開始」をクリックする必要がある場合があります)、「関数の作成」のオレンジ色のボタンが付いた関数の空のリストが表示されます。ご想像のとおり、オレンジ色の[関数の作成]ボタンを押します。

RubyでのAWSLambda関数の記述

次に、Rubyのテンプレート関数がまだないため、「最初から作成」を選択します。最初から作業することが学習の最良の方法です。

関数に適切な名前を付け、使用するRubyバージョンを選択する必要があります。有名なプログラミングの問題にちなんで、私はFizzBu​​zzに電話しました。

lambda_function.rbをダブルクリックする必要がある場合があります ナビゲーションペインにファイルを表示して、ソースコードを表示します。

この関数は事前に作成されており、lambda_handlerというタイトルが付けられています 。現状では、この関数が呼び出されると、以下に示すように、「Hello FromLambda!」というテキストを含む200応答が返されます。 RubyでのAWSLambda関数の記述

ラムダ関数のテストトリガーの使用

イントロで説明したように、Lambda関数はさまざまな方法でトリガーできます。最も一般的なものの1つは、API呼び出しによるものです。ただし、これにはAWS API Gatewayを設定する必要がありますが、これはこの記事の範囲外です。 API GatewayはLambdaとうまく連携して、構成がほとんどなく、スケーラビリティが無限のAPIを作成します。

幸いなことに、関数コンソールを介してAPI呼び出しをシミュレートすることはそれほど難しくなく、テストイベントはすでにキューに入れられています

機能概要の下には、現在「コード」が選択されているツールバーがあります。最後のスクリーンショットに示されているように、「コード」のすぐ横には「テスト」というタイトルのタブがあります "。先に進んで[テスト]を選択すると、コードソースの代わりにテストコンソールが表示されます。

RubyでのAWSLambda関数の記述

事前設定されたテストイベントは、eventとしてLambda関数に送信されるJSONオブジェクトです。 関数がパラメータとして受け取るオブジェクト。 API Gatewayを介してエンドポイントを呼び出す場合、これがリクエストの本文になります。

プレースホルダーのLambda関数はイベントを読み取らないため、本文として何を送信するかはそれほど重要ではありません。そのため、オレンジ色の[呼び出し]をタップすると、記述どおりに進めることができます。 「ボタン。

関数を正しく設定すると、「Execution Succeeded」というタイトルの緑色のボックスが表示されます。このボックスを展開すると、関数からのJSON応答を確認できます。

FizzBu​​zzを書く

Lambda関数が正しく機能していることを確認したので、独自のカスタムRubyコードを使用してカスタマイズできます。この例では、Lambda関数が有名なFizzBu​​zz問題に応答するようにします。 FizzBu​​zzはインタビューのお気に入りであり、プロンプトは次のようになります

1から50までの数字を印刷するプログラムを作成します。ただし、3の倍数の場合は、数字の代わりに「Fizz」を印刷し、5の倍数の場合は「Buzz」を印刷します。 3と5の両方の倍数である「FizzBu​​zz」の数。

Lambda関数のコードを私のFizzBu​​zzソリューションに置き換えます-

require 'json'

def lambda_handler(event:, context:)
    max_val = event['max_val']
    textResponse = ''
    1.upto(max_val) do |i|
      if i % 5 == 0 and i % 3 == 0
        textResponse += "FizzBuzz"
      elsif i % 5 == 0
        textResponse += "Buzz"
      elsif i % 3 == 0
        textResponse += "Fizz"
      else
        textResponse += i.to_s
      end
    end
    { statusCode: 200, body: JSON.generate(textResponse) }
end

これは、通常のFizzBu​​zzのちょっとしたスピンです。 50までループするのではなく、イベントとともに送信される番号をループします。イベントオブジェクトは辞書のように渡されるため、event[max_val]を要求します max_valの値を返します 鍵。最後に、FizzBu​​zzソリューションを印刷する代わりに、JSONオブジェクトとして返す文字列に追加するだけです。

次に、オレンジ色の[デプロイ]ボタンを押して、Lambda関数を新しいコードで更新していることを確認してください

ソリューションを作成してデプロイしたら、テストコンソールに戻ります。テストイベントを変更して、max_valを渡すだけにします キー/値のペア。次のようになります:

RubyでのAWSLambda関数の記述

JSONは単純です

{
  "max_val": 70
}

最後に、「起動」を押してテストを実行します。結果を展開して、関数が入力を読み取り、FizzBu​​zz問題の結果を返したことを示すことができます。

開発が容易

Webコンソールでの作業は学習目的には便利ですが、それに制限されることは悪夢になります。 AWS Lambdaを使用して開発する最も一般的な方法の1つは、コマンドラインインターフェイスの略であるCLIを使用することです。

IAMロールを使用して適切なアクセス許可を作成したら、マシンにCLIをインストールし、資格情報を使用して構成します。次に、Lambda CLIを使用して、ローカルで(選択したIDEで)開発するときに関数をテストし、コマンドラインから変更をデプロイできます。

もう1つの一般的な開発方法は、サーバーレスなどのフレームワークを使用する方法です。サーバーレスは、AWSが悩まされている面倒な設定の多くを処理します。これには、機能に必要な場合のAPIGatewayの設定も含まれます。サーバーレスはまた、ロギングを強化し、Ruby Gemの管理を容易にし、CI / CDの構成を可能にするため、パイプラインに基づいてリポジトリから自動的にデプロイできます。

サーバーレスまたは同様のフレームワークを使用せずに、Ruby Gemsを含めるには、いくつかのフープをジャンプする必要があります。関数を拡張してフォルダーを含める必要があります。次に、.bundle/configを作成します。 インストールするgemを配置する場所をbundlerに指示するために、次の初期化コードが含まれているルートディレクトリ内のファイル:

---
BUNDLE_PATH: "vendor/bundle"

次に、CLIを使用してbundle addを実行できます 必要な宝石とrequire それらをコードに直接挿入します。

AWSLambdaの制限

おめでとうございます。Rubyで最初のAWSLambda関数を作成しました。以前は、RubyでAPIを実行するための唯一の実行可能なソリューションは、多くの場合、Railsアプリ全体を作成することでした。これで、完全なアプリケーションに付属するすべての肥大化をスキップして、一度に1つずつエンドポイントを作成できます。 Lambdaはマイクロ秒単位で使用料を請求するため、迅速な解決策としては非常に安価です。さらに、このクラウドオファリングを利用することで、低コストで運用しながら、信じられないほど迅速に拡張できます。 AWSは、Netflixがピーク時に、一定の最大容量のサーバー帯域幅を支払うことなく機能する理由です。

すべての勝利にもかかわらず、AWSLambdaは包括的なソリューションではありません。それ自体はAPIとして機能せず、状態機能に制限があります。 Lambda関数の実行には15分以上かかることはなく、メモリは6GBに制限されています。インフラストラクチャ全体を別の環境に複製する必要があることが多いため、Lambda関数をテストすることも少し難しいです。

24時間年中無休で実行する必要のないアプリや機能がある場合は、Lambdaが可能性があります ぴったり合う。関数が何らかの状態を維持したり、AWSエコシステムの外部でデータを更新したりする必要がある場合、Lambdaは適切ではありません。 Lambdaもデフォルトで1,000の同時接続に設定されているため、それよりも多くの使用が一貫して見られるアプリケーションは、Lambdaでは非常に信頼性が低くなります。基本的に、Lambdaは、永続的な状態を必要としない、短期間のイベント駆動型自動化タスクで最適に使用されます。

Lambda関数は、特にあなたのようなRuby開発者にとって、強力なツールになる可能性があります。


  1. Rubyの関数とメソッド:独自の関数を定義する方法

    Rubyメソッドとは何ですか? メソッドは、特定の目的のためにグループ化された1行または複数行のRubyコードです。 このグループ化されたコードには名前が付けられているため、コードを再度記述したり、コピーして貼り付けたりすることなく、いつでも使用できます。 メソッドの目的は次のとおりです : 情報を取得します。 オブジェクトを変更または作成します。 フィルターとフォーマットのデータ。 例1 : サイズ Arrayのメソッド オブジェクトは要素の数を示します(情報を取得します)。 例2 : pop メソッドは、配列から最後の要素を削除します(オブジェクトを変更します)。

  2. Ruby2.6の9つの新機能

    Rubyの新しいバージョンには、新しい機能とパフォーマンスの改善が含まれています。 変更についていきますか? 見てみましょう! 無限の範囲 Ruby 2.5以前のバージョンは、すでに1つの形式の無限範囲をサポートしています( Float ::INFINITY を使用) )、しかしRuby2.6はこれを次のレベルに引き上げます。 新しい無限の範囲 次のようになります: (1..) これは、(1..10)のような終了値がないため、通常の範囲とは異なります。 。 使用例 : [a, b, c].zip(1..) # [[a, 1], [b, 2], [c, 3]] [1,2,3,