我有一个 dynamodb 表,上面附加了 Kinesis 流。请参阅此处的相关 cloudformation 配置:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-kinesisstreamspecation
最近,AWS 宣布为 AWS Lambda 过滤事件源
我的目标是过滤以特定字符串开头的所有事件。
例如 - 假设原始表有一个如下文档:
"dynamodb": {
"ApproximateCreationDateTime": 1640276115300,
"Keys": {
"pk": "foo:random",
"sk": "bar:something"
},
.....
Run Code Online (Sandbox Code Playgroud)
我想过滤所有以 开头的事件bar:。lambda 函数日志中的数据采用以下格式:
{
"Records": [
{
"kinesis": {
"kinesisSchemaVersion": "1.0",
"partitionKey": "E7DF48140C98F2557BDAF0126B8443AC",
"sequenceNumber": "49624912313474127477164618281231039365742153203189809218",
"data": "eyJhd3NSZWdpb24iOiJ1cy1lYXN0LTEiLCJldmVudElEIjoiYTJlYTlmNGEtNWU5Zi00MzAwLWE0ZjItOWFlY2Y3ZTM2ZTA0IiwiZXZlbnROYW1lIjoiTU9ESUZZIiwidXNlcklkZW50aXR5IjpudWxsLCJyZWNvcmRGb3JtYXQiOiJhcHBsaWNhdGlvbi9qc29uIiwidGFibGVOYW1lIjoicnBwLXJlY29uLXdvcmstb3JkZXIiLCJkeW5hbW9kYiI6eyJBcHByb3hpbWF0ZUNyZWF0aW9uRGF0ZVRpbWUiOjE2NDAyNzYxMTUzMDAsIktleXMiOnsicGsiOnsiUyI6IndvcmtvcmRlcjo0MzA4NDY5I1FJTTEifSwic2siOnsiUyI6Im9mZmVyaW5nIn19LCJOZXdJbWFnZSI6eyJlbnRpdHlfdHlwZSI6eyJTIjoib2ZmZXJpbmcifSwid29ya19vcmRlcl9rZXkiOnsiUyI6IjQzMDg0NjkjUUlNMSJ9LCJidXllcl9yZXBfaWQiOnsiUyI6IjAifSwic2VsbGVyX2dyb3VwX2NvZGUiOnsiUyI6IkRMUiJ9LCJzZWxsZXJfZGVhbGVyaWQiOnsiUyI6IjU0Mzc3NzcifSwidXBkYXRlZCI6eyJOIjoiMTYzNzY1OTE5NS4zMzEwMjM2OTMwODQ3MTY3OTY4NzYifSwiYnV5ZXJfbmV0Ijp7IlMiOiIwLjAwIn0sInZpbiI6eyJTIjoiMkMzQ0NBQ0cwQ0gzNDE0ODUifSwiYnV5ZXJfbnVtYmVyIjp7IlMiOiIwIn0sInNrIjp7IlMiOiJvZmZlcmluZyJ9LCJzYmx1Ijp7IlMiOiI0MzA4NDY5In0sInNlbGxlcl9uYW1lIjp7IlMiOiJFUEVBTCBBVVRPIFNBTEVTIERCQTIifSwicGsiOnsiUyI6IndvcmtvcmRlcjo0MzA4NDY5I1FJTTEifSwiYnV5ZXJfZmVlIjp7IlMiOiIwLjAwIn0sImJ1eWVyX2FkaiI6eyJTIjoiMC4wMCJ9LCJzaXRlX2lkIjp7IlMiOiJRSU0xIn0sImJ1eWVyX3VuaXZlcnNhbCI6eyJTIjoiMCJ9fSwiT2xkSW1hZ2UiOnsiZW50aXR5X3R5cGUiOnsiUyI6Im9mZmVyaW5nIn0sIndvcmtfb3JkZXJfa2V5Ijp7IlMiOiI0MzA4NDY5I1FJTTEifSwiYnV5ZXJfcmVwX2lkIjp7IlMiOiIwIn0sInNlbGxlcl9ncm91cF9jb2RlIjp7IlMiOiJETFIifSwic2VsbGVyX2RlYWxlcmlkIjp7IlMiOiI1NDM3Nzc3In0sInVwZGF0ZWQiOnsiTiI6IjE2Mzc2NTkxOTUuMzMxMDIzNjkzMDg0NzE2Nzk2ODc1In0sImJ1eWVyX25ldCI6eyJTIjoiMC4wMCJ9LCJ2aW4iOnsiUyI6IjJDM0NDQUNHMENIMzQxNDg1In0sImJ1eWVyX251bWJlciI6eyJTIjoiMCJ9LCJzayI6eyJTIjoib2ZmZXJpbmcifSwic2JsdSI6eyJTIjoiNDMwODQ2OSJ9LCJzZWxsZXJfbmFtZSI6eyJTIjoiRVBFQUwgQVVUTyBTQUxFUyBEQkEyIn0sInBrIjp7IlMiOiJ3b3Jrb3JkZXI6NDMwODQ2OSNRSU0xIn0sImJ1eWVyX2ZlZSI6eyJTIjoiMC4wMCJ9LCJidXllcl9hZGoiOnsiUyI6IjAuMDAifSwic2l0ZV9pZCI6eyJTIjoiUUlNMSJ9LCJidXllcl91bml2ZXJzYWwiOnsiUyI6IjAifX0sIlNpemVCeXRlcyI6NjM0fSwiZXZlbnRTb3VyY2UiOiJhd3M6ZHluYW1vZGIifQ==",
"approximateArrivalTimestamp": 1640276115.796
},
"eventSource": "aws:kinesis",
"eventVersion": "1.0",
"eventID": "shardId-000000000004:49624912313474127477164618281231039365742153203189809218",
"eventName": "aws:kinesis:record",
"invokeIdentityArn": "arn:aws:iam::111111111111:role/acct-managed/foo-bar-role",
"awsRegion": "us-east-1",
"eventSourceARN": "arn:aws:kinesis:us-east-1:111111111111:stream/foo-bar-stream-role/consumer/foo-bar-consumer:1638560626"
}
]
}
Run Code Online (Sandbox Code Playgroud)
一旦data解码,它看起来像:
{
"awsRegion": "us-east-1",
"eventID": "a2ea9f4a-5e9f-4300-a4f2-9aecf7e36e04",
"eventName": "MODIFY", …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-cloudformation amazon-dynamodb amazon-kinesis aws-lambda
我正在研究 AWS Lambda。目前,我需要向外部 API 发送多个请求。但是,该 API 每秒仅允许 25 个请求。就我而言,可能存在请求数量超过 100 的情况。根据并发设置,我设置了 25 但似乎不起作用。有谁知道是否有额外的设置来处理这种情况?
我正在尝试使用 chrome-aws-lambda by node.js lambda 函数从 HTML 生成 pdf。我使用本手册创建了一个图层。另外,我尝试在我的函数中使用现有层,但总是收到错误:Cannot read property 'puppeteer' of undefined。我的处理程序看起来像:
import chromium from 'chrome-aws-lambda';
export const handler: Handler = async (event: AppsyncEvent) => {
...
try {
browser = await chromium.puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath,
headless: chromium.headless
});
....
} finally {
....
}
}
Run Code Online (Sandbox Code Playgroud)
serverless.yml 中的 webpack 设置
webpack:
webpackConfig: ../webpack.config.js
includeModules:
packagePath: '../package.json'
forceInclude:
- source-map-support
forceExclude:
- aws-sdk
- chrome-aws-lambda
Run Code Online (Sandbox Code Playgroud)
webpack.config.js
module.exports = { …Run Code Online (Sandbox Code Playgroud) amazon-web-services node.js aws-lambda serverless chrome-aws-lambda
我正在尝试从 SNS codestar-notifications 为 AWS lambda 创建触发器
。
使用控制台创建触发器时,它会自动添加对 SNS 主题的订阅。
。此外,这也可以在另一个方向上工作,即如果我通过显式添加其 arn 来创建 SNS 作为 Lambda 函数的订阅,它会自动将触发器链接到 Lambda 函数。
但是当使用 terraform 创建订阅时,如下所示:
resource "aws_sns_topic_subscription" "subscribe_lambda_to_first_topic" {
topic_arn = module.first_topic.sns-topic-detail.arn
protocol = "lambda"
endpoint = module.lambda_function.lambda_function.arn
}
Run Code Online (Sandbox Code Playgroud)
它不会在 AWS Lambda 中创建触发器。
我尝试使用 Terraform 中的事件源映射创建触发器,如下所示
resource "aws_lambda_event_source_mapping" "lambda_source" {
event_source_arn = module.first_topic.sns-topic-detail.arn
function_name = module.lambda_function.lambda_function.arn
starting_position = "LATEST"
}
Run Code Online (Sandbox Code Playgroud)
它向我抛出一个错误,说它只能用于
错误:创建 Lambda 事件源映射时出错(arn:aws:sns:us-west-2:619867110810:codestar-notifications-emc-sns-to-lambda):InvalidParameterValueException:无法识别的事件源,必须是 kinesis、dynamodb 流或 sqs 。不支持的源 arn : arn:aws:sns:us-west-2:619867110810:codestar-notifications-emc-sns-to-lambda { RespMetadata: { StatusCode: 400, RequestID: "83bf57cb-b50d-49a8-9547-72fac69778d1" },Message_:“无法识别的事件源,必须是 kinesis、dynamodb 流或 sqs。不支持的源 …
amazon-web-services amazon-sns aws-lambda terraform terraform-provider-aws
我们使用第三方应用程序发送事件驱动的 Webhook 请求来触发我们的 ERP 系统。我们已经设置了一个 ERP 端点来接收请求,但由于 ERP 系统的复杂性,我们必须以预定义的格式接收请求正文。因此,我们需要以某种方式转换 webhook 主体并将其以所需的格式发送到我们的 ERP API。我正在考虑使用 AWS lambda。
谁能给我一些指导,如何触发接收 Webhook 的 AWS lambda 函数,然后将其内容转换为所需的格式,最后将正确的结构发布到我们的 ERP API?
使用无服务器框架,如何使我的 Lambda 函数依赖于该resources部分中的 SQS 队列,因为它是函数本身的触发器?
在我的 中serverless.yaml,我定义了一个新的队列和 Lambda 函数。
然后,我想使用该队列作为 Lambda 函数的事件源(触发器)。
我通过手动创建队列 ARN 来做到这一点:
functions:
consumer:
handler: App\Service\Consumer
events:
- sqs:
arn:
Fn::Join:
- ':'
- arn:aws:sqs
- Ref: AWS::Region
- Ref: AWS::AccountId
- ${opt:stage}-skill-assigner
Run Code Online (Sandbox Code Playgroud)
并在资源中创建队列:
resources:
Resources:
SkillAssignerQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: ${opt:stage}-skill-assigner
Run Code Online (Sandbox Code Playgroud)
如果我在将队列用作函数触发器之前在部署中创建队列,则效果很好。
但是,如果我尝试部署它们,当它尝试创建事件源映射时,它会失败并出现此错误:
提供的请求无效:接收消息时发生错误。SQS 错误代码:AWS.SimpleQueueService.NonExistentQueue。SQS 错误消息:此 wsdl 版本的指定队列不存在。
amazon-sqs amazon-web-services aws-lambda serverless-framework
我正在按照Medium.com 上的教程使用 AWS 创建 URL 缩短器。
我已经设置了整个过程,但在进行第一次测试时,我在尝试从 Lambda 获取 DynamoDB 项目时遇到权限错误。
如教程中所述,Lambda 在某个角色下运行。该角色附加了下一个策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:UpdateItem"
],
"Resource": "arn:aws:dynamodb:eu-west-3:922842442607:table/lambda-dynamodb-url-shortener"
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,正如我之前所说,我收到此错误:
[ERROR] ClientError: An error occurred (AccessDeniedException) when calling the GetItem operation: User: arn:aws:sts::***:assumed-role/lambda-dynamodb-url-shortener-role/url-shortener-create is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:eu-west-3:***:table/url-shortener-table
Run Code Online (Sandbox Code Playgroud)
当我检查 IAM 策略模拟器时,我可以看到该角色具有上述策略:
但是,正如预期的错误一样,我在尝试使用以下角色模拟对 DynamoDB 的访问时收到此错误:
有什么线索吗?:(
amazon-web-services url-shortener iaas amazon-dynamodb aws-lambda
我在云端上传了excel文件。当前端传递 URL 时使用 Node js 我需要从 Excel 文件读取数据。下面是我的代码,
var workbook = new ExcelJS.Workbook();
workbook.xlsx.load('https://file-examples.com/wp-content/uploads/2017/02/file_example_XLSX_10.xlsx')
.then(function() {
var worksheet = workbook.getWorksheet(sheet);
worksheet.eachRow({ includeEmpty: true }, function(row, rowNumber) {
console.log("Row " + rowNumber + " = " + JSON.stringify(row.values));
});
});
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误
找不到中央目录的末尾:这是一个 zip 文件吗?如果是,请参阅https://stuk.github.io/jszip/documentation/howto/read_zip.html
有人可以帮我解决这个问题吗?
我创建了一个 vpc,并创建了两个子网,一个是公共子网(附加到互联网网关),另一个是私有子网。我可以从公共子网访问私有子网。我的问题是流量如何从私有子网发送到公共子网?私有子网与主路由表相关联。而且它只有到本地的路由。
我有一个包含超过 2000 万个对象 (2.3TB) 的 S3 存储桶。
这些对象需要用用户定义的名称填充其内容处置元数据,同时保留其现有的内容类型元数据。
文件名存储在单独的 RDS 数据库中。
看起来我可以对少量文件使用复制命令,但对于这么大的存储桶,这听起来并不是一个明智的选择。
任何帮助将不胜感激!
aws-lambda ×10
amazon-s3 ×2
node.js ×2
amazon-ec2 ×1
amazon-sns ×1
amazon-sqs ×1
api ×1
aws-cli ×1
exceljs ×1
iaas ×1
javascript ×1
serverless ×1
terraform ×1
webhooks ×1