标签: 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
查看次数

通过 API GW 调用时,AWS Lambda Go 函数未获取请求正文

首先,有人可能会说这个问题与HTTP request body not getting to AWS lambda function via AWS API Gateway或Getting json body in aws Lambda via API gateway非常相似

但是,这些问题都没有解决使用 Golang 的问题,我遇到的问题是找到event与 Node.js 文档中随处使用的参数等效的参数。

这是我的 Lambda 函数:

package main

import (
    "context"
    "encoding/json"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-lambda-go/events"
    "log"
)

type MyReturn struct {
    Response string `json:"response"`
}

type APIGWResponse struct {
    IsBase64Encoded bool              `json:"isBase64Encoded"`
    StatusCode      int               `json:"statusCode"`
    Headers         map[string]string `json:"headers"`
    Body            string            `json:"body"`
}

func handle(ctx context.Context, name MyReturn) (APIGWResponse, error) {
    log.Print("Called by …
Run Code Online (Sandbox Code Playgroud)

go aws-lambda aws-api-gateway aws-lambda-go

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

Strapi 可以启动到 AWS lambda 中吗?

我想要一个好的 cms/后端应用程序来在 AWS 上创建/管理 API。Strapi 非常适合我的要求。但我不想使用 EC2、lightsail、beanstalk 等

我想在aws lambda上使用trapi 是否可以在aws lambda上部署trapi?

amazon-web-services aws-lambda strapi

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

在 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
查看次数

使用 Headless Chrome 运行 Selenium 的 AWS Lambda 容器可以在本地运行,但不能在 AWS Lambda 中运行

我目前正在开发一个 Python 程序,它有一个使用无头版本的 Chrome 和 Selenium 来执行重复过程的段。我的目标是在 Lambda 上运行该程序。

整个程序有大约 1GB 的依赖项,因此无法选择使用.zip 存档的标准方法,其中包含我的所有函数代码和依赖项,因为函数和所有层的总解压缩大小不能超过解压后的部署包大小限制为 250 MB。

所以,这就是新的AWS Lambda – Container Image Support(我使用这个链接教程来开发整个实现,所以如果你需要更多信息,请阅读)进来的地方。这允许我打包和部署我的 Lambda 函数作为容器镜像大小高达 10 GB。

我正在使用由运行 Amazon Linux 2 的 AWS 提供的 ECR Public 中托管的基本映像。首先 - 在我的 Dockerfile 中,我:

  • 下载基础镜像。
  • 定义一些全局变量。
  • 复制我的文件。
  • 安装我的 pip 附录
  • 使用 yum 安装一些软件包。

最后 - 我安装了 Chrome(阅读时为 87.0.4280.88)和 Chromedriver(87.0.4280.88)

  • 最后下载安装最新版本的 Chrome 和 Chromedriver

有可能这可能是问题所在,但我非常怀疑这是同一版本 - ChromeDriver 使用与 Chrome 相同的版本号方案。

这是我的Dockerfile:

# 1) DOWNLOAD BASE IMAGE.
FROM public.ecr.aws/lambda/python:3.8

# …
Run Code Online (Sandbox Code Playgroud)

python selenium chromium docker aws-lambda

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