希望有人可以帮助启发我解决这个问题。我目前正在研究一个 lambda 函数,它利用云监视调度程序来检查各种设备,并且它正在使用 elasticache 来维护一个简单的读数数据库。
我的问题是在我晚上关闭测试之后。我在早上启动了 lambda 函数,但该函数无法访问互联网。这由函数超时表示。经常在弄乱我的路线和我的 vpc 设置几个小时后,它会再次开始工作。只是为了第二天休息。有时它与 nat 网关一起使用,而其他时候只使用一个 nat 实例。我通常对 vpc 设置所做的更改很小。我使用的设置模式是一个公共、一个私有和一个 natgateway。
更新:昨天一整天都无法从我的 VPC 访问互联网后,今天运行正常。我做了什么不同的事情,没有。当它再次停止运行时,可能是今天晚些时候,我会打电话给 AWS,看看我们是否能找到问题的根源。
vpc amazon-web-services node.js amazon-elasticache aws-lambda
我遇到了一个问题,即 Lambda 函数偶尔会超时,除了函数超时的通知之外,没有任何错误消息。
为了找到问题的根源,我在整个函数的各个点添加了日志记录,并确定一切正常,直到第一个 getItem() 请求从 DynamoDB 读取数据。读取似乎需要超过 3.00 秒的超时时间。
当然,我检查了我的 DynamoDB 表,看看是否有任何限制读取或错误。DynamoDB 的指标没有显示任何限制或错误,读取时间最多保持在两位数毫秒。
很明显,有什么地方出了问题,或者一路上掉了下来。我该如何解决这个问题,或者至少抓住它并重试读取?
这是一个面向 Web API 的读取功能,因此响应时间至关重要。因此,增加超时不会解决问题。
dynamodb.getItem({
"TableName": "tablename",
"Key": { "keyname": { "S": "keyvalue" } },
"AttributesToGet": [ "attributeA", "attributeB" ]
}, function(err, data) {
if(err){
context.done(err);
} else {
if("Item" in data){
nextFunction(event, context);
} else {
context.done("Invalid key");
}
}
});
Run Code Online (Sandbox Code Playgroud)
每当我尝试通过浏览器通过 POST 访问无服务器 lambda 函数时,我都会收到错误消息
对预检请求的响应未通过访问控制检查:请求的资源上不存在 >'Access-Control-Allow-Origin' 标头。
当它是一个/GET它工作正常我读过它是因为它没有发送飞行前请求。当我把它改成POST这个的时候就是失败了。
我正在运行的命令:
sam local start-api
我的 template.yaml 是:
...
Resources:
PropertiesFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: target/service-0.0.1-SNAPSHOT.jar
Handler: com.aws.PropertiesHandler::handleRequest
Runtime: java8
Events:
PropertiesApi:
Type: Api
Properties:
Path: /properties
Method: post
...
Run Code Online (Sandbox Code Playgroud)
如何在这些端点上启用 CORS?
amazon-web-services aws-lambda aws-api-gateway aws-sam-cli serverless
故事
我正在开发 AWS Lambda 函数并使用webpack.
我已经阅读了一些文章,似乎process.env在编译期间变量会被自动替换。虽然很酷,但我想禁止这种行为。
为什么?
因为我使用 AWS Lambda 仪表板传递环境变量。
网络包配置
const nodeExternals = require('webpack-node-externals')
const webpack = require('webpack')
const path = require('path')
module.exports = {
target: 'node',
entry: path.resolve(__dirname, 'index.ts'),
externals: [nodeExternals()],
devtool: 'inline-source-map',
mode: 'production',
module: {
rules: [{
test: /\.tsx?$/,
use: [{
loader: 'ts-loader',
options: {
experimentalWatchApi: true,
},
}],
}]
},
plugins: [],
resolve: {
extensions: ['.tsx', '.ts', '.js']
},
output: {
filename: 'index.js',
libraryTarget: 'commonjs',
path: path.resolve(__dirname, 'dist')
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 S3 中托管一个静态站点,能够使用 Lambda/Api 网关处理一些动态内容。似乎无法做到这一点。我希望 URL 看起来像这样:
example.com/index.html
example.com/images/*
example.com/css/*
example.com/api/* -> API Gateway
Run Code Online (Sandbox Code Playgroud)
另外,在重定向时,我想将 example.com 保留为根域。我在 S3 中尝试了 RoutingRules,但从客户端重定向。我需要这对用户透明,例如代理请求。
我用 .net CORE 创建了一个空的 AWS Lambda 项目:
基本上它产生的是一个 .net 核心空 lambda 函数项目:
但就像现在一样 - 它不支持注入(DI),因为没有startup文件等......所以基本上它是 ia .net 核心项目,没有它的所有好处。
然而,托尼写道:
Add .NET Core DI and Config Goodness to AWS Lambda Functions“:
基本上他所做的就是手动让项目支持DI。
所以我创建了一个ConfigurationService类:
配置服务.cs
public interface IConfigurationService
{
IConfiguration GetConfiguration();
}
public class ConfigurationService : IConfigurationService
{
public IConfiguration GetConfiguration()
{
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
}
}
Run Code Online (Sandbox Code Playgroud)
然后以常规方式在代码中使用它。
所以这里是与上面相同的函数从 appSettigs 返回一个键,PLUS (!!!) 依赖注入:
函数.cs
public class Function …Run Code Online (Sandbox Code Playgroud) 我已经使用 API Gateway 创建了一个 Web Socket Api,并且能够将客户端连接到它。
此外,我可以通过指定它ConnectionId并使用以下代码将消息发送到连接的客户端:
const AWS = require('aws-sdk');
let apiGatewayManagementApi = new AWS.ApiGatewayManagementApi({
apiVersion: '2018-11-29',
endpoint: 'https://XXXXXXXXX.execute-api.sa-east-1.amazonaws.com/dev/',
region: 'sa-east-1'
});
const params = {
ConnectionId: 'YYYYYYYYYYYYY',
Data: 'test'
};
apiGatewayManagementApi.postToConnection(params, function (err, data) {
if (err) {
console.log(err, err.stack); // an error occurred
} else {
console.log(data); // successful response
}
});
Run Code Online (Sandbox Code Playgroud)
问题是我不需要区分客户端,所以我不想跟踪每个客户端的 ConnectionId,但是如果我在发送消息时删除它,我会收到以下错误: Missing required key 'ConnectionId' in params
有没有办法向所有连接的客户端发送消息(不指定任何 ConnectionId)?
我有一个 bitbucket 管道 yml,我有运行测试脚本的步骤和运行无服务器部署脚本的步骤。我是否需要在每一步进行 npm install 或者第一个 npm install 是否会继续执行并足以满足后续的每个步骤。除此之外,引擎盖下发生了什么?我知道 Docker 容器已创建;每一步都只是更新容器吗?
- step:
name: Test and Build
script:
- npm install --no-package-lock
- npm run test
- step:
name: Deploy Serverless
script:
- npm i serverless -g
- npm install --no-package-lock
- npm run deploy
Run Code Online (Sandbox Code Playgroud) 我正在使用 AWS SAM 并针对 Node 10.x 运行。
希望传递实验模块和顶级等待的标志。
谢谢!
我正在使用 python 3.7 在 AWS Lambda 中设置一个函数,它不会让我返回字节类型
请注意,这不是 API Gateway 的问题,我是直接调用 lambda 的。
错误是:Runtime.MarshalError, ... is not JSON serializable
output = BytesIO()
#Code that puts an excel file into output...
return {
'Content-Disposition': 'attachment; filename="export.xlsx"',
'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'body' : output.getvalue()
}
Run Code Online (Sandbox Code Playgroud)
如果我做 :
'body' : str(output.getvalue())
Run Code Online (Sandbox Code Playgroud)
它输出损坏的文件,因为它添加b''到字符串
如果我做 :
'body' : base64.b64encode(output.getvalue()).decode()
Run Code Online (Sandbox Code Playgroud)
它还输出损坏的文件,可能是因为它更改了文件的二进制表示。
也许我需要上传到 S3?但它不适合我的流程,这是一次性文件创建,它会一直停留在“S3 Limbo”中,直到 TTL
amazon-web-services python-3.x aws-lambda serverless-framework
aws-lambda ×10
node.js ×4
aws-sdk ×2
.net-core ×1
amazon-s3 ×1
aws-sam-cli ×1
c# ×1
docker ×1
javascript ×1
npm ×1
python-3.x ×1
redirect ×1
serverless ×1
serverless-application-model ×1
typescript ×1
vpc ×1
webpack ×1
webpack-4 ×1
websocket ×1