标签: aws-lambda

如何格式化通过 Kinesis Streams for DynamoDB 触发的 Lambda 函数的过滤条件?

我有一个 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

2
推荐指数
1
解决办法
2085
查看次数

无法限制并发数

我正在研究 AWS Lambda。目前,我需要向外部 API 发送多个请求。但是,该 API 每秒仅允许 25 个请求。就我而言,可能存在请求数量超过 100 的情况。根据并发设置,我设置了 25 但似乎不起作用。有谁知道是否有额外的设置来处理这种情况?

在此输入图像描述

amazon-web-services aws-lambda

2
推荐指数
1
解决办法
66
查看次数

如何将 chrome-aws-lambda 模块与 AWS lambda 函数一起使用?

我正在尝试使用 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

2
推荐指数
1
解决办法
5309
查看次数

无法从 SNS 触发 AWS Lambda

我正在尝试从 SNS codestar-notifications 为 AWS lambda 创建触发器以 SNS 作为触发器的 Lambda。

使用控制台创建触发器时,它会自动添加对 SNS 主题的订阅。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

2
推荐指数
1
解决办法
1850
查看次数

通过第 3 方 Webhook 触发 AWS lambda 函数,转换事件请求正文并将转换后的正文发布到我的 API

我们使用第三方应用程序发送事件驱动的 Webhook 请求来触发我们的 ERP 系统。我们已经设置了一个 ERP 端点来接收请求,但由于 ERP 系统的复杂性,我们必须以预定义的格式接收请求正文。因此,我们需要以某种方式转换 webhook 主体并将其以所需的格式发送到我们的 ERP API。我正在考虑使用 AWS lambda。

谁能给我一些指导,如何触发接收 Webhook 的 AWS lambda 函数,然后将其内容转换为所需的格式,最后将正确的结构发布到我们的 ERP API?

api webhooks aws-lambda

2
推荐指数
1
解决办法
2283
查看次数

无服务器框架不会在使用队列触发器的 Lambda 之前创建 SQS 队列

使用无服务器框架,如何使我的 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

2
推荐指数
1
解决办法
1442
查看次数

AWS IAM - 从 Lambda 到 DynamoDB 的访问被拒绝

我正在按照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

2
推荐指数
1
解决办法
3387
查看次数

使用ExcelJS,如何使用URL从Excel文件中读取数据?

我在云端上传了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

有人可以帮我解决这个问题吗?

javascript amazon-web-services node.js aws-lambda exceljs

2
推荐指数
1
解决办法
1万
查看次数

AWS 公有子网和私有子网流量

我创建了一个 vpc,并创建了两个子网,一个是公共子网(附加到互联网网关),另一个是私有子网。我可以从公共子网访问私有子网。我的问题是流量如何从私有子网发送到公共子网?私有子网与主路由表相关联。而且它只有到本地的路由。

如果可能的话,您能否与我见面,了解路线表中的流量(入站和出站)? 在此输入图像描述

amazon-s3 amazon-ec2 amazon-web-services aws-lambda

2
推荐指数
1
解决办法
2030
查看次数

向数百万个 S3 对象添加元数据

我有一个包含超过 2000 万个对象 (2.3TB) 的 S3 存储桶。

这些对象需要用用户定义的名称填充其内容处置元数据,同时保留其现有的内容类型元数据。

文件名存储在单独的 RDS 数据库中。

看起来我可以对少量文件使用复制命令,但对于这么大的存储桶,这听起来并不是一个明智的选择。

任何帮助将不胜感激!

amazon-s3 amazon-web-services aws-cli aws-lambda

2
推荐指数
1
解决办法
420
查看次数