NodejsはSAMを介してAWSラムダで表現する


私はNodeJsが好きで、それが便利で、使いやすい軽さを表現します.私は最近、Pythonとフラスコを選択する傾向がありますが、私は個人的なプロジェクトで、仕事でこれを使用している.私がエクスプレスに関して好きであることは、私が私のフロントエンド(そして、SSR内容)とAPIを同じプロジェクトに主催することができるということです.私がPOCまたは小さなサイト/アプリケーションを構築しているならば、これは完全な感覚を作ります.
私がローカルのために研究室を建設していたので"AWS Programming and Tools" Meetup私はlocalstackとダイナモを使用して小さなデモを構築しました.適応を構築するチームScrumbler いくつかの問題があるので、私は急行の簡単な例をwhippedして、サムテンプレートに包まれて、AWSラムダに展開しました.
このセットは、単に私が使用している@vendia/serverless-express ラッパー/ラムダのプロキシとして.このように、私は局所的に熱い再装填で発展することができて、ラムダに変化なしで同じコードを押します.
2エントリポイントがあります.
  • ローカル(app . local . js)
  • const app = require('./app')
    const port = 3000
    app.listen(port)
    console.log(`listening on http://localhost:${port}`)
    
    and
  • ラムダ.js
  • const serverlessExpress = require('@vendia/serverless-express')
    const app = require('./app');
    
    exports.handler = serverlessExpress({ app })
    
    そして、もちろん、アプリケーション自体.このアプリケーションはシンプルで小さく、1つのファイル(app . js)のすべてです
    const express = require('express')
    const app = express()
    const router = express.Router()
    const bodyParser = require('body-parser')
    const cors = require('cors')
    const path = require('path')
    
    let FruitBox = [];
    
    //Static content ie images
    app.use('/static', express.static('static'))
    
    router.use(cors())
    router.use(bodyParser.json())
    router.use(bodyParser.urlencoded({ extended: true }))
    
    app.set('view engine', 'ejs');
    app.set('views', path.join(__dirname, 'views'));
    
    router.get('/', function(req, res) {
        res.render('index', { fruitBox: FruitBox })
    })
    
    router.get('/index', function(req, res) {
        res.render('index', { fruitBox: FruitBox })
    })
    
    router.get('/react', function(req, res) {
        res.render('react')
    })
    
    router.get("/ping", async (req, res) => {
        const result = { incomming : 'ping ', resonse : 'pong '}
        res.send(JSON.stringify(result))
    });
    
    router.get("/fruitbox", async (req, res) => {
        res.send(JSON.stringify(FruitBox))
    });
    
    router.get("/fruitbox/:item", async (req, res) => {
        const item = parseInt(req.params.item)
        res.send(JSON.stringify(FruitBox[item]))
    });
    
    
    router.post('/fruitbox', async (req, res) => {
        let result
        try{
            const fruitName = req.body.fruitName;
            const qty = req.body.qty;
            const item = { fruit: fruitName, qty : qty}
            FruitBox.push(item)
            result = FruitBox
            res.status(200)
        }catch(e){
            console.log(e)
            result = { errorMessage : 'Ensure your POST body contains both a fruitName and a qty and content type is application/json '}
            res.status(500);
        }
    
        res.send(result)
    
    })
    
    app.use('/', router)
    
    module.exports = app;
    
    パッケージ.JSON
    {
      "name": "FruitBox",
      "version": "1.0.0",
      "description": "Express JS in AWS Lambda deployed to AWS Lambda via SAM",
      "main": "app.js",
      "repository": "https://github.com/kukielp/aws-sam-nodejs-express",
      "author": "Paul Kukiel",
      "license": "MIT",
      "dependencies": {
        "@vendia/serverless-express": "^4.3.2",
        "body-parser": "^1.19.0",
        "cors": "^2.8.5",
        "ejs": "^3.1.6",
        "express": "^4.17.1"
      },
      "devDependencies": {
        "nodemon": "^2.0.11",
        "npm-watch": "^0.7.0"
      },
      "scripts": {
        "dev": "nodemon app.local.js"
      }
    }
    
    この時点で我々はNPMのインストールを実行し、アプリケーションを実行する必要があります
    npm install
    npm run dev
    
    アプリを起動する必要がありますnodemon変更(ホットリロード)を見ている.しかしながら、ビューをまだ定義していないので、ベースルート(/)はエラーとなります.APIを使用すると、次のように閲覧できます.
    http://localhost:3000/fruitbox
    どこで見るべき
    []
    
    はい空の配列.
    ビューのコードを追加しましょう.この特定のビューのために、私はAPIとの相互作用を実証し、フルーツボックスに新しいフルーツアイテムを投稿し、インデックスを基にすべてのフルーツボックスと個々の項目を取得できるように小さなHTMLとJSアプリを構築した.
    それどころか、そのファイルをペーストして、私は直接それにリンクします.Here
    Expressはまた、側面に沿って@ Veldia/Serverless Expressモジュールは、ラムダから直接5 MBまでの静的資産の提供を許可します.生産環境では、私はS 3とCloudfrontにこれを無効にするが、これはローカル開発に非常に便利です.
    以下は、この実行の短いクリップです.

    SAM/AWS展開
    完全なレポを見ることができますhere