标签: aws-lambda

AWS API 网关:状态代码 413,请求实体太大

我有一个带有 AWS API Gateway 和 Lambda 函数的无服务器 API。我正在使用自定义授权功能进行授权。标题太大,因此我收到此错误。通常,对于 nginx 服务器,我会更改 nging 配置,这将得到修复。我不知道如何在 AWS API Gateway 中处理这个问题。

aws-lambda aws-api-gateway

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

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

是否有适合向浏览器发送实时更新的 aws 服务?

我正在开发一个股票应用程序,必须让用户浏览器更新价格变化

我不需要访问过去的数据,浏览器只需在更改时获取当前数据

是否可以过滤 dynamodb 流并公开可以与 javascript EventSource 一起使用的端点(在 api 网关后面)?

amazon-web-services server-sent-events aws-lambda eventsource

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

如何使用 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
查看次数

如何授予对 AWS Secrets Manager 的轮换 Lambda 访问权限

使用无服务器框架,我尝试构建一个 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

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

一个或多个参数值无效:预期 xyz 键的类型不匹配:S 实际:M

我的 AWS Lambda 根据此答案调用 DynamoDB:https ://stackoverflow.com/a/33649402/495455

import json
import boto3
client = boto3.resource('dynamodb')
table = client.Table("DS-Users")

def lambda_handler(event, context):

    UserName = event['UserName']
    Email = event['Email']
    Score = event['Score']
    Mobile = event['Mobile']
    CountryId = event['CountryId']
    Level = event['Level']
    Magic = event['Magic']

    table.put_item(Item={'UserName':{'S':UserName},'Email':{'S':Email},'Score':{'N':Score},'Level':{'N':Level},'Mobile':{'S':Mobile},'Magic':{'S':Magic}})

    return {
        'statusCode': 200,
        'body': json.dumps(event)
    }
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

一个或多个参数值无效:预期用户名的类型不匹配:S 实际:M

研究错误会得到一些无法解决上述错误的答案:

1) https://github.com/awslabs/dynamodb-document-js-sdk/issues/17

错误是说 DynamoDB 需要 uuid 的字符串,但它得到了其他东西。根据来自 dynamodb 文档的这一点,S 是 dynamodb 的字符串,正如 raymolin 所说,M 是地图(如对象或模型)。因此,发送的 uuid 不能是字符串,而是模型/对象/映射。一旦修复,这应该可以正常工作。

2) https://forums.aws.amazon.com/thread.jspa?threadID=248424

问题在于我分配给 lambda 执行的 IAM 角色的权限。

我很难过,因为 UserName 是一个字符串,我在集成请求映射模板中强制执行它: …

type-mismatch amazon-dynamodb aws-sdk aws-lambda

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

是否可以从 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
查看次数