什么是 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_modules
将 customDependencies/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 中有点不同,您可以在函数应用程序中部署多个函数,并且函数应用程序中的所有函数都可以使用相同的包(共享代码)。代码不能在不同的功能应用程序之间共享,这是关键部分。部署包没有限制
问题
我有一个独立的 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_modules
将 customDependencies/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 中有点不同,您可以在函数应用程序中部署多个函数,并且函数应用程序中的所有函数都可以使用相同的包(共享代码)。代码不能在不同的功能应用程序之间共享,这是关键部分。部署包没有限制