クラシックエクスプレスの移行.サーバーレスフレームワーク

7171 ワード

問題


クラシックエクスプレス.JSアプリケーションはバックエンドを構築するために大きいです.しかし、彼らの展開は少しトリッキーにすることができます.市場にはいくつかの解決策があります.しかし、「より簡単」とは、特別な構成またはより高いサービスコストを意味する.
この例では、CloudFrontを通して提供されている角度フロントエンドを展開しようとしていて、OAuthフローを管理するために別々に配備されたバックエンドを必要としました.我々は、httpsをサポートするソリューションを展開し、CI経由で自動化することが容易にする必要がありました.

無セルフレームワーク


Serverless Frameworkは、AWSラムダにアプリケーションを構築し、配備するためのフレームワークであり、簡単に移行し、Expressを展開できます.長期保守性の低いコストでJSサーバー.これはとても簡単だったので、既存のAPIを移行するのに1時間しかかかりませんでした.

サーバレスのinitスクリプト


このプロセスを開始するために、Serverless CLIを使用して新しいServerless Expressを初期化しました.プロジェクト.これは、アプリケーションの設定例です.
$ serverless
What do you want to make? AWS - Node.js - Express API
What do you want to call this project? example-serverless-express

Downloading "aws-node-express-api" template...
Installing dependencies with "npm" in "example-serverless-express" folder
Project successfully created in example-serverless-express folder

What org do you want to add this service to? [Skip]
Do you want to deploy your project? No

Your project is ready for deployment and available in ./example-serverless-express
Run **serverless deploy** in the project directory
    Deploy your newly created service
Run **serverless info** in the project directory after deployment
    View your endpoints and services
Run **serverless invoke** and **serverless logs** in the project directory after deployment
    Invoke your functions directly and view the logs
Run **serverless** in the project directory
    Add metrics, alerts, and a log explorer, by enabling the dashboard functionality
以下に簡単に説明します.
何を作りたいですか.このプロンプトではいくつかのscaffoldingオプションが用意されています.我々のケースでは、Express APIは我々が移行していたものであるので、完全な解決でした.
このプロジェクトを何と呼びたいですか.ここで何をしてもよい.ディレクトリに名前を付け、AWSに展開するリソースの名前スキーマを定義します.
どのようなサービスをこのサービスに追加しますか?この質問はServerlessを使用していると仮定します.あなたの展開を管理するためのCOMダッシュボード.私たちは直接GitHubアクションとAWSツールを使用することを選択しています.
プロジェクトを展開しますか?これはscaffoldingの直後にアプリケーションを配備しようとします.AWS資格情報が正しく設定されていない場合は、デフォルトのプロファイルを使用します.別のAWSアカウントでいくつかのプロジェクトがあるので、カスタムプロファイルの設定が必要になりました.

サーバレスのinit出力


上記のinitスクリプトは次のように出力します.
  • .ジティノル
  • ハンドラ.js
  • パッケージ.JSON
  • READMEMD
  • 無力.気象研
  • ここのキーは、Serverlessです.YMLとハンドラ.出力されるJSファイル.
    無力.気象研
    service: example-serverless-express
    frameworkVersion: '2 || 3'
    
    provider:
      name: aws
      runtime: nodejs12.x
      lambdaHashingVersion: '20201221'
    
    functions:
      api:
        handler: handler.handler
        events:
          - httpApi: '*'
    
    ハンドラ.js
    const serverless = require("serverless-http");
    const express = require("express");
    const app = express();
    
    app.get("/", (req, res, next) => {
      return res.status(200).json({
        message: "Hello from root!",
      });
    });
    
    app.get("/hello", (req, res, next) => {
      return res.status(200).json({
        message: "Hello from path!",
      });
    });
    
    app.use((req, res, next) => {
      return res.status(404).json({
        error: "Not Found",
      });
    });
    
    module.exports.handler = serverless(app);
    
    ご覧のように、これは標準的なExpressのサーバーは、箱から動作する準備ができています.しかし、我々は自信を持って移行するのを助けるために、生活の変化の質を作り、私たちが開発のためにローカルにAPIを使用できるようにする必要がありました.

    品質向上


    Serverless Frameworkが我々の開発プロセスを助けるために必要としていた箱から提供しないいくつかのことがあります.幸いにも、私たちはすぐにインストールし、構成することができた偉大なプラグインがあります.

    環境変数


    OAuthプロバイダがホストドメインごとに特定されているので、環境変数ごとに必要です.Serverless Framework supports .env files out of the box しかし、dotenvパッケージをインストールする必要がありますuseDotenv 無記名の旗.京大理

    ( Babel /タイプスクリプトのサポート)


    上記のハンドラで確認できます.JSファイルは、現代のJavaScriptまたはTypesScriptの代わりにCommonJsを得ています.これらを得るには、Webpackや他のいくつかのバンドルが必要です.serverless-webpack あなたの生態系を完全にコントロールしたいならばserverless-bundle それはあなたのボックスのウェブパック4の合理的なデフォルトのセットを提供します.我々はすぐに開始を取得するには、このオプションを選んだ.

    オフラインモード


    クラシックエクスプレスサーバーを使用すると、サーバーを取得し、ローカルにテストするために実行する簡単なノードスクリプトを使用することができます.Serverlessは、それを作るAWS生態系で走らせたいです.ラッキーフォーフォー.David Hérault 維持し続けているserverless-offline 展開する前にローカル関数をエミュレートできます.

    最終設定


    これらの変化を与えられて、我々のServerless.YMLファイルは次のようになります.
    service: starter-dev-backend
    frameworkVersion: '2 || 3'
    useDotenv: true # enable .env file support
    
    plugins: # install serverless plugins
      - serverless-bundle
      - serverless-offline
    
    custom: # configure serverless-offline
      serverless-offline:
        httpPort: 4000
    
    provider:
      name: aws
      profile: exampleprofile # use your own profile
      stage: production # use your specified stage
      runtime: nodejs14.x
      lambdaHashingVersion: '20201221'
    
    functions:
      api:
        handler: handler.handler
        events:
          - httpApi: '*'
    
    重要な注意事項
  • プラグインのServerlessバンドルとServerlessなオフラインの順序は重大です.
  • Serverlessなオフラインのためのカスタムポートは、どんな未使用のポートでもありえます.ローカル開発のためにこの値を設定するときにフロントエンドサーバがどのポートを使用しているかを覚えておいてください.
  • プロバイダの設定でプロファイルとステージを設定します.これにより、環境設定とAWSプロファイルの資格情報を指定して展開を使用できます.
  • すべてのセットで、我々は今、基本的なAPIを展開する準備が整いました.

    新しいAPIの配備


    Serverless展開は非常に簡単です.プロジェクトディレクトリに次のコマンドを実行できます.
    $ serverless deploy
    
    このコマンドはAPIをAWSに展開し、APIゲートウェイと関連するラムダを含む必要なリソースを作成します.最初の展開はおよそ5分かかります、そして、各々のその後のdeplyは1分か2分かかるだけです!その出力には、展開されるURLを含む展開の情報が格納されます.
    https://<hash-string>.execute-api.<region>.amazonaws.com
    
    今、このAPIでアプリを指すことができますし、それを使用して起動します.

    次の手順


    まだ解決しなければならないが、簡単に修正されるいくつかの問題
  • 新しいラムダは、環境変数で展開されず、AWSコンソールを介して設定する必要があります.我々はちょうど行方不明ですsome minor configuration in our serverless.yml .
  • メインディストリビューションではマージに展開されません.これについては、我々はofficial Serverless Github Action . あるいは、Serverlessなダッシュボードにライセンスを購入することができましたが、このオプションは少し高価です.しかし、我々は他のクライアントプロジェクトでこれを使用しました、そして、それは本当に我々が我々の展開を管理して、モニターするのを助けました.
  • 結論


    上記の手順を踏んで、APIを数分で走らせることができました.そして、それが既存の急行サーバーのための1 - to - 1交換であるので、我々は既存の実装をこの新しいServerlessなインプリメンテーションに入れて、AWSにそれを配備して、ちょうど2、3時間でそれを使い始めることができました.
    この特定のアーキテクチャは、新しいプロジェクトをブートストラップするための大きな手段ですが、それは大きなプロジェクトのいくつかのスケーリング問題が付属しています.そのように、我々は純粋なServerlessを推薦しないで、モノリシックプロジェクトのために表現して、代わりに、あなたのアプリケーションをより小さなラムダ関数に水平にするために、AWSでServerlessなフレームワークの驚くべき能力のいくらかを利用することを提案します.
    このDOT Labsはスタッフの増強、建築指導、企業へのコンサルティングに焦点を当てた開発コンサルタントです.
    我々は実装を支援し、現代のWebのベストプラクティスなどの技術、角度、Vue、Webコンポーネント、GraphSQL、ノード、および詳細を教える.