我有一个带有 AWS API Gateway 和 Lambda 函数的无服务器 API。我正在使用自定义授权功能进行授权。标题太大,因此我收到此错误。通常,对于 nginx 服务器,我会更改 nging 配置,这将得到修复。我不知道如何在 AWS API Gateway 中处理这个问题。
我正在开发一个股票应用程序,必须让用户浏览器更新价格变化
我不需要访问过去的数据,浏览器只需在更改时获取当前数据
是否可以过滤 dynamodb 流并公开可以与 javascript EventSource 一起使用的端点(在 api 网关后面)?
amazon-web-services server-sent-events aws-lambda eventsource
我试图弄清楚如何通过 Python 中的 API 调用接收浏览器发送的文件。
允许 Web 客户端发送任何类型的文件(比如 .txt、.docx、.xlsx 等)。我不知道我是否应该使用二进制文件。
这个想法是在 S3 之后保存文件。现在我知道可以使用像 Aws Amplify 这样的 js 库并生成一个临时 url,但我对该解决方案不太感兴趣。
任何帮助表示赞赏,我已经在 Python 中广泛搜索了一个解决方案,但我找不到任何实际工作的东西!
我的 API 是私有的,我使用无服务器进行部署。
files_post:
handler: post/post.post
events:
- http:
path: files
method: post
cors: true
authorizer:
name: authorizer
arn: ${cf:lCognito.CognitoUserPoolMyUserPool}
Run Code Online (Sandbox Code Playgroud)
编辑
我有一个适用于文本文件但不适用于 PDF、XLSX 或图像的半解决方案,如果有人有我会非常高兴
from cgi import parse_header, parse_multipart
from io import BytesIO
import json
def post(event, context):
print event['queryStringParameters']['filename']
c_type, c_data = parse_header(event['headers']['content-type'])
c_data['boundary'] = bytes(c_data['boundary']).encode("utf-8")
body_file = BytesIO(bytes(event['body']).encode("utf-8"))
form_data = parse_multipart(body_file, c_data)
s3 = boto3.resource('s3')
object …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 函数。我意识到我还需要创建一个 IAM 角色。所以我正在尝试使用 Terraform 来做这两项工作。但它不允许我创建角色。
这是我的 Terraform 文件
provider "aws" {
profile = "default"
region = "eu-west-1"
}
data "aws_iam_policy" "AWSLambdaBasicExecutionRole" {
arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}
resource "aws_iam_role" "terraform_function_role" {
name = "terraform_function_role"
assume_role_policy = "${data.aws_iam_policy.AWSLambdaBasicExecutionRole.policy}"
}
resource "aws_lambda_function" "terraform_function" {
filename = "terraform_function.zip"
function_name = "terraform_function"
handler = "index.handler"
role = "${aws_iam_role.terraform_function_role.id}"
runtime = "nodejs8.10"
source_code_hash = "${filebase64sha256("terraform_function.zip")}"
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误
Error creating IAM Role terraform_function_role: MalformedPolicyDocument: Has prohibited field Resource
status code: 400
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 函数与 EFS 集成。我可以访问根目录(从 lambda 为只读),因为我可以xyz在我的根目录中看到可用的目录。/mnt/->xyz
当我尝试访问/mnt/xyz或/mnt/xyz/然后我收到此错误:
{
"errorType": "Error",
"errorMessage": "EACCES: permission denied, scandir '/mnt/xyz/'",
"trace": [
"Error: EACCES: permission denied, scandir '/mnt/xyz/'",
" at Object.readdirSync (fs.js:948:3)",
" at Runtime.exports.handler (/var/task/index.js:19:24)",
" at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
]
}
Run Code Online (Sandbox Code Playgroud)
授予接入点的权限:777
我在使用适用于 Python 3.8 的 AWS Lambda 时遇到了一些问题。无论我尝试运行什么代码,AWS Lambda 都会不断返回相同的响应。我正在尝试使用以下代码从 DynamoDB 实例中检索信息:
import json
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('planets')
def lambda_handler(event, context):
response = table.get_item(
Key = {
'id':'mercury'
}
)
print(response)
# TODO implement
return {
'statusCode': 200,
'body': response)
}
Run Code Online (Sandbox Code Playgroud)
我期待类似的输出'body':{'Item': {'id':'mercury', 'temp':'sizzling hot'}},甚至是错误,但我不断收到以下响应:
Response:
{
"statusCode": 200,
"body": "\"Hello from Lambda!\""
}
Run Code Online (Sandbox Code Playgroud)
我什至更改了代码,预计会出现错误,但我仍然得到相同的输出。
aws-lambda ×10
amazon-iam ×3
python ×3
amazon-efs ×1
angular ×1
aws-sdk ×1
eventsource ×1
jenkins ×1
serverless ×1
sqlalchemy ×1
terraform ×1