什么是 Azure 提供商中的 AWS lambda 层?

What is the equivalent of AWS lambda Layers in Azure provider?

问题

我有一个独立的 aws serverless 后端项目,它利用 lambda 层概念来共享 node_modules 和其他 custom dependencies.

在我的案例中,自定义依赖项的一个用例是将所有常见代码(如 HTTP_STATUS_CODE 枚举和 Api responses util 用于状态代码和后续模型和服务的文件夹中,稍后复制进入 node_modules 并将其托管到 s3 bucket

文件夹结构

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

在将函数部署到 AWS 提供商之前,我将所有文件从 customDependencies 复制到 node_modules 并将此 node_modules 推送到 S3 并创建一个层资源,其中所有 lambda函数指的是 node_modules

使用通用代码的函数示例

//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 层概念。

我试过的

我尝试使用此 cp -r customDependencies/nodejs/* node_modulescustomDependencies/nodejs 中的所有文件复制到 node_modules 我还安装了 serverless-webpack 作为插件使用此 webpack config 下面给出。

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 webpack 无法找到自定义依赖项

例如我收到警告

Could not determine version of module api_response_utils.js

随后出现错误

我通过从 webpack 配置中删除 externals 属性 修复了这个错误。

这是我所做的解决方法,部署工作正常,但我想知道是否有更好的方法来复制 AWS Lambda 层概念到天蓝色。

在 AWS 中,层是可重复使用的代码,可以被多个 Lambdas(我相信也跨 AWS 账户)使用。这里有一些限制,每个 Lambda 最多 5 层并且层应该 < 250MB。

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