如果我创建一个函数来获取网页。它会在每次执行时在不同的 IP 上执行它,以便我的抓取请求不会被阻止吗?
我正在寻求有关设计此最佳方式的建议-
用例
我想将多个文件放入 S3。成功保存所有文件后,我想触发一个 lambda 函数来做一些其他工作。
天真的方法
我解决这个问题的方法是在 Dynamo 中保存一条记录,其中包含一个唯一标识符和我将上传的记录总数以及应该存在于 S3 中的密钥。
一个基本的实现是采用我现有的 lambda 函数,该函数在我的 S3 存储桶写入时调用,并让它手动检查是否所有其他文件都已保存。
Lambda 函数会知道(查看 Dynamo 以确定我们要查找的内容)并查询 S3 以查看其他文件是否在其中。如果是,请使用 SNS 触发我的另一个 lambda 来执行其他工作。
编辑:另一种方法是让我将文件放在 S3 中的客户端程序负责直接调用另一个 lambda 函数,因为从技术上讲,它知道所有文件何时上传。这种方法的问题是我不希望这是客户端程序的责任......我希望客户端程序不在乎。一旦它上传了文件,它应该能够退出。
想法
我不认为这是一个好主意。主要是因为 Lambda 函数应该是轻量级的,并且从 Lambda 函数内轮询数据库以获取所有上传文件的 S3 密钥,然后检查 S3 是否存在 - 每次都这样做似乎是贫民窟并且非常重复。
什么是更好的方法?我正在考虑使用 SWF 之类的东西,但不确定这对我的解决方案来说是否太过分了,或者它是否能让我做我想做的事。该文档也没有显示真正的“示例”。这只是一个讨论,没有太多的分步指南(也许我找错了地方)。
编辑回应以下 mbaird 的建议-
选项 1 (SNS)这就是我会去的。这很简单,并没有真正违反单一职责原则。也就是说,客户端上传文件并发送通知(通过 SNS)表明其工作已完成。
选项 2(Dynamo 流)因此,这本质上是选项 1 的另一个“实现”。客户端进行服务调用,在这种情况下,这会导致表更新与 SNS 通知(选项 1)。此更新将触发 Lambda 函数,而不是通知。不错的解决方案,但我更喜欢使用 SNS 进行通信,而不是依赖数据库的功能(在本例中为 Dynamo 流)来调用 Lambda 函数。
在任何情况下,我都在使用 AWS 技术并与他们的产品(Lambda 函数、SNS 等)耦合,但我觉得依赖于 Dynamo 流之类的东西使其耦合更加紧密。对我的用例来说并不是一个很大的问题,但仍然感觉很脏;D …
我正在制作 AWS Lambda 函数。现在我想要isinstance(context,LambdaContext),我期待它在 AWS Lambda 中工作。但我在本地运行单元测试。
那么如何导入 LambdaContext。
最好的事物
我有一个代理到 AWS Lambda 函数的 API 网关资源。这对于传递尾随路径参数 ( /periodicals/{tail+})效果很好,但由于我希望这些参数是可选的,因此我还向ANY更高层的资源 ( /periodicals)添加了一个方法:
从 AWS 控制台中测试该方法时,这很有效。但是,直接从我的浏览器对该资源执行请求会导致以下响应:
{"message":"Missing Authentication Token"}
Run Code Online (Sandbox Code Playgroud)
有了这个标题:
x-amzn-errortype: MissingAuthenticationTokenException
Run Code Online (Sandbox Code Playgroud)
它还有一个x-cache带有值的标题Error from cloudfront,所以我猜它可能与 CloudFront 有关。我还没有明确设置 CloudFront,也不知道如何检查?
我想我阅读了有关此错误消息的每个线程,但它们似乎都不适用于我:

/periodicals/whatever(即{tail+}资源)时,它工作正常,但对于/periodicals.ANY.
感谢@Lakindu,一个有趣的观察是在 Stages 视图中的资源下方没有列出任何方法:
我还能做些什么来找出问题所在?
是否有任何可能的方法可以禁用 CloudWatch 来记录 Lambda 函数的事件?如果可能,那么执行此操作的步骤是什么。
我在 AWS 上运行 Lamba,并使用 slf4j 进行日志记录
项目要求的一部分是可以在运行时设置日志级别,使用环境变量,但我不确定这是否可能
我正在使用以下代码,但将 UI 中的环境变量“LOG_LEVEL”更改为“DEBUG”对添加到 CloudWatch 日志的内容没有影响。这可能吗?
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyLambdaHandler implements RequestHandler<Integer, String> {
private static final Logger LOGGER = LoggerFactory.getLogger(MyLambdaHandler.class);
static {
org.apache.log4j.Logger rootLogger = LogManager.getRootLogger();
String logLevel = (System.getenv("LOG_LEVEL") != null) ? System.getenv("LOG_LEVEL") : "INFO";
rootLogger.setLevel(Level.toLevel(logLevel));
}
public String myHandler(int myCount, Context context) {
LOGGER.debug("Entering myHandler lambda handler";
LOGGER.info("Handling myCount {}", myCount);
int returnValue = myCount * 2;
LOGGER.debug("MyHandler return value {}", returnValue);
return returnValue; …Run Code Online (Sandbox Code Playgroud) 我正在使用 next.js9 开发一个项目。我有一些问题和疑问。我想将我的 next.js 9 项目部署到 AWS lambda。
官方 next.js 9 文档告诉我“页面目录中的每个页面都变成了无服务器 lambda。” 上面的库不像文档那样工作。如何从每个页面部署到每个 lambda?
什么是合理的部署方案?请在生产级别使用nextjs 9的人帮助我。
我正在使用这个库https://github.com/danielcondemarin/serverless-next.js。它运行良好。但所有选项都是固定的。我想将我的项目部署到东京地区。但我不知道如何更改区域。始终部署到弗吉尼亚北部地区。我已经检查过 doc 但我认为他们没有选择。并像这个 yml 文件一样进行测试。
无服务器.yml
myNextApplication:
component: serverless-next.js
region: ap-northeast-1
Run Code Online (Sandbox Code Playgroud)
但它不起作用。如果有人知道如何使用 serverless-next.js 更改区域。请帮我。
先感谢您
我在我的无服务器应用程序(避免混乱的最简单应用程序)中有一个类似于以下的目录结构,我使用 AWS SAM 和 Python 3.8 作为运行时创建了它:
??? common
? ??? a.py
??? hello_world
? ??? __init__.py
? ??? app.py
? ??? requirements.txt
??? template.yaml
Run Code Online (Sandbox Code Playgroud)
我想common/a.py在 Lambda 处理程序中导入模块 - hello_world/app.py。现在我知道我可以通过将路径添加到or来在 Python 中正常导入它,但是当代码在 Docker 容器内的 Lambda 中运行时它不起作用。调用时,Lambda 处理函数在目录内运行,不考虑文件夹结构。PYTHONPATHsys.path/var/task
我尝试插入/var/task/common, /var/common,/var甚至像这样/common以sys.path编程方式插入:
import sys
sys.path.insert(0, '/var/task/common')
from common.a import Alpha
Run Code Online (Sandbox Code Playgroud)
但我仍然收到错误:
ModuleNotFoundError: No module named 'common'
我知道Lambda 层,但鉴于我的场景,我想直接引用多个 Lambda 函数中的公共代码,而无需上传到层。我想serverless-python-requirements在无服务器框架中但在 …
我一直在使用 AWS API Gateway、Lambda 和无服务器框架构建无服务器 REST API。我想建立一个用户注册的网站,选择一个 API 计划(免费、基本、专业)并获得相应的长期 API 密钥,他们可以使用该密钥每月查询一定次数的无服务器 API。
我知道使用 Cognito 和自托管 UI,您可以使用 CUP(Cognito 用户池)令牌轻松处理用户身份验证,这些令牌实际上是 Json Web 令牌。我想自动创建 API 密钥并将其关联到使用计划,然后关联到 Cognito 用户。
第一部分很简单:使用 AWS Javascript SDK,只需执行以下操作:
var params = {
keyId: 'whateverKeyId', /* required */
keyType: 'API_KEY', /* required */
usagePlanId: 'whateverUsagePlanId' /* required */
};
apigateway.createUsagePlanKey(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)
我在第二部分苦苦挣扎......我应该将 API 密钥作为自定义属性添加到用户池中吗?但是,我真的不知道如何检索 API 密钥。该文件是不是真的清楚。注册后将用户和 API Key 添加到我自己的 DynamoDB 数据库中(这真的会浪费 Cognito)? …
我正在尝试在单个堆栈中部署 S3 静态网站和 API 网关/lambda。
S3 静态站点中的 javascript 调用 lambda 来填充 HTML 列表,但它需要知道用于 lambda 集成的 API 网关 URL。
目前,我像这样生成了一个 RestApi ......
const handler = new lambda.Function(this, "TestHandler", {
runtime: lambda.Runtime.NODEJS_10_X,
code: lambda.Code.asset("build/test-service"),
handler: "index.handler",
environment: {
}
});
this.api = new apigateway.RestApi(this, "test-api", {
restApiName: "Test Service"
});
const getIntegration = new apigateway.LambdaIntegration(handler, {
requestTemplates: { "application/json": '{ "statusCode": "200" }' }
});
const apiUrl = this.api.url;
Run Code Online (Sandbox Code Playgroud)
但是在 cdk 部署上,apiUrl =
"https://${Token[TOKEN.39]}.execute-api.${Token[AWS::Region.4]}.${Token[AWS::URLSuffix.1]}/${Token[TOKEN.45]}/"
因此,直到静态站点需要该值之后,才会解析/生成 url。
如何计算/查找/获取 API 网关 URL 并更新 cdk …
aws-lambda ×10
python ×2
amazon-s3 ×1
amazon-swf ×1
api-key ×1
aws-cdk ×1
aws-sam ×1
aws-sam-cli ×1
cloud ×1
deployment ×1
log-level ×1
log4j ×1
logging ×1
next.js ×1
node.js ×1
python-3.x ×1
reactjs ×1
slf4j ×1
web-scraping ×1