クラシックエクスプレスの移行.サーバーレスフレームワーク
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スクリプトは次のように出力します.
無力.気象研
service: example-serverless-express
frameworkVersion: '2 || 3'
provider:
name: aws
runtime: nodejs12.x
lambdaHashingVersion: '20201221'
functions:
api:
handler: handler.handler
events:
- httpApi: '*'
ハンドラ.jsconst 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: '*'
重要な注意事項新しいAPIの配備
Serverless展開は非常に簡単です.プロジェクトディレクトリに次のコマンドを実行できます.
$ serverless deploy
このコマンドはAPIをAWSに展開し、APIゲートウェイと関連するラムダを含む必要なリソースを作成します.最初の展開はおよそ5分かかります、そして、各々のその後のdeplyは1分か2分かかるだけです!その出力には、展開されるURLを含む展開の情報が格納されます.https://<hash-string>.execute-api.<region>.amazonaws.com
今、このAPIでアプリを指すことができますし、それを使用して起動します.次の手順
まだ解決しなければならないが、簡単に修正されるいくつかの問題
結論
上記の手順を踏んで、APIを数分で走らせることができました.そして、それが既存の急行サーバーのための1 - to - 1交換であるので、我々は既存の実装をこの新しいServerlessなインプリメンテーションに入れて、AWSにそれを配備して、ちょうど2、3時間でそれを使い始めることができました.
この特定のアーキテクチャは、新しいプロジェクトをブートストラップするための大きな手段ですが、それは大きなプロジェクトのいくつかのスケーリング問題が付属しています.そのように、我々は純粋なServerlessを推薦しないで、モノリシックプロジェクトのために表現して、代わりに、あなたのアプリケーションをより小さなラムダ関数に水平にするために、AWSでServerlessなフレームワークの驚くべき能力のいくらかを利用することを提案します.
このDOT Labsはスタッフの増強、建築指導、企業へのコンサルティングに焦点を当てた開発コンサルタントです.
我々は実装を支援し、現代のWebのベストプラクティスなどの技術、角度、Vue、Webコンポーネント、GraphSQL、ノード、および詳細を教える.
Reference
この問題について(クラシックエクスプレスの移行.サーバーレスフレームワーク), 我々は、より多くの情報をここで見つけました https://dev.to/thisdotmedia/migrating-a-classic-expressjs-to-serverless-framework-584fテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol