我有一个带有 AWS API Gateway 和 Lambda 函数的无服务器 API。我正在使用自定义授权功能进行授权。标题太大,因此我收到此错误。通常,对于 nginx 服务器,我会更改 nging 配置,这将得到修复。我不知道如何在 AWS API Gateway 中处理这个问题。
我正在寻求有关我正在使用产品做出的架构设计决策的帮助。
我们有多个生产者(由 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) 首先,有人可能会说这个问题与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) 使用无服务器框架,我尝试构建一个 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
我的 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 是一个字符串,我在集成请求映射模板中强制执行它: …
我想使用 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
aws-lambda ×10
aws-sdk ×2
go ×2
python ×2
amazon-iam ×1
amazon-sqs ×1
async-await ×1
aws-cdk ×1
data-stream ×1
python-3.6 ×1
python-3.x ×1