我只需要下载一个图像文件,暂时验证其格式,稍后可能会调整其大小,然后将其传递到另一个库来使用它,所有这些都在一次调用中完成。有什么方法可以在 Lambda 函数中使用临时目录吗?谢谢!
我有一个 docker 设置,可以在 docker 中运行 serverless 和 dynamodb 。在我的 serverless.yml 中,我定义了创建表的指令,但当我运行它时,docker compose up它并没有创建表(我已经通过运行查询列出表进行了检查。
serverless.yml
...
provider:
name: aws
runtime: nodejs8.10
stage: dev
region: eu-west-1
plugins:
- serverless-dynamodb-local
- serverless-offline
custom:
dynamodb:
inMemory: true
port: 8000
migrate: true # create tables on start
onStart: true
serverless-offline:
babelOptions:
presets: ["es2015"]
resources:
Resources:
UserTable:
Type: "AWS::DynamoDB::Table"
Properties:
TableName: UserTable
AttributeDefinitions:
- AttributeName: userId
AttributeType: S
- AttributeName: fullname
AttributeType: S
KeySchema:
- AttributeName: userId
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个功能,当任何图像上传到存储桶中的图像文件夹时,该功能通过在屏幕截图文件夹中保存图像的缩略图版本来创建缩略图。我正在使用无服务器框架。我不断收到如下所示的错误。我已经粘贴了确切的代码,以便任何人都可以复制粘贴并实现此解决方案。还包括 Serverless.yml、处理程序函数文件以及任何支持文件。
我无法弄清楚当我指的是缓冲区时为什么会收到此错误,即对象类型不是缓冲区等。
{ InvalidParameterType: Expected params.Body to be a string, Buffer, Stream, Blob, or typed array object
at ParamValidator.fail (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:50:37)
at ParamValidator.validatePayload (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:255:10)
at ParamValidator.validateScalar (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:133:21)
at ParamValidator.validateMember (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:94:21)
at ParamValidator.validateStructure (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:75:14)
at ParamValidator.validateMember (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:88:21)
at ParamValidator.validate (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:34:10)
at Request.VALIDATE_PARAMETERS (/var/runtime/node_modules/aws-sdk/lib/event_listeners.js:125:42)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at callNextListener (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:95:12)
message: 'Expected params.Body to be a string, Buffer, Stream, Blob, or typed array object',
code: 'InvalidParameterType',
time: 2019-03-12T16:37:26.910Z }Run Code Online (Sandbox Code Playgroud)
代码:
处理程序.js
'use strict';
const resizer = require('./resizer');
module.exports.resizer = (event, context, callback) …Run Code Online (Sandbox Code Playgroud)据说lambda在没有流量时关闭容器,并且当长时间后第一次请求时,存在冷启动问题。是对的吗?例如。如果我在 AWS lambda 上运行删除向导应用程序,如果没有流量到来,服务器是否会关闭,并且会根据第一个请求再次启动服务器?那是对的吗?
或者它不会关闭容器中运行的服务器,而是执行其他操作?请解释?
invoke local无服务器处理请求负载的方式与部署到 AWS 时的行为似乎有所不同。
预期的行为是您将从请求正文中提取有效负载,如下所示......
func Handler(ctx context.Context, request events.APIGatewayProxyRequest)
Run Code Online (Sandbox Code Playgroud)
然后将其解组为您的数据类型,如下所示......
type SearchQuery struct {
Caller string `json:"caller"`
Value string `json:"value"`
}
Run Code Online (Sandbox Code Playgroud)
err := json.Unmarshal([]byte(request.Body), &searchQuery)
Run Code Online (Sandbox Code Playgroud)
但是,当使用该--data标志在本地调用该函数时,有效负载不在request.Body.
events.APIGatewayProxyRequest) {
Resource: (string) "",
Path: (string) "",
HTTPMethod: (string) "",
Headers: (map[string]string) <nil>,
MultiValueHeaders: (map[string][]string) <nil>,
QueryStringParameters: (map[string]string) <nil>,
MultiValueQueryStringParameters: (map[string][]string) <nil>,
PathParameters: (map[string]string) <nil>,
StageVariables: (map[string]string) <nil>,
RequestContext: (events.APIGatewayProxyRequestContext) {
AccountID: (string) "",
ResourceID: (string) "",
Stage: (string) "",
RequestID: (string) "",
Identity: (events.APIGatewayRequestIdentity) {
CognitoIdentityPoolID: …Run Code Online (Sandbox Code Playgroud) 我用来serverless-framework在 AWS 中安排任务。
我的应用程序结构是
|- src
|- tasks
|- analytics.task.js
|- tasks.js
|- serverless.yml
Run Code Online (Sandbox Code Playgroud)
的内容analytics.task.js
module.exports.run = (event, context, callback) => {
console.log('Getting data...');
console.log('success');
};
Run Code Online (Sandbox Code Playgroud)
出于测试目的,从运行方法中删除了所有其他代码。
内容tasks.js
const analyticsTask = require('./src/tasks/analytics.task');
module.exports.analytics = analyticsTask.run();
Run Code Online (Sandbox Code Playgroud)
和内容serverless.yml
functions:
analyticsDataProcess:
handler: tasks.analytics
description: 'Send analytics data to the backend server'
events:
- schedule:
name: analytics-data-process-task
description: 'Send analytics data every minute'
rate: rate(1 minute)
enabled: true
Run Code Online (Sandbox Code Playgroud)
但是运行任务的时候却报错
{
"errorMessage": "e is not a function",
"errorType": "TypeError",
"stackTrace": …Run Code Online (Sandbox Code Playgroud) 我们尝试在 BitBucket 管道上使用无服务器方式部署 lambda,但在运行命令时遇到了问题serverless config credentials。这个问题也发生在 docker 容器和我们本地的机器上。
这是我们正在运行的命令:
serverless config credentials --stage staging --provider aws --key $AWS_ACCESS_KEY --secret $AWS_ACCESS_SECRET
Run Code Online (Sandbox Code Playgroud)
它给了我们错误:
Error: Profile default does not exist
Run Code Online (Sandbox Code Playgroud)
该配置文件在我们的 serverless.yml 文件中定义。如果我们在运行命令之前重命名 serverless 文件,它就会起作用,然后我们可以将 serverless.yml 文件放回去并成功部署。
例如
- mv serverless.yml serverless.old
- serverless config credentials --stage beta --provider aws --key $AWS_ACCESS_KEY --secret $AWS_ACCESS_SECRET
- mv serverless.old serverless.yml
Run Code Online (Sandbox Code Playgroud)
我们尝试--profile default在那里添加开关,但没有什么区别。
值得注意的是,直到我们开始在无服务器文件中使用 SSM 参数存储之前,这并不是一个问题,当我们添加它时,它就开始给我们带来错误Profile default does not exist。
serverless.yml(部分)
service: our-service
provider:
name: aws
runtime: nodejs12.x
region: eu-west-1 …Run Code Online (Sandbox Code Playgroud) 我对 AWS Lambda 非常陌生,并且根据我在网上找到的许多示例(+阅读无尽的文档)很难理解其功能。我了解使用此类服务的主要目标是通过允许 Lambda 和 API 网关承担管理服务器的角色来实现成本高效且可能省力的无服务器架构(因此无服务器并不意味着您不使用服务器,但架构会为您处理所有事情)。我将研究整理为开发人员将 Flask Web 应用程序部署到 Lambda 时采用的两种常用方法:
使用 zappa 将整个应用程序部署到 Lambda,zappa 配置(json 文件)将进行 API 网关身份验证。
仅部署函数,即解析黑盒,将用户输入转换为后端端点期望的形式(也向后) -> 从配置 Lambda 代理的 API 网关获取代理 URL -> 有一个单独的应用程序,使用网址
(还有 3 个,它不使用 API 网关并调用应用程序本身中的 Lambda 函数 - 但我真的很想获得使用 API 网关的实践经验)
以下是我对上述两种方法的疑问:
对于1,我不明白Lambda如何调用Flask应用程序中的函数。根据我的理解,Lambda 仅调用具有参数 event 和 context 的函数,或者 url 调用(由 API 网关制定的 url)实际上是调用 Flask 应用程序中单独函数的事件,从而使 Lambda 能够充当“无服务器环境 - 这对我来说没有意义,因为在我分析的大多数示例中,事件是用户输入数据。这意味着应用程序中的某些函数没有事件,而有些则有事件,这意味着 Lambda 以某种方式神奇地找出如何处理不同的函数调用?
我也知道Lambda的容量确实有限,那么这是最好的方法吗?这似乎是在 Lambda 上部署 Web 应用程序的标准方法。
对于 2,我了解将 API 网关 URL 合并到 Flask 应用程序中的步骤。因此,Flask 应用程序将使用 url …
您好,我正在尝试使用无服务器执行以下操作:如果我没有提供选项,我希望它选择另一个选项
${opt:fb,${opt:environment,'dev'}}
Run Code Online (Sandbox Code Playgroud)
然而,有些事情是错误的,因为这个错误总是在我打电话时出现sls deploy:
A valid option to satisfy the declaration 'opt:fb,dev' could not be found.
Run Code Online (Sandbox Code Playgroud)
我不明白出了什么问题,因为显然它似乎正确选择了该值。能帮我一下吗?谢谢
serverless-framework serverless-architecture serverless aws-serverless
我正在将 Next.js 用于我的业余项目。我有一个托管在 ElephantSQL 上的 PostrgeSQL 数据库。在 Next.js 项目中,我使用 apollo-server-micro 包设置了 GraphQL API。
在设置 GraphQL API 的文件 (/api/graphql) 中,我导入一个数据库帮助程序模块。在其中,我设置了一个池连接并导出一个函数,该函数使用池中的客户端来执行查询并返回结果。这看起来像这样:
// import node-postgres module
import { Pool } from 'pg'
// set up pool connection using environment variables with a maximum of three active clients at a time
const pool = new Pool({ max: 3 })
// query function which uses next available client to execute a single query and return results on success
export async function queryPool(query) {
let payload …Run Code Online (Sandbox Code Playgroud) serverless ×10
aws-lambda ×6
node.js ×3
amazon-s3 ×1
aws-sdk ×1
docker ×1
dropwizard ×1
flask ×1
go ×1
next.js ×1
postgresql ×1