我正在尝试使用 Jest 在本地 Node.JS AWS Lambda 函数中模拟对 putObject 的调用,但由于某种原因,我一直在期望中收到 0 次调用。
这是我的主要功能(index.js):
const S3 = require("aws-sdk/clients/s3");
const s3 = new S3();
exports.handler = async (event) => {
putFunction = async (params, callback) => {
await s3.putObject(params, callback).promise();
};
const params = {
Bucket: "some value",
Key: "some key value",
ContentType: "application/json",
Body: "some body value",
};
const callback = {
function(err, data) {
console.log(JSON.stringify(err) + " " + JSON.stringify(data));
},
};
putFunction(params, callback);
}
Run Code Online (Sandbox Code Playgroud)
我尝试将 async 添加到我的测试函数中,因为我认为这是一个异步问题,但我似乎仍然收到相同的错误。这是我的测试代码(index.test.js):
let myHandler = …Run Code Online (Sandbox Code Playgroud) 我将 WebSocket ApiGateway 与 AWS Lambda 集成一起使用。当我尝试使用Lambda 函数的post_to_connection方法将数据发布到客户端时,boto3.client('apigatewaymanagementapi')总是超时而没有任何错误消息。只有超时消息会记录在 CloudWatch 中:
3.00 秒后任务超时
我的代码:
import json
import boto3
import time
import urllib
api_client = boto3.client('apigatewaymanagementapi')
def lambda_handler(event, context):
connectionId = event['requestContext']['connectionId']
api_client.post_to_connection(ConnectionId=connectionId, Data=json.dumps({'test': '1'}))
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我有一个场景,当我将在特定时间执行一组任务。例如
task1: 28-06-2020 1:00 AM
task2: 30-06-2020 2:00 AM
task3: 01-07-2020 12:00 PM
.
.
.
n
Run Code Online (Sandbox Code Playgroud)
我想在这些指定的时间触发我的 lambda(定义我的逻辑)。可能我会将我的执行时间存储在数据库中,有人可以告诉我一种在指定时间执行 lambda 的方法。我知道我们在 dynamo 中有 TTL 机制,它可以触发 lambda,但它会将执行延迟 48 小时。我希望我的 lambda 在精确的时间执行
我有一个用于通过 CDK 部署的 api 的 OpenAPI 规范。规范看起来像:
openapi: 3.0.1
info:
title: My API
description: My REST API with CORS enabled
version: 0.1.0
x-amazon-apigateway-cors:
allowOrigins:
- "*"
allowCredentials: true
exposeHeaders:
- "x-apigateway-header"
- "x-amz-date"
- "content-type"
maxAge: 3600
allowMethods:
- "*"
allowHeaders":
- "x-apigateway-header"
- "x-amz-date"
- "content-type"
- "Authorization"
components:
securitySchemes:
lambda:
type: "apiKey"
name: "Authorization"
in: "header"
x-amazon-apigateway-authtype: "custom"
x-amazon-apigateway-authorizer:
authorizerUri: "{{my-lambda-authorizer}}"
authorizerResultTtlInSeconds: 300
type: "token"
paths:
/user/{id}:
get:
summary: Get info of specified user.
parameters:
- in: path …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-cloudformation aws-lambda aws-api-gateway aws-cdk
在部署这个基于 Go 的 AWS Lambda 项目时,通过 AWS 控制台,我收到:
{
"errorMessage": "fork/exec /var/task/main: exec format error",
"errorType": "PathError"
}
Run Code Online (Sandbox Code Playgroud)
以下是我采取的步骤:
marriage-master从 Git下载项目go get "github.com/aws/aws-lambda-go/lambda" 所以脚本可以由 Go 构建go build main.go创建 Lambda 将用于执行的文件zip main.zip main将文件存档为.zip 以部署到 Lambdamain.zip到Function codeHandler为main.但我不断收到此路径错误。知道我做错了什么吗?
我正在处理一项涉及在 VPC 内运行的Lambda 函数 的任务。
此函数应该将消息推送到SQS,并且 lambda 执行角色具有策略:添加了AWSLambdaSQSQueueExecutionRole和AWSLambdaVPCAccessExecutionRole。
拉姆达函数:
# Create SQS client
sqs = boto3.client('sqs')
queue_url = 'https://sqs.ap-east-1a.amazonaws.com/073x08xx43xx37/xyz-queue'
# Send message to SQS queue
response = sqs.send_message(
QueueUrl=queue_url,
DelaySeconds=10,
MessageAttributes={
'Title': {
'DataType': 'String',
'StringValue': 'Tes1'
},
'Author': {
'DataType': 'String',
'StringValue': 'Test2'
},
'WeeksOn': {
'DataType': 'Number',
'StringValue': '1'
}
},
MessageBody=(
'Testing'
)
)
print(response['MessageId'])
Run Code Online (Sandbox Code Playgroud)
测试执行结果如下:
{
"errorMessage": "2020-07-24T12:12:15.924Z f8e794fc-59ba-43bd-8fee-57f417fa50c9 Task timed out after 3.00 seconds"
}
Run Code Online (Sandbox Code Playgroud)
我将超时从基本设置增加到 5 …
我正在尝试创建一个新的 lambda 层以使用 psycopg2 导入 zip 文件,因为该库使我的部署包超过 3MB,而且我再也看不到 lambda 函数中的内联代码。
我使用 Python 3.7 为以下两种情况创建了 lambda 层:
我将他们新创建的层添加到我的 lambda 函数中。但是,在这两种情况下,我的 lambda_function 都会抛出如下错误:{ "errorMessage": "Unable to import module 'lambda_function': No module named 'psycopg2'", "errorType": "Runtime.ImportModuleError" }
该错误似乎是我的 zip 文件出了问题,无法识别。但是当它在我的部署包中运行良好时。
任何帮助或理由都会非常有用。谢谢!
我想根据上一步的结果动态选择 AWS Lambda 工作人员。类似的东西{"Resource": "$.worker_arn"}。
"RunWorkers": {
"Type": "Map",
"MaxConcurrency": 0,
"InputPath": "$.output",
"ResultPath": "$.raw_result",
"Iterator": {
"StartAt": "CallWorkerLambda",
"States": {
"CallWorkerLambda": {
"Type": "Task",
"Resource": "$$.worker_arn",
"End": true
}
}
},
"Next": "Aggregate"
},
Run Code Online (Sandbox Code Playgroud)
上一步的输入预期如下:
[{"worker_arn":..., "output":1}, {"worker_arn":..., "output":1}, ...],其中worker_arn所有工人都相同。
当我编写这样的管道时,linter 抱怨它需要一个 ARN。
有没有比将我的工人 lambda 包装到另一个 lambda 更好的选择?
我在 AWS 中创建了一个 VPC。这是一个私有网络,互联网上的任何人都无法访问此 VPC。然后我将我的 lambda 放在这个 VPC 中。之后,我发现我可以从 外面的另一个 lambda 调用我的 lambda VPC。我还可以从我的本地笔记本电脑调用 lambda。
这是故意的吗?
aws-lambda ×10
amazon-s3 ×2
amazon-vpc ×2
boto3 ×2
amazon-sqs ×1
aws-cdk ×1
go ×1
jestjs ×1
mocking ×1
node.js ×1
psycopg2 ×1
python-3.7 ×1
scheduler ×1
websocket ×1