メインコンテンツへスキップ
見出し画像

【Rust】ノーコードでAWS Lambda + API構築 + DB操作をやってみた【後編】

    はじめに

    こんにちは。ネオス株式会社の開発技術本部SA部です。
    今回は、Rustで作ったAPIをAWS Lambdaにデプロイし、HTTPリクエストをAPI Gatewayでルーティングする方法をご紹介します。他にも性能比較としてRust・Python・Node.js・Java用のLambdaの実行速度について比較しました。

    本記事は後編の位置づけとなっており、用いたAPIは、前編にて紹介していますので気になる方はチェックしてみてください!

    この記事は以下のような方におすすめです。

    • Rustに興味のある方や学び始めている方

    • エンジニア業務への就職を考えている学生の方

    • 生成AIを取り入れた業務効率化を検討しているエンジニアの方

    それではどうぞよろしくお願いします!

    八百屋APIのソースコードをAWS Lambdaへデプロイ


    前編で作成したAPIは以下の通りでした。

    画像
    前編で作成したAPIのイメージ

    前回作成したAPIのソースコードをAWS Lambdaにデプロイするためには下記のものが必要になります。※コンソールで操作する場合はAWS CLIとCLIを使った手順は必要ないので飛ばしていただいても大丈夫です。

    • AWS CLI

    • IAMユーザアカウント、アクセスキー、シークレットキー

    • Lambda用のロール

    • 展開してあるCargo Lambdaのソースコード

    AWS の公式サイトにて、Lambda用のロールとアクセスキー等を作成する際に参考になる情報を記載しました。作成方法が分からない場合は下記のサイトを見てみるといいかと思います。

    AWS CLIを使用してCargo Lambdaをビルド/デプロイする手順

    1. まず、以下のコマンドでソースコードをビルドします。

    cargo lambda build --release --output-format zip

    2.次にLambdaにソースコードを展開・作成するコマンドを打ちます。(2回目以降は異なる)

    aws lambda create-function \
         --function-name lambda-template-rust \
         --runtime provided.al2023 \
         --role arn:aws:iam::AWSのアカウントID:role/先ほど作成したロール名 \
         --handler rust.handler \
         --zip-file fileb://target/lambda/lambda-template-rust/bootstrap.zip

    3.2回目以降にLambdaにデプロイする際はこちらのコマンドを使います。

    aws lambda update-function-code \
         --function-name lambda-template-rust \
         --zip-file fileb://target/lambda/lambda-template-rust/bootstrap.zip

    4.上記のコマンドでデプロイが成功したら、Lambdaコンソールのテストイベントでテンプレートを「API Gateway AWS Proxy」にすることで動作を確認することができるので試してみてください。

    API GatewayでのRESTful APIの設定


    API Gatewayとは

    API Gatewayは、AWSが提供しているフルマネージドの API管理サービスです。
    これを使うと、REST APIやHTTP API、WebSocket APIが簡単に作れて、バックエンド(今回はLambda)との連携もスムーズにできます。
    API Gatewayを挟むことで、アクセス制御やスケーリングもAWS側で面倒見てくれるので、開発者的にはかなりラクできます。

    APIの構成


    このガイドで構築するREST APIの構成は以下の通りです:

    • クライアント
      ↓ HTTPリクエスト(GET / POST / PUT / DELETE)

    • API Gateway(REST API)
      ↓ Lambda プロキシ統合

    • AWS Lambda(lambda-template-rust)
      ↓ ビジネスロジック・データ処理

    • レスポンス

    💡 Lambdaプロキシ統合 とは
    API Gateway が受け取ったリクエストを、そのままLambdaに投げて、Lambdaから返ったレスポンスを丸ごとクライアントに返す設定です。
    これを使うと、API Gateway側の設定がとてもシンプルになります。

    対応エンドポイント一覧

    📘 Lambdaではevent.pathParameters()やevent.body() を使って、
    パスやリクエストボディを取得します。


    構築手順

    1. 新しいAPIを作成する

    AWSコンソールにログインしたら、「API Gateway」を開きます。
    右上の「APIの作成」をクリックし、「REST API」の「構築」ボタンをクリックします。

    画像

    API名を入力、APIエンドポイントタイプで「リージョン」を選択、IPアドレスのタイプで「IPv4」を選択して「作成」ボタンを押せばOKです。

    画像

    2. リソースの作成

    まずは /fruitsリソースを作ります。アクションメニューから「リソースの作成」をクリックし、名前をfruitsに。

    画像

    次に/fruits/{fruit_name} リソースを追加します。
    アクションメニューから「リソースの作成」をクリックし、パスを/fruits/、リソース名を{fruit_name}にします。

    画像

    この {fruit_name} がパスパラメータになり、AWS Lambdaでは次のように取れます(Rustでの例)

    let fruit_name: Option<&str> = event.path_parameters().first("fruit_name");

    3. メソッドを追加する

    リソースを選んで、「メソッドの作成」から「GET」を追加します。
    統合タイプは「Lambda 関数」、そしてLambdaプロキシ統合をONに。続いて、先ほどデプロイしたlambda-template-rust関数を呼び出すために、リージョンとARNを指定し、メソッドを作成します。

    画像
    画像

    作成が終わったら、同じ要領で /fruits のPOST、/fruits/{fruit_name}のGET / PUT / DELETEも追加していきます。
    全部作るとこんな感じ。

    画像

    プロキシ統合を有効にすると、こんな形式でLambdaにデータが届きます。

    {
      "resource": "/fruits/{fruit_name}",
      "pathParameters": {
        "fruit_name": "apple"
      },
      "httpMethod": "GET",
      "body": null
    }

    4. CORS(Cross-origin resource sharing)を設定

    💡 CORS(Cross-origin resource sharing) とは
    CORSは、別のオリジン(ドメイン)からAPIを呼び出せるようにする仕組みです。これを設定していないと、ブラウザのセキュリティ制限でAPIリクエストがブロックされてしまうことがあります。

    まず、/fruits リソースを選択し、画面右上の「CORSを有効にする」をクリックします。ダイアログが出てきたら、以下を設定して「保存」をクリックしましょう。

    • 許可するメソッド(Access-Control-Allow-Methods):GET / POST /  OPTIONS を選択。

    • 許可するオリジン(Access-Control-Allow-Origin):http://localhost:3000 等を指定。

    同じように、/fruits/{fruit_name}リソースにもCORS設定を追加します。

    • 許可するメソッド(Access-Control-Allow-Methods):GET / PUT / DELETE / OPTIONS を選択。

    • 許可するオリジン(Access-Control-Allow-Origin):http://localhost:3000 等を指定。

    認証情報を送るなどで独自ヘッダー(例:Authorization)を使う場合は、Access-Control-Allow-HeadersにContent-Type, Authorizationを追加しておきます。本番環境では、*(ワイルドカード)で全オリジンを許可するのは避けましょう。アクセスできるオリジンをきちんと指定しておくのが安全です。

    画像

    5. API をデプロイ

    右上の「APIのデプロイ」をクリックして、新しいステージを作成します。
    ステージ名を入れて「デプロイ」!

    完了すると「ステージ」一覧に反映され、エンドポイントURLはこんな感じになります。

    https://<api-id>.execute-api.<region>.amazonaws.com/rust-api-test/fruits/apple

    6. テストしてみる

    API Gatewayの画面から、テストしたい方法を選び「テスト」タブを開きます。

    たとえば /fruits/{fruit_name} のGETを試す場合、パラメータ欄にフルーツ名を入れて「テスト」をクリック!

    画像

    うまくいけばLambdaからレスポンスが返ってきます。

    画像

    もし「Lambdaプロキシ統合」をOFFにしている場合は、うまくレスポンスが返らず、エラーメッセージが表示されることがあります。

    画像

    結合テスト


    ここまで構築した APIを、外部ネットワークからHTTPクライアントツールを使って結合テストしました。
    今回はPostmanを利用し、API Gateway経由でLambdaを呼び出す動作確認を行っています。

    テストしたエンドポイントとレスポンス例は以下の通りです。

    画像

    このテストにより、APIの基本機能(一覧取得・登録・取得・更新・削除)がすべて正常に動作することを確認しました。これで、今回のブログで目指した 八百屋APIは完成 です。


    比較テスト:Rustと他言語の性能比較

    次に、Rustの優位性を確認するため、同じ仕様のAPIをPython / Node.js / Javaでも実装し、同一のDynamoDBに接続して性能比較を行いました。

    テスト条件

    • 各言語で「一覧取得(GET)」「新規登録(POST)」「取得(GET)」「更新(PUT)」「削除(DELETE)」の5操作を実行

    • 10分間の待機を挟み、これを20回繰り返し

    • 各操作の平均実行時間を計測

    このテスト条件を実施するためのRustのソースコードを生成 AIに作成させて、テストした結果が以下となります。

    結果(平均実行時間)


    画像

    グラフの読み取りポイント

    • Rust(青)は全操作で安定して高速。特に「一覧取得(GET)※起動処理込み」で他言語より明確に優位。

    • Python(黄)は「新規登録(POST)」がRustより速い。ライブラリが優れている可能性がある。

    • Node.js(緑)は「一覧取得(GET)※起動処理込み」と「新規登録(POST)」でRustに劣る。

    • Java(オレンジ)は全体的に遅く、特に「一覧取得(GET)※起動処理込み」と「新規登録(POST)」が遅い。
      コールドスタート時の起動処理に時間がかかっている可能性がある。

    考察

    • Rustは起動処理が速く、コールドスタートの影響が小さい。

    • 言語特性による効率性の差が Lambda 環境で顕著に表れ、Rustは「低レイテンシ+低コスト運用」に適している。

    ということが分かり、RustがAWS Lambdaへの実装に優れていることが証明されました。

    最後に


    AWS のドキュメントは分かりづらい部分も多いですが、実際に触れてみると意外とシンプルに動くものが作れます。特にサーバーレス開発では、LambdaとAPI Gatewayの組み合わせが定番です。この構成はサーバーの管理が不要で、自動スケールが効き利用した分だけ課金されるため、小規模なアプリから本番レベルのサービスまで幅広く対応できます。そんなLambda にはコールドスタートという特有の課題がありますが、Rust はその影響を受けにくいためLambda に非常に適した言語と言えます。

    今回の記事が、ソフトウェアエンジニアを目指す方の参考になれば幸いです。ここまで一読いただき、ありがとうございました。


    あなたへのおすすめ