我正在寻求有关我正在使用产品做出的架构设计决策的帮助。
我们有多个生产者(由 API 网关调用 Lambda 启动)将消息放在 SQS 队列(请求队列)上。可以有多个同时调用,因此会有多个并行运行的 Lambda 实例。
然后我们有消费者(假设有 20 个 EC2 实例)在 SQS 上进行长轮询以获取消息以处理它们。它们每个需要大约 30-45 秒来处理一条消息。
理想情况下,我希望将响应发送回发出请求的生产者 - 这是我在 SQS 方面遇到的问题。理论上,我会有一个单独的响应队列,最初的 Lambda 生产者将使用它,但似乎没有办法挑选特定的相关响应。也就是说,每个 Lambda 函数可能会获取另一个函数的响应。我正在寻找类似于这种设计模式的东西:http : //soapatterns.org/design_patterns/asynchronous_queuing
我能看到的唯一选择是为每个 Lambda API 调用创建一个新的 SQS 响应队列,在消息中传递其 ARN 供消费者放置响应,但我无法想象这是非常有效的 - 特别是当有一分钟可能有数百条消息?我错过了一些明显的东西吗?
我想唯一的其他选择是设置更大的消息代理(例如 RabbitMQ/ApacheMQ)环境,但如果可能的话,我想避免这种情况。
谢谢!
我正在尝试使用 Python 3.6 创建简单的 Lambda 函数。
该函数应该在请求查询字符串参数中获取一个 userId(我在 DynamoDB 中的主键),如果项目存在于 DB 中,则返回 200,这是我的 lambda 函数
import boto3
import os
from boto3.dynamodb.conditions import Key, Attr
def lambda_handler(event, context):
userId = event["userId"]
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ['Customers'])
items = table.query(
KeyConditionExpression=Key('userId').eq(userId)
)
return items["Items"]
Run Code Online (Sandbox Code Playgroud)
当我在 Lambda 接口中进行测试时,它可以工作并返回正确的用户,但是,当从 Postman 尝试或使用 API Gateway 时,它返回以下错误
{
"errorMessage": "'userId'",
"errorType": "KeyError",
"stackTrace": [
[
"/var/task/index.py",
7,
"lambda_handler",
"userId = event["userId"]"
]
]
}
Run Code Online (Sandbox Code Playgroud)
我试图在另一个 lambda func 中调用一个 lambda func。我有 lambda 函数的调用,但是,我似乎无法让消耗 lambda 函数从发送 lambda 函数接收有效负载/主体。
Lambda go doc 关于调用 lambda func
这是我的发送/调用 lambda func
type Response events.APIGatewayProxyResponse
func Handler(ctx context.Context) (Response, error) {
region := os.Getenv("AWS_REGION")
session, err := session.NewSession(&aws.Config{ // Use aws sdk to connect to dynamoDB
Region: ®ion,
})
svc := invoke.New(session)
payload, err := json.Marshal(map[string]interface{}{
"message": "message to other lambda func",
})
if err != nil {
fmt.Println("Json Marshalling error")
}
input := &invoke.InvokeInput{
FunctionName: aws.String("invokeConsume"),
InvocationType: aws.String("RequestResponse"),
LogType: aws.String("Tail"), …Run Code Online (Sandbox Code Playgroud) 在 AWS Lambda/NodeJS 运行时中,我尝试从绝对路径 ( /opt/nodejs/node_modules/puppeteer)导入。
Source 在本地运行良好,但是,一旦与 Webpack/serverless-webpack 捆绑并在 AWS Lambda 中运行,就会require('puppeteer')导致:
{"errorMessage":"Cannot find module 'puppeteer'","errorType":"Error","stackTrace":["webpackMissingModule (/var/task/src/render/handler.js:643:89)","/var/task/src/render/handler.js:643:173","next (native)","step (/var/task/src/render/handler.js:608:191)","/var/task/src/render/handler.js:608:361"]}
Run Code Online (Sandbox Code Playgroud)
我检查过:
/opt./opt/nodejs/node_modules/puppeteer确实存在。NODE_PATH 正确包括 /opt/nodejs/node_modulesnode.js webpack aws-lambda serverless-framework serverless-webpack-plugin
我想要一个好的 cms/后端应用程序来在 AWS 上创建/管理 API。Strapi 非常适合我的要求。但我不想使用 EC2、lightsail、beanstalk 等
我想在aws lambda上使用trapi 是否可以在aws lambda上部署trapi?
{
"errorMessage": "Unable to import module 'lambda_function':
cannot import name 'etree' from 'lxml' (/var/task/lxml/__init__.py)",
"errorType": "Runtime.ImportModuleError"
}
Run Code Online (Sandbox Code Playgroud)
也试过https://gist.github.com/allen-munsch/ad8faf9c04b72aa8d0808fa8953bc639:
{
"errorMessage": "Unable to import module 'lambda_function':
cannot import name 'etree' from 'lxml'
(/var/task/lxml-4.3.4-py3.6-linux-x86_64.egg/lxml/__init__.py)",
"errorType": "Runtime.ImportModuleError"
}
Run Code Online (Sandbox Code Playgroud)
我Ubuntu 18.04在我的本地机器上运行,并且还尝试在 ec2 实例上使用“Amazon Linux”映像来构建包。
我也试过,在激活的 venv 中:
STATIC_DEPS=true pip3 install lxml --target ./package --upgrade --no-cache-dir
Run Code Online (Sandbox Code Playgroud)
我还尝试根据在运行脚本时打开哪些文件来复制共享对象文件strace:
#! /bin/bash
export Z=$(pwd)/ok-daily-lambda.zip
rm $Z
zip $Z lambda_function.py
zip $Z __init__.py
for dir in $(find venv_here/lib/python3.6/site-packages)
do
if [ -d $dir …Run Code Online (Sandbox Code Playgroud) 使用无服务器框架,我尝试构建一个 Lambda 函数,该函数会定期轮换存储在 AWS Secrets Manager 中的秘密。
我在配置 Secret Manager 执行 Lambda 所需的角色时遇到问题。在我的serverless.yml我定义了以下资源:
resources:
Resources:
RotateKeysRole:
Type: AWS::IAM::Role
Properties:
RoleName: rotate-keys-role
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
- secretsmanager.amazonaws.com
Action: sts:AssumeRole
Run Code Online (Sandbox Code Playgroud)
并将此角色附加到轮换 Lambda,如下所示:
functions:
rotateKeys:
handler: lambdas.rotate_keys.handler
role: RotateKeysRole
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试设置 Secrets Manager 以使用此 Lambda 来轮换密钥时,我会收到以下错误消息:
Secrets Manager 无法调用指定的 Lambda 函数。确保函数策略授予对主体 secretsmanager.amazonaws.com 的访问权限
这让我感到困惑,因为指定了这个主体。检查 IAM 控制台中的角色并没有发现任何我觉得有问题的地方。
在这种情况下如何正确配置角色设置?
amazon-web-services amazon-iam aws-lambda serverless-framework aws-secrets-manager
Amazon 建议不要在 lambda 函数中包含大型库/依赖项。据我所知,SQLAlchemy 是一个相当大的 Python 库。你认为在 lambda 函数中使用它是个好主意吗?一种选择是将其包含为 Lambda 层并在所有相关的 Lambda 函数中使用它。
无论如何,最好的做法是什么?
python sqlalchemy aws-lambda serverless-framework aws-lambda-layers
我以前做过 Lambda 函数,但没有在 Python 中做过。我知道在 Javascript 中 Lambda 支持异步处理函数,但是如果我在 Python 中尝试它,我会得到一个错误。
这是我要测试的代码:
async def handler(event, context):
print(str(event))
return {
'message' : 'OK'
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
An error occurred during JSON serialization of response: <coroutine object handler at 0x7f63a2d20308> is not JSON serializable
Traceback (most recent call last):
File "/var/lang/lib/python3.6/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/var/lang/lib/python3.6/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/var/lang/lib/python3.6/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/var/runtime/awslambda/bootstrap.py", line 149, in decimal_serializer
raise TypeError(repr(o) …Run Code Online (Sandbox Code Playgroud) python amazon-web-services async-await aws-lambda python-3.6
我正在开发一个可以读取和分析支付交易日志的应用程序。我知道我会根据我的要求使用 Kinesis Analytics,它从 Data Streams 和 Firehose 获取输入。但是我在决定我的系统应该使用哪种输入法时遇到了麻烦。我的要求是:
哪个输入流适合我的用例?
amazon-web-services data-stream amazon-kinesis aws-lambda aws-serverless
aws-lambda ×10
python ×4
amazon-iam ×1
amazon-sqs ×1
async-await ×1
aws-sdk ×1
data-stream ×1
go ×1
node.js ×1
python-3.6 ×1
python-3.x ×1
sqlalchemy ×1
strapi ×1
webpack ×1