代码之家  ›  专栏  ›  技术社区  ›  mitsui

Azure provider中的AWS lambda层等效于什么?

  •  0
  • mitsui  · 技术社区  · 2 年前

    问题

    我有一个独立的项目 aws无服务器 后端,利用lambda layers概念共享 node_modules 和其他 custom dependencies

    在我的例子中,自定义依赖项的一个用例包含所有常见代码,如 HTTP_STATUS_CODE 枚举和 Api responses util 用于状态代码和sequelize models and services,该文件夹稍后复制到 node\u模块 并将其托管到 s3 bucket

    文件夹结构

    .
    ├── customDependencies
    │   └── nodejs
    │       └── sequelizeORM
    │           ├── config
    │           ├── migrations
    │           ├── models
    │           ├── seeders
    │           └── services
    ├── node_modules
    └── src
        ├── functions
            ├── func1
            ├── func2
            ├── func3
        
    
    

    在将函数部署到AWS提供程序之前,我复制了 customDependencies node\u模块 然后推这个 node\u模块 到S3并创建一个层资源,其中所有lambda函数都引用 node\u模块

    使用公共代码的函数示例

    //func1
    
    import {HTTP_STATUS_CODE, stringifyResponse} from "api_response_utils"
    
    /*
    api_response_utils is referenced from a lambda layer
    */
    
    export const handler = (ctx) => {
        stringifyResponse(HTTP_STATUS_CODE.SUCCESS,ctx.req.body)
    
    }
    
    //-----------------
    
    
    //func2
    
    import {HTTP_STATUS_CODE, stringifyResponse} from "api_utils"
    
    
    export const handler = (ctx) => {
        stringifyResponse(HTTP_STATUS_CODE.SUCCESS,ctx.req.body)
    
    }
    
    

    我在azure环境中实现此功能时遇到问题。

    我想要实现的目标

    我想知道是否有任何方法可以在azure中复制lambda层的概念。

    我试过的

    我试着复制里面的所有文件 customDependencies/nodejs node\u模块 用这个 cp -r customDependencies/nodejs/* node_modules 我也有 serverless-webpack 作为插件安装,使用此 webpack config 如下所示。

    网页包。配置。js公司

    const path = require("path");
    const slsw = require("serverless-webpack");
    const nodeExternals = require("webpack-node-externals");
    
    
    module.exports = {
        context: __dirname,
        mode: slsw.lib.webpack.isLocal ? "development" : "production",
        entry: slsw.lib.entries,
        devtool: slsw.lib.webpack.isLocal
            ? "source-map"
            : "eval-cheap-module-source-map",
    
    
        externals: [nodeExternals()],
    
    
    
        resolve: {
            extensions: [".mjs", ".json", ".ts", ".js"],
            symlinks: false,
            cacheWithContext: false,
        },
        stats: {
            errorDetails: true,
        },
        output: {
            libraryTarget: "commonjs",
            path: path.join(__dirname, ".webpack"),
            filename: "[name].js",
        },
        externalsPresets: { node: true },
        module: {
            rules: [
                // all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
                {
                    test: /\.(tsx?)$/,
                    loader: "ts-loader",
                    exclude: [
                        [
                            path.resolve(__dirname, "node_modules"),
                            path.resolve(__dirname, ".serverless"),
                            path.resolve(__dirname, ".webpack"),
                        ],
                    ],
                    options: {
                        transpileOnly: true,
                        experimentalWatchApi: true,
                    },
                },
            ],
        },
        plugins: [
        ],
    };
    
    

    当我尝试时 serverless package Web包无法找到自定义依赖项

    例如,我收到一条警告

    Could not determine version of module api_response_utils.js

    后跟一个错误

    我通过删除 externals 属性来自 webpack 配置。

    这是我做的一个变通方法,部署工作正常,但我想知道是否有更好的方法来复制 AWS Lambda层 azure的概念。

    0 回复  |  直到 2 年前
        1
  •  3
  •   Ricky Gummadi    2 年前

    在AWS中,层是可重用的代码,可由多个lambda使用(我相信也可以跨AWS帐户使用)。这里有一些限制,每个Lambda最多5层,层应为<250MB。

    在Azure中有点不同,您可以在功能应用程序中部署多个功能,并且功能应用程序中的所有功能都可以使用相同的包(共享代码)。代码不能在不同功能的应用程序之间共享,这是关键部分。部署包没有限制。