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

RailsをAWSLambdaにデプロイする

サーバーレスコンピューティングは、サーバーの管理とプロビジョニングの作業をクラウドプロバイダーに任せるのに役立ち、ほとんどのテクノロジーチームにとって急速に重要になっています。 AWS Lambdaは、多くのテクノロジーチームで使用されているサーバーレステクノロジーの一種です。 AWS Lambdaは、NodeJS、Java、Python、Rubyなどのコアプログラミング言語のほとんどをサポートしています。コアプログラミング言語はサポートされていますが、これらの言語で構築されたフレームワークの一部である機能に依存してサーバーレス関数を実行したい場合があります。この投稿では、AWSLambdaでRailsアプリケーションを実行する方法について説明します。この投稿は、サーバーレスコンピューティングとAWS Lambdaに精通しており、AWSLambdaでRailsを実行する方法を理解したいと考えていることを前提としています。 Lambyと呼ばれるツールを使用すると、AWS LambdaでRailsを簡単に実行できます。ここでは、Lambyを使用してRailsをビルドしてLambdaにデプロイする方法について説明します。これを「RailsonLambda」と呼びます。

ランビーとは何ですか?

Lambdaを使用すると、サーバーを保守しなくても、コードをデプロイして任意の規模で実行できます。コードをAWSにアップロードするだけです。ユーザーがWebページにキューに入れられているジョブを要求するなどのイベントによってトリガーされるたびに実行されます。

Lambdaは、コードが特定の方法で構造化されていることを期待しています。したがって、Railsアプリなどをホストするために使用する場合は、Lambyなどのアダプターを使用する必要があります。

Lambyはシンプルなラックアダプターです。 RailsアプリとAWSLambdaの間に位置し、APIゲートウェイやアプリケーションロードバランサーなどのさまざまなAWSソースからのLambda呼び出しイベントをRailsアプリがリッスンできるRackイベントに変換します。

RailsをAWSLambdaにデプロイする Rails Lambdaアーキテクチャソース:Lamby Docs

LambyはDockerとAWSSAMを活用して、Railsアプリをビルド、パッケージ化、Lambdaにデプロイします。

AWSサーバーレスアプリケーションモデル(AWS SAM)は、AWSでサーバーレスアプリケーションを構築するために使用できるオープンソースフレームワークです。サーバーレスアプリケーションは、Lambda関数、イベントソース、およびタスクを実行するために連携するその他のリソースの組み合わせです。サーバーレスアプリケーションは単なるLambda関数ではなく、API、データベース、イベントソースマッピングなどの追加のリソースを含めることができることに注意してください。-AWSSAMドキュメント

Lambyの使用を開始するには、Dockerをインストールし、AWSアカウントを作成し、AWSアカウントへのプログラムによるアクセスを構成する必要があります。

Dockerのインストール

AWS SAMは、Dockerを使用してLambdaランタイム環境をシミュレートします。 Dockerは、Pythonに依存するAWSCLIとSAMCLIのインストールの複雑さも軽減します。 Dockerをまだインストールしていない場合は、公式Webサイトからダウンロードしてインストールできるため、Dockerのインストールは非常に簡単です。 Dockerがインストールされているかどうかを確認するには、ターミナルで以下のコマンドを実行します。 Dockerがインストールされている場合は、以下に示すようなバージョン番号とビルドが表示されます。

$ docker --version

RailsをAWSLambdaにデプロイする Dockerのインストール確認

AWSアカウントの設定

AWSアカウントをまだお持ちでない場合は、アカウントを設定する必要があります。 Amazonには無料利用プランがあり、LambdaでのRailsアプリの作成とテスト、およびAWSアカウントの作成とアクティブ化の方法に関するガイドが含まれています。ガイドに従ってアカウントを設定してください。

AWSプログラマティックアクセスの設定

AWSアカウントを取得したので、アカウントのAWSアクセスキーIDとAWSシークレットアクセスキーを使用してプログラムによるアクセスを設定する必要があります。これらをまだお持ちでない場合は、次の手順で作成できます。

  • AWSアカウントにログインします。
  • AWSマネジメントコンソールで、ツールバーの[サービス]をクリックします。
  • 「IAM」を検索して選択します。
  • 左側のナビゲーションから[ユーザー]をクリックします。
  • 「IAM」がすでに存在する場合は、ユーザー名を選択してください。
    • [セキュリティ認証情報]タブをクリックします。
    • [アクセスキーの作成]ボタンをクリックします。
    • キーIDとシークレットを安全な場所にコピーします。
  • 「IAM」ユーザーが存在しない場合、
    • [ユーザーの追加]をクリックします。
    • ユーザー名を追加し、[プログラムによるアクセス]オプションを選択します。
    • プロンプトに従ってプロセスを完了します。

Dockerを使用してCLIプログラムアクセスを構成しましょう。以下のコードを端末にコピーします。 AWSアクセスキーIDとAWSシークレットアクセスキーの入力を求められます。前の手順のキーを入力します。

$ docker run \
  --interactive \
  --tty \
  --rm \
  --volume "${HOME}/.aws:/root/.aws" \
  "amazon/aws-cli" \
  configure

RailsをAWSLambdaにデプロイする

新しいRailsアプリケーションの作成

SAMCLIを使用してRailsプロジェクトをブートストラップします。 AWS SAM CLIを使用すると、一般にcookiecutterと呼ばれるGitHubリポジトリテンプレートから新しいプロジェクトを初期化できます。新しいSAMプロジェクトを開始するには、Dockerコンテナを使用してsam initを実行します。 、Lamby Cookiecutterプロジェクトテンプレートを利用して、新しいプロジェクトフォルダをキックスタートします。プロジェクト名の入力を求められますが、私は「rails_on_lambda」を使用しました。

$ docker run \
  --rm \
  --interactive \
  --volume "${PWD}:/var/task:delegated" \
  lambci/lambda:build-ruby2.7 \
  sam init --location "gh:customink/lamby-cookiecutter"

RailsをAWSLambdaにデプロイする

新しいSAMプロジェクトフォルダーには、新しいRailsonLambdaプロジェクトに必要なものがすべて含まれています。より高いレベルから、これがあなたの新しいプロジェクトで生成されたものです。

  • Dockerfileとdocker-composeの両方を使用したDockerのセットアップ。
  • libディレクトリ、バンドラー、およびテストを備えた動作中のRubyプロジェクト。
  • SAM template.yaml ファイル。
セットアップとデプロイ

新しいRailsアプリを作成したので、Lambdaデプロイメント用にセットアップする必要があります。以下の2つのコマンドは、Docker開発イメージをビルドしてgemをバンドルするスクリプトを実行します。 bootstrap コマンドは1回限りのプロセスですが、setup 新しいプロジェクトの依存関係を追加するたびに、コマンドが実行されます。

$ ./bin/bootstrap
$ ./bin/setup

前のコマンドが正常に実行されると、プロジェクトはSAMを介してデプロイできるようになります。デプロイは、Railsアプリケーションをビルド、パッケージ化、デプロイするLambyスクリプトを使用して行われます。

./bin/deploy

deploy コマンドは、現在のプロジェクトディレクトリをローカルの.lambyに複製するLambyビルドスクリプトを実行します ディレクトリを作成し、アプリケーションのデプロイに必要な3つのSAMコマンドを実行します。

  • サムビルド
  • samパッケージ
  • sam deploy

スクリプトが期待どおりに実行される場合は、SAMのCloudFormationデプロイメントタスクの出力が次のように終わるはずです。

RailsをAWSLambdaにデプロイする

また、端末出力の一部としてURLが表示されるはずです。 URLは、Rackを使用してRailsアプリケーションを呼び出すAPI GatewayHTTPAPIエンドポイントです。ブラウザで開くと、おなじみの「Railsへようこそ」画面が表示されます。

RailsをAWSLambdaにデプロイする

AWSコンソールからのRailsアプリの呼び出し

Lambdaダッシュボードからアプリをテストすることもできます。 AWSマネジメントコンソールにログインします:

  • ツールバーの[サービス]をクリックします。
  • [サービスの検索]フィールドに「Lambda」と入力して選択します。

このページから、新しくデプロイされた「RailsOnLambda」プロジェクトが表示されます。

RailsをAWSLambdaにデプロイする

  • 「RailsOnLambda」関数を開きます。
  • 右上の[テスト]ボタンをクリックします。
  • 「AmazonAPIGatewayProxy」イベントテンプレートを使用します(対応するフィールドを更新するには、以下のJSONテンプレートを使用してください)。
  • 「RailsOnLambdaTest」という名前を付けます。
  • [作成]ボタンをクリックします。
  • [テスト]ボタンをクリックしてラムダを呼び出します。
{
  "body": "",
  "path": "/",
  "httpMethod": "GET",
  "queryStringParameters": {},
  "multiValueQueryStringParameters": {},
  "pathParameters": {
    "proxy": "/"
  },
  "stageVariables": {},
  "requestContext": {
    "path": "/",
    "httpMethod": "GET"
  }
}

すべてが順調に進んだと仮定すると、次のような出力が表示されるはずです。

RailsをAWSLambdaにデプロイする

おめでとう!これで、Lambda上のRailsアプリケーションができましたが、Lambda上のRailsアプリケーションはまだ通常のRailsアプリケーションです。唯一の違いは、LambygemがAPIGateway HTTP API、API Gateway REST API、およびアプリケーションロードバランサーのターゲットイベントをラック互換のenvに変換することです。 オブジェクトを作成し、それらをRailsに送信します。次に、Railsはイベントの結果をプロジェクトで定義されたLambdaハンドラーに返します。

def handler(event:, context:)
 Lamby.handler $app, event, context
end

LambdaのRailsのパフォーマンスはどれくらいですか?

Rails on Lambdaでは、デプロイ後の最初のリクエストの応答時間が遅くなります。この現象は「コールドスタート」と呼ばれます。ただし、最初のリクエストの後、パフォーマンスは優れており、EC2を満たすか上回ることができます。最初のリクエストの後に後続のリクエストがない場合、Railsアプリを提供するサーバーリソースは、約5〜7分後に他のLambda関数に動的に割り当てられます。これにより、新しいリクエストのコールドスタートが発生します。コールドスタートを回避し、Railsアプリを暖かく保つ方法はいくつかあります。

CloudWatchタイマー

Rails on Lambda関数を毎分pingして、暖かく保つ時間を設定できます。 AWSコンソールを開き、CloudWatchを検索します。そこから、[イベント]に移動し、[ルールの作成]をクリックします。イベントタイプを[スケジュール]に設定すると、このイベントは1分ごとに実行されます。

RailsをAWSLambdaにデプロイする

プロビジョニングされた同時実行性

プロビジョニングされた同時実行性はAWSの機能であり、AWSが未使用のコンテナを常に実行し続けるために、切り替えて追加料金を支払うことに同意することができます。 Railsアプリのプロビジョニングされた通貨を設定するには、AWSコンソールを開き、Lambdaサービスページを開きます。

  • 関数(rails-on-lambda)を選択します。
  • [構成]を選択してから、[同時実行]を選択します。
  • [プロビジョニングされた同時実行構成]で、[構成の追加]をクリックします。
  • エイリアスまたはバージョンのいずれかを選択します。
  • 割り当てるプロビジョニングされた同時実行の量(例:500)を入力します。
  • 変更を保存します。プロビジョニングされた通貨は、次のコマンドを使用してAWSCLIから設定することもできます。
aws lambda put-provisioned-concurrency-config --function-name my-function \
--qualifier BLUE --provisioned-concurrent-executions 100

AWSでのLambdaのコストはいくらですか?

AWS Lambdaでは、使用した分だけ支払います。コストは、リクエストの数とコード実行の期間の組み合わせです。継続時間の価格は、関数に割り当てるメモリの量によって異なります。メモリサイズの範囲は128MBから10,240MBであり、必要に応じて関数に任意の量のメモリを割り当てることができます。以下は、さまざまな時間でLambda関数の100,000回の呼び出しを実行するコストを示すグラフです。

RailsをAWSLambdaにデプロイする ラムダのコスト

ラムダでRailsを実行すべきでない場合

AWS LambdaでRailsアプリを実行できることを確認しましたが、すべてのRailsアプリケーションをLambdaで実行する必要がありますか? Railsは、アプリケーションがサーバーレスではなく従来のサーバーで実行されていることを前提としています。従来のRailsサーバーアプリで簡単に機能する特定の操作は、サーバーレスでは機能しない場合があります。たとえば、Rails on Lambdaアプリでは永続的なファイルシステムにアクセスできないため、ファイルや画像のアップロードは機能しません。また、リクエストがない場合はサーバーが存在しないため、WebSocket通信はLambdaでは機能しません。

結論

ここでは、基本的なRailsアプリケーションをデプロイする方法のみを示しましたが、大規模なアプリケーションでも同じプロセスに従います。コントローラーとルートを追加して、コンソールから、またはPostmanやその他のHTTPクライアントを介してテストしてください。


  1. RubyでのAWSLambda関数の構築、テスト、デプロイ

    ソフトウェアの開発は難しい場合がありますが、それを維持することははるかに困難です。メンテナンスには、ソフトウェアパッチとサーバーメンテナンスが含まれます。この投稿では、サーバーの管理と保守に焦点を当てます。 従来、サーバーはオンプレミスでした。つまり、物理ハードウェアを購入して保守していました。クラウドコンピューティングでは、これらのサーバーを物理的に所有する必要がなくなりました。 2006年にAmazonがAWSを開始し、EC2サービスを導入したとき、現代のクラウドコンピューティングの時代が始まりました。このタイプのサービスでは、物理サーバーを保守したり、物理ハードウェアをアップグレードし

  2. Rails5でのAngularの使用

    あなたは前にその話を聞いたことがあります。分散型で完全に機能するバックエンドAPIと、通常のツールセットで作成されたフロントエンドで実行されているアプリケーションがすでにあります。 次に、Angularに移動します。または、AngularをRailsプロジェクトと統合する方法を探しているだけかもしれません。これは、この方法を好むためです。私たちはあなたを責めません。 このようなアプローチを使用すると、両方の世界を活用して、たとえばRailsとAngularのどちらの機能を使用してフォーマットするかを決定できます。 構築するもの 心配する必要はありません。このチュートリアルは、この目的のた