标签: aws-lambda

AWS SQS 异步队列模式(请求/响应)

我正在寻求有关我正在使用产品做出的架构设计决策的帮助。

我们有多个生产者(由 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)环境,但如果可能的话,我想避免这种情况。

谢谢!

amazon-sqs amazon-web-services aws-lambda

9
推荐指数
2
解决办法
5605
查看次数

Python lambda 函数返回 KeyError

我正在尝试使用 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)
  • 我在这里错过了什么?
  • 努力理解“事件”,文档说明它是一个 python 字典,但是当从 Postman 或 API Gateway 调用时,我如何打印它的结果并实际调试 lambda?

python amazon-web-services python-3.x aws-lambda

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

如何使用 golang 在另一个 Lambda 函数中调用一个 Lambda 函数

我试图在另一个 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: &region,
    })
    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)

go amazon-web-services aws-sdk aws-lambda

9
推荐指数
2
解决办法
5078
查看次数

无法在 aws lambda 上导入 lxml etree

{
  "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)

python aws-lambda

9
推荐指数
2
解决办法
6163
查看次数

在 AWS Lambda 中使用 Python SQLAlchemy 是个好主意吗?

Amazon 建议不要在 lambda 函数中包含大型库/依赖项。据我所知,SQLAlchemy 是一个相当大的 Python 库。你认为在 lambda 函数中使用它是个好主意吗?一种选择是将其包含为 Lambda 层并在所有相关的 Lambda 函数中使用它。

无论如何,最好的做法是什么?

python sqlalchemy aws-lambda serverless-framework aws-lambda-layers

9
推荐指数
1
解决办法
5142
查看次数

aws serverless.yml 文件“无法找到满足声明‘opt:stage’的有效选项”错误

尝试运行无服务器时收到以下警告。

无服务器警告 -------------------------------------

找不到满足声明 '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)

jenkins aws-lambda serverless

9
推荐指数
1
解决办法
7615
查看次数

是否可以从 Lambda 内部署 AWS CDK 堆栈?

我想使用 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)

amazon-web-services aws-lambda aws-codepipeline aws-cdk

9
推荐指数
1
解决办法
1902
查看次数

你能在 Lambda Python 3.6 中有一个异步处理程序吗?

我以前做过 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

9
推荐指数
1
解决办法
4727
查看次数

Streams 和 Firehose 的用例是什么?

我正在开发一个可以读取和分析支付交易日志的应用程序。我知道我会根据我的要求使用 Kinesis Analytics,它从 Data Streams 和 Firehose 获取输入。但是我在决定我的系统应该使用哪种输入法时遇到了麻烦。我的要求是:

  1. 它可以容忍延迟,但数据不应该丢失数据。
  2. 必须记录 DynamoDB 或 S3 存储桶中的所有错误。

哪个输入流适合我的用例?

amazon-web-services data-stream amazon-kinesis aws-lambda aws-serverless

9
推荐指数
3
解决办法
2991
查看次数

使用Cognito进行REST API身份验证

我希望使用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

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