我使用无服务器框架将一个Python lambda函数部署到AWS.在我的serverless.yml文件中,我已经定义了一个我需要部署到具有特定ID的VPC的功能,因为只有VPC具有从lambda函数发出一些与业务相关的请求所需的网络连接.
customer_callback:
vpc:
subnetIds:
- subnet-something
handler: myservice/event_stream.customer_callback
Run Code Online (Sandbox Code Playgroud)
在文档中,上面的示例是他们提到的将函数附加到VPC的方法:
https://serverless.com/framework/docs/providers/aws/guide/functions/
但是,该功能根本没有部署到VPC,例如我最终得到:
我试过像这样直接指定VPC ID:
customer_callback:
vpc:
id: vpc-something
handler: myservice/event_stream.customer_callback
Run Code Online (Sandbox Code Playgroud)
但这没有任何作用.这个问题的文档基本上不存在,我尝试了很多搜索,所以我最后要在这里发帖寻求帮助.
众所周知,API Gateway和lambda支持二进制请求/响应,但我对节点JavaScript中的后端编程有一个疑问.
环境:
在上述环境中,在我的代码中,我将响应内容作为二进制(缓冲对象数组).
但是,如果我直接将Buffer对象数组作为响应,
callback(null,{
headers: {'Content-Type': 'image/jpeg'},
body: body
});
Run Code Online (Sandbox Code Playgroud)
收到回复是这样的:
Content-type: image/jpeg
{type=Buffer, data=[255,216,255,224,0,16,74,70,73,70,0...
Run Code Online (Sandbox Code Playgroud)
如果我通过base64编码将Buffer对象数组作为响应,
callback(null,{
headers: {'Content-Type': 'image/jpeg'},
body: body.toString('base64')
});
Run Code Online (Sandbox Code Playgroud)
收到回复是这样的:
Content-type: image/jpeg
/9j/4AAQSkZJRgABAQEASABIAAD/2wBDA...
Run Code Online (Sandbox Code Playgroud)
如何使用无服务器框架从节点JS后端向API网关提供二进制响应?
== PostScript ==
根据此文档:
没有Accept标头的AWS API Gateway二进制输出
我们必须将Integration响应的"Content Handling"更改为"CONVERT TO BINARY",以响应二进制响应.
但是我该怎么设置呢?
我不知道serverless.yml和AWS控制台GUI.
如果我成功设置了Content Handling => CONVERT TO BINARY,我可以解决响应二进制响应吗?
== 1月17日编辑==
嗨@ ka-hou-ieong
你写了rest-api-id和resource-id,它们在下面的图片中,对吗?
但是使用这些id,命令结果说:
$aws apigateway put-integration-response --rest-api-id XXXXXXXX --resource-id XXXXXX --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY
An error occurred …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有一些部分无法承受由Lambda功能在新的或未使用一段时间后经历的"冻融"循环引起的额外1-2秒延迟.
如何保持这些Lambda函数的温暖,以便AWS不必一直重新配置它们?这适用于1)不经常使用的功能和2)最近部署的功能.
理想情况下,有一个我错过的设置称为"保持温暖",这增加了Lambda函数的成本,但始终保持函数温暖并准备响应,但我很确定这不存在.
我想一个选择是使用CloudWatch计时器来经常ping这些函数......但这对我来说是错误的.此外,我不知道AWS用于将Lambda函数置于冰上的时间间隔.
这是我想要做的:
当地环境
无服务器框架版本1.22.0
Python 2.7
这是我的serverless.yml文件
service: aws-python # NOTE: update this with your service name
provider:
name: aws
runtime: python2.7
stage: dev
region: us-east-1
iamRoleStatements:
- Effect: "Allow"
Action:
- s3:*
- "ses:SendEmail"
- "ses:SendRawEmail"
- "s3:PutBucketNotification"
Resource: "*"
functions:
csvfile:
handler: handler.csvfile
description: send mail whenever a csv file is uploaded on S3
events:
- s3:
bucket: mine2
event: s3:ObjectCreated:*
rules:
- suffix: .csv
Run Code Online (Sandbox Code Playgroud)
这是我的lambda函数:
import json
import boto3
import botocore
import logging
import …Run Code Online (Sandbox Code Playgroud) 简单的aws lambda和aws lambda @ edge有什么区别?
我正在使用无服务器框架使用 aws lambda,我将运行时从 更改nodejs8.10为nodejs10.x,然后我得到了一个错误跟踪,
{"errorType":"Runtime.ImportModuleError","errorMessage":"Error: Cannot find module 'jmespath'","stack":["Runtime.ImportModuleError: Error: Cannot find module 'jmespath'"," at _loadUserApp (/var/runtime/UserFunction.js:100:13)"," at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)"," at Object.<anonymous> (/var/runtime/index.js:36:30)"," at Module._compile (internal/modules/cjs/loader.js:701:30)"," at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)"," at Module.load (internal/modules/cjs/loader.js:600:32)"," at tryModuleLoad (internal/modules/cjs/loader.js:539:12)"," at Function.Module._load (internal/modules/cjs/loader.js:531:3)"," at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)"," at startup (internal/bootstrap/node.js:283:19)"]}
Run Code Online (Sandbox Code Playgroud)
这个问题的原因是什么,如何解决?
我正在通过serverless. 并且需要在部署期间从secretmanager读取值。我已阅读此文档:https://www.serverless.com/framework/docs/providers/aws/guide/variables/#reference-variables-using-the-ssm-parameter-store
它显示了如何阅读它:
custom: supersecret: ${ssm:/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager~true}
但是,它可用于从秘密管理器读取字符串值。我的秘密是一个包含key/value成对的对象。我怎样才能读懂key里面的秘密?
我尝试过这样的事情:
custom: supersecret: ${ssm:/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager:MY_KEY~true}
custom: supersecret: ${ssm:/aws/reference/secretsmanager/secret_ID_in_Secrets_Manager/MY_KEY~true}
但他们都没有工作。
amazon-web-services serverless-framework aws-secrets-manager
我创建了一个简单的 Flask 应用程序并成功将其部署到 AWS Lambda。我正在遵循本教程的第一步。
运行Lambda时,日志中出现以下错误:
Unable to import module 'wsgi_handler': No module named 'werkzeug._compat'
Run Code Online (Sandbox Code Playgroud)
我已经安装了 serverless-python-requirements 和 serverless-wsgi。这些文件夹位于上传到 AWS 的 zip 文件夹中。
我在 serverless_wsgi.py 中找到了对 werkzeug._compat 的引用:
from werkzeug._compat import BytesIO, string_types, to_bytes, wsgi_encoding_dance
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法在可能找到此函数的 Werkzeug 文件夹中的任何位置找到“_compat”。我是否缺少包裹或其他东西?
这是我的 serverless.yml:
# serverless.yml
service: serverless-flask
plugins:
- serverless-python-requirements
- serverless-wsgi
custom:
wsgi:
app: app.app
packRequirements: false
pythonRequirements:
dockerizePip: non-linux
provider:
name: aws
runtime: python3.6
stage: dev
region: us-east-1
functions:
app:
handler: wsgi_handler.handler
events:
- http: ANY /
- http: …Run Code Online (Sandbox Code Playgroud) 我有 serverless.yaml 脚本,用于在更新到较新版本的 SLS (2.72.0) 之前 - 接下来工作,我开始收到警告:
Cannot resolve serverless.yaml: Variables resolution errored with:
- Cannot resolve variable at "custom.S3_BUCKET_NAME": Value not found at "self" source
Run Code Online (Sandbox Code Playgroud)
我的自定义部分如下所示:
custom:
S3_BUCKET_NAME: ${self:service}-data-${opt:stage, self:provider.stage}
s3Sync:
- bucketName: ${self:custom.S3_BUCKET_NAME}-website
localDir: ./dist
deleteRemoved: true
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个警告?
我愚蠢地删除了无服务器项目的s3存储桶.当我现在尝试部署或删除我的应用程序时,我收到此错误:The specified bucket does not exist如何从Serverless重新创建s3存储桶?
aws-lambda ×7
python ×2
amazon-s3 ×1
csv ×1
flask ×1
lambda ×1
node.js ×1
serverless ×1
werkzeug ×1
yaml ×1