标签: aws-lambda

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

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

aws-lambda aws-api-gateway

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

如何使用 Aws Lambda (python) 接收文件

我试图弄清楚如何通过 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)

python amazon-web-services aws-lambda angular

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

如何在 VPC 上强制完全冷启动 AWS lambda 函数?

我有一个用 Python 编写的 lambda 函数,它使用几个重量级依赖项(NumPy、pandas、goodtables 等)并且还连接到 VPC(用于访问 Postgres RDS 实例)

此函数的冷启动执行时间在一段时间后(> 4-6 小时)执行时非常大(16.2 秒)

但是,如果我更新函数代码并再次调用它(第一次执行后不久),冷启动执行时间会急剧减少(3 秒)

如果我在不更新的情况下再次调用该函数,这是一个热启动,则执行时间会进一步缩短(313 毫秒)

我怀疑第一次冷启动(16.2 秒)是在 Lambda 设置 ENI 以访问 VPC 资源时,并且在第二次冷启动(3 秒)期间重复使用 ENI,因此可以避免重新创建 ENI 所花费的时间。

我正在尝试优化此功能的冷启动时间,并希望它从头开始,以查看在完全冷启动(即没有 ENI + 冷启动)时它的执行速度。

有没有办法做到这一点并反复执行?

performance-testing amazon-web-services aws-lambda

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

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

AWS Lambda EFS | EACCES:权限被拒绝

所以,我正在尝试将我的 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

amazon-web-services amazon-iam aws-lambda amazon-efs

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

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

AWS Lambda 不断返回“\”来自 Lambda 的Hello!\”

我在使用适用于 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)

我什至更改了代码,预计会出现错误,但我仍然得到相同的输出。

python amazon-web-services amazon-dynamodb aws-lambda

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

如何将 PATH 导出到“sam build”命令?

我正在 PyCharm 上开发 AWS Lambda 函数。当我执行“运行”按钮时,出现以下错误消息。

/usr/local/bin/sam build MyFunction --template /Users/miyashiiii/Works/myapp/myapp/template.yaml --build-dir /Users/miyashiiii/Works/myapp/myapp/.aws-sam/build
Building codeuri: myapp/ runtime: python3.7 metadata: {} functions: ['MyFunction']

Build Failed
Error: PythonPipBuilder:Validation - Binary validation failed for python, searched for python in following locations  : ['/usr/bin/python'] which did not satisfy constraints for runtime: python3.7. Do you have python for runtime: python3.7 on your PATH?
Run Code Online (Sandbox Code Playgroud)

python3.7 在我的 PATH 上,其他一些位置在我的 PATH 上,但位置列表仅包含“/usr/bin/python”。

当我在终端上执行相同的命令(/usr/local/bin/sam build ~~)时,它成功了。

如何将 PATH 导出到“sam build”命令?

amazon-web-services pycharm aws-lambda aws-sam-cli aws-toolkit

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