我正在寻求有关我正在使用产品做出的架构设计决策的帮助。
我们有多个生产者(由 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) {
"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) Amazon 建议不要在 lambda 函数中包含大型库/依赖项。据我所知,SQLAlchemy 是一个相当大的 Python 库。你认为在 lambda 函数中使用它是个好主意吗?一种选择是将其包含为 Lambda 层并在所有相关的 Lambda 函数中使用它。
无论如何,最好的做法是什么?
python sqlalchemy aws-lambda serverless-framework aws-lambda-layers
尝试运行无服务器时收到以下警告。
无服务器警告 -------------------------------------
找不到满足声明 'opt:stage' 的有效选项。下面是我的 serverless.yml 文件
# Serverless Config
service: api-service
# Provider
provider:
name: aws
runtime: nodejs8.10
region: ${opt:region, 'ap-east-1'}
stage: ${opt:stage, 'dev'}
# Enviroment Varibles
environment:
STAGE: ${self:custom.myStage}
MONGO_DB_URI: ${file(./serverless.env.yml):${opt:stage}.MONGO_DB_URI}
LAMBDA_ONLINE: ${file(./serverless.env.yml):${opt:stage}.LAMBDA_ONLINE}
# Constants Varibles
custom:
# environments Variables used for convert string in upper case format
environments:
myStage: ${opt:stage, self:provider.stage}
stages:
- dev
- qa
- staging
- production
region:
dev: 'ap-east-1'
stage: 'ap-east-1'
production: 'ap-east-1'
# Function
functions:
testFunc:
handler: index.handler
description: ${opt:stage} API's …Run Code Online (Sandbox Code Playgroud) 我想使用 Lambda 函数部署 AWS CDK 堆栈。用例是支持与Trek10 的无服务器 CI/CD 管道中描述的功能类似的功能,相关代码在此处。
简而言之,AWS CodePipelines 仅支持监听单个 Git 分支内的更改。我想监听与创建存储库和分支相关的 GitHub 事件,并创建 CodePipeline 实例以响应这些事件,以便每个 Git 存储库的每个分支都有一个管道。我想要一个 Lambda 来监听 GitHub 事件并创建 CDK 堆栈。Trek10 示例使用 Python 并直接调用 CloudFormation。我希望 Lambda 更简单,而是使用 CDK。
这是一个使用 Typescript 的简单 Lambda,它源自此AWS CDK 问题:
// index.ts
import {ScheduledEvent} from 'aws-lambda';
import {CloudFormationDeploymentTarget, DEFAULT_TOOLKIT_STACK_NAME} from 'aws-cdk/lib/api/deployment-target';
import {CdkToolkit} from 'aws-cdk/lib/cdk-toolkit';
import {AppStacks} from 'aws-cdk/lib/api/cxapp/stacks';
import {Configuration} from 'aws-cdk/lib/settings';
import {execProgram} from "aws-cdk/lib/api/cxapp/exec";
import * as yargs from 'yargs';
import {SDK} …Run Code Online (Sandbox Code Playgroud) 我以前做过 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
我希望使用API Gateway + Lambda + Cognito用户池来构建一个简单的REST API.
API将以两种方式使用.第一个是支持基本的Web应用程序(托管在CloudFront + S3上).Web应用程序的身份验证使用托管的Cognito登录/注册流程,并且工作正常(使用API网关设置来使用用户池身份验证器).
第二种方法是让客户使用REST API与系统进行通信.
例如,客户端可能使用Web应用程序配置工作流,然后使用API来调用该工作流.
验证API以与后端服务一起使用的推荐方法是什么?
传统上,我希望为此目的使用API密钥+秘密令牌.我在API网关界面中创建API密钥没有问题,但我无论如何都看不到将其链接到特定用户,也看不到任何在API密钥旁边指定秘密令牌的方法.
假设以上是可能的,我将如何设置它以便我可以使用基于JWT的Web应用程序方法和API密钥+秘密令牌供客户使用.
编辑:此外,我注意到应用程序客户端有一个ID和一个秘密.它们是否打算用于第三次基于API的身份验证(类似于其他系统如何使您为API访问创建应用程序)?我有点怀疑,因为每个用户池有25个限制,虽然这是一个软限制......
authentication rest amazon-cognito aws-lambda aws-api-gateway
aws-lambda ×10
python ×4
amazon-sqs ×1
async-await ×1
aws-cdk ×1
aws-sdk ×1
data-stream ×1
go ×1
jenkins ×1
python-3.6 ×1
python-3.x ×1
rest ×1
serverless ×1
sqlalchemy ×1