标签: aws-lambda

在本地计算机上的 VSCode 中使用 NodeJS 运行带有层的 AWS Lambda

我的项目结构如下:

MyProject
  layers
    myLayer1
      nodejs
        node_modules
          myLayer1
            myExtension.js
  lambda1
    handler.js
  lambda2
    handler.js
  jsconfig.json
Run Code Online (Sandbox Code Playgroud)

myExtension.js

module.exports.myTest = () => {
  return 'My extension test';
};
Run Code Online (Sandbox Code Playgroud)

处理程序.js

const myext = require('myLayer1');
module.exports.handler = async (event) => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: myext.myTest()
    })
}};
Run Code Online (Sandbox Code Playgroud)

当我部署到 AWS 时,一切正常。但我无法在本地计算机上运行/调试它。

根据我的发现,在这种情况下 jsconfig.json 文件应该有助于映射路径,但是 VSCode/NodeJS 会忽略我在那里编写的任何内容(我尝试将其放置在 MyProject 根文件夹和 lambda 文件夹中)。

如果我将 handler.js 中的“require”更改为:

const myext = require('./layers/myLayer1/nodejs/node_modules/myLayer1');
Run Code Online (Sandbox Code Playgroud)

当我将代码部署到 AWS 时,这显然会破坏代码。

node.js aws-lambda visual-studio-code

8
推荐指数
1
解决办法
1567
查看次数

使用 AWS RDS 代理时准备语句的替代方案

RDS proxy 的文档中指出,当应用程序使用准备好的语句时,连接会自动固定:

准备好的语句会导致代理固定会话。无论准备好的语句使用 SQL 文本还是二进制协议,此规则都适用。( https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy.html )

使用 RDS 代理时,我应该如何保护我的应用程序免受 SQL 注入?我使用此服务是为了在我的微服务中更快地与数据库连接,因此我希望重用该连接。

amazon-web-services amazon-rds aws-lambda amazon-rds-proxy

8
推荐指数
1
解决办法
3553
查看次数

有没有办法在触发 lambda 之前过滤 AWS DynamoDb Stream?

因此,我们有几个 lambda 来监听数据库上的更改,在每个 lambda 中,我们必须在一开始就进行过滤,因为这个特定的 lambda 不关心所有更改,只关心特定的更改。

更明确地说,我们正在应用事件源,并且 lambda 应该是事件处理程序。我希望仅当事件 A 插入数据库时​​而不是每当插入事件时才触发 lambda A!lambda B 和事件 B 等也是如此。

目前,我们在每个 lambda 的开头都有一个过滤器:

lambdaA handler:
const eventsToBeProcessed = events.filter(
   (event) => event.eventName === 'EventA'
);
Run Code Online (Sandbox Code Playgroud)

现在我们已经有了一大堆 lambda,当我只需要触发一个时,触发所有这些 lambda 是没有意义的!

我对 AWS 不太有经验,但我假设解决方案是:

  • 能够过滤 DynamoDb 触发器
  • 不是让 dynamodb 触发 lambda,而是在每次更改时触发 AWS 服务,并且它会根据更新内容知道要触发哪个 lambda

编辑:

我对我标记为答案的解决方案不太满意,主要原因是设计中的单点故障,而且它需要依靠 SNS 来进行发布/订阅,而 SNS 的可用性不高,而且它如果您尝试拥有一个高度可用的系统(4 个 9 左右),可能会让您失败

我最终采用的解决方案(至少目前如此)是,当我将事件推送到事件存储中时,如果我想触发副作用,我只需将其推送到 AWS 的 EventBridge(带有规则的事件总线)即可。EventBridge 最好的部分是,您可以设置所需的规则、所需的总线,然后在总线有事件 A 时调用(例如)Lambda A 等等。

amazon-web-services event-sourcing amazon-dynamodb aws-lambda

8
推荐指数
1
解决办法
7478
查看次数

modin 在 AWS Lambda 上有用吗

AWS Lambda 配备 6 个 vCPU。Modin for Pandas 承诺使用核心来提高处理效率。

这是否真的可以在 AWS Lambda 上实现,否则它不支持多线程、多处理等?

# import pandas as pd
import modin.pandas as pd
Run Code Online (Sandbox Code Playgroud)

pandas aws-lambda modin

8
推荐指数
1
解决办法
340
查看次数

Async、Lambda、Boto3、ThreadPoolExecutor:连接池已满,正在丢弃连接

一些背景:

我正在开发一个测试套件,用于使用 CodePipeline 和两个 lambda 函数更新和测试全局重定向:一个包装器函数和一个测试器函数。

包装器循环遍历域列表。对于每个域,它获取关联的 S3 文件,然后创建一长串对象(文件中每行一个对象)。示例对象:

redirect = {
     'staging': None,
     'prod': None,
     'country': 'US',
     'language': 'EN',
     'status_code': None,
     'shortlink': None,
     'expected': None
}
Run Code Online (Sandbox Code Playgroud)

然后,包装器获取此对象列表并调用第二个 lambda(测试器 lambda),该 lambda 为每个对象发送一系列 httpx 请求等。

其中最重要的一点是它是异步的 - 否则,lambda 将在 15 分钟时超时。

实际问题:

包装函数只能触发测试器 10 次。否则,当返回结果时,我会收到以下错误:

Connection pool is full, discarding connection: lambda.us-east-1.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

我提高了 ThreadPoolExecutor 的 max_workers,甚至为 boto3 设置了 max_workers。我与 AWS 支持人员进行了交谈,我的实际 lambda 设置有利于我的测试器 lambda 根据需要多次触发。然而,我仍然收到连接池错误。

相关代码:

from botocore.client import Config
from boto3.session import Session
from concurrent.futures import ThreadPoolExecutor, as_completed
import boto3 …
Run Code Online (Sandbox Code Playgroud)

python asynchronous threadpoolexecutor boto3 aws-lambda

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

WebDriverException:“进程意外关闭,状态为 255” - selenium/geckodriver/AWS lambda - Python

我目前正在 aws lambda (无服务器) 上开发一个网络抓取项目

技术人员:

蟒蛇3

硒3.14

geckodriver-V0.29

Firefox 80.0(en 模式无头)

这是我实现的代码(知道我事先配置了 firefox 和 geckodriver 的路径):

from selenium import webdriver
from selenium.webdriver.firefox.options import Options as FirefoxOptions
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

options = FirefoxOptions()
options.add_argument("--headless")
binary = FirefoxBinary("/tmp/bin/firefox/firefox")

webdriver.Firefox(options=options,executable_path="/tmp/bin/geckodriver", firefox_binary=binary)
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

Message: Process unexpectedly closed with status 255
: WebDriverException
Traceback (most recent call last):
  File "/var/task/src/lambda_function.py", line 8, in lambda_handler
    driver = WebDriverWrapper()
  File "/var/task/src/webdriver_wrapper.py", line 116, in __init__
    self._driver = webdriver.Firefox(options=options,executable_path="/tmp/bin/geckodriver", firefox_binary=binary)
  File "/var/task/lib/selenium/webdriver/firefox/webdriver.py", line 174, in …
Run Code Online (Sandbox Code Playgroud)

python firefox selenium aws-lambda geckodriver

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

使用 AWS Lambda 时没有名为“numpy.core._multiarray_umath”的模块

我刚刚将包含所有需要的包的 .zip 文件上传到 AWS Lambda。我在 Mac 上使用 python 3.8 的虚拟环境运行得很好。AWS Lambda 函数也有 python 3.8。但是当我在 AWS Lambda 中运行时,出现以下错误:

No module named 'numpy.core._multiarray_umath'
Run Code Online (Sandbox Code Playgroud)

我已将实际的 numpy 版本(1.20.2)更改为其他版本,例如 1.19.1 和 1.18.5,但问题无法解决。

我还使用 spacy 3.0.6 和 fastapi 0.63.0。

python numpy amazon-web-services aws-lambda

8
推荐指数
1
解决办法
3072
查看次数

如何从 Amplify-React 调用现有的 Lambda 函数?

我们已经编写了 AWS Lambda 函数。例如,传递联系人 ID 并返回联系人的电话号码列表(以 json 格式)。

我们正在构建一个 Amplify-React 应用程序。我们想要调用现有的 Lambda 函数。Amplify React 应用程序和 Lambda 函数位于同一 AWS 账户和同一区域。

  1. 我们可以直接在 Amplify-React 应用程序中调用 Lambda 函数吗?或者,我们必须先公开API网关中的Lambda函数?
  2. 如果我们可以直接在 Amplify-React 中调用 Lambda 函数,您可以分享示例 javascript 来执行此操作吗?
  3. 是否存在如何在 Amplify-React 应用程序中调用现有 Lambda 函数的最佳实践?

reactjs aws-lambda aws-api-gateway aws-amplify

8
推荐指数
0
解决办法
1026
查看次数

有没有办法获得单个 lambda 函数的成本?

我正在我的 AWS 账户中创建 lambda 函数的报告,并查看是否可以获得之前调用的成本以及 lambda 函数被调用的次数。我查看了 lambda、pricing、cloudwatch 和 costexplorer 的文档,但没有找到任何内容。我现在想知道是否必须进行多次 API 调用。感谢所有帮助!

amazon-ec2 amazon-web-services boto3 aws-lambda

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

如何为 Stripe 集成编写 Lambda 函数?

背景:我正在使用 Gatsby -> Netlify 将我们的销售页面迁移到无服务器 CDN,并尝试实现 Stripe 自定义支付流程,因为我们想要自定义结账表单。我在这里的一个登陆页面上实现了 Stripe Checkout,但这不是我们想要的。登陆页面

Stripe 的文档非常简单,但该文档假设正在运行一台服务器。

以下代码是其文档中的服务器实现片段。

const express = require("express");
const app = express();
// This is your real test secret API key.
const stripe = require("stripe")("sk_test_51J085aDDSnMNt7v1ZO3n5fxobP6hhEhf1uC2SDmkHGIX8fCnxFiSMrxITKu06ypYUHYAMHVZ1lhc5Fqm7UoVa6dx00XvV5PZzG");

app.use(express.static("."));
app.use(express.json());

const calculateOrderAmount = items => {
  // Replace this constant with a calculation of the order's amount
  // Calculate the order total on the server to prevent
  // people from directly manipulating the amount on the client
  return 1400;
};

app.post("/create-payment-intent", …
Run Code Online (Sandbox Code Playgroud)

stripe-payments reactjs aws-lambda gatsby netlify

8
推荐指数
1
解决办法
4511
查看次数