标签: serverless

如何使用无服务器部署没有身份源的 API Gateway 自定义授权方?

我正在尝试使用无服务器框架在 API Gateway 中创建自定义 lambda 授权方。

我的服务的客户端可以发送“授权”或“X-自定义”标头(但不能同时发送两者)。所以我需要的是一个没有身份源的自定义授权者。

无服务器 YAML 截图如下:

functions:
  create:
    handler: posts.create
    events:
      - http:
          path: posts/create
          method: post
          authorizer:
            arn: xxx:xxx:Lambda-Name
            resultTtlInSeconds: 0
            type: request
          integration: lambda
          cors: true
          request:
            template:
              application/json: '{"method": "$context.httpMethod","body" : $input.json("$"),"headers": {#foreach($param in $input.params().header.keySet())"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end#end},"queryParams": {#foreach($param in $input.params().querystring.keySet())"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end#end},"pathParameters": {#foreach($param in $input.params().path.keySet())"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end#end}}'
Run Code Online (Sandbox Code Playgroud)

我使用以下请求模板,以便我的 lambda 获取标头并可以执行验证:

{"method": "$context.httpMethod","body" : $input.json("$"),"headers": {#foreach($param in $input.params().header.keySet())"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end#end},"queryParams": {#foreach($param in $input.params().querystring.keySet())"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end#end},"pathParameters": {#foreach($param in $input.params().path.keySet())"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end#end}}
Run Code Online (Sandbox Code Playgroud)

问题是,当我运行无服务器部署命令时,授权者是使用“授权”身份资源创建的。

我的代码基于以下资源:

amazon-web-services aws-api-gateway serverless lambda-authorizer

4
推荐指数
1
解决办法
1646
查看次数

运行 sls 部署时无服务器挂起。Docker 命令未结束

我遵循本教程是为了使用 python 设置无服务器 AWS lambda。

我想使用无服务器 lambda 运行这个简单的 httprequest 函数(位于 httprequest.py 中):

import requests

def handler(event, context):
    r = requests.get("https://news.ycombinator.com/news")
    return {"content": r.text}
Run Code Online (Sandbox Code Playgroud)

以下是我的serveless.yaml:

service: serverlessProj
frameworkVersion: '2'

provider:
  name: aws
  runtime: python3.8

functions:
  hello:
    handler: hello.handler
  httprequest:
    handler: httprequest.handler

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: true

Run Code Online (Sandbox Code Playgroud)

现在,如您所见,自定义部分告诉 serverless-python-requirements 插件在 Docker 容器中编译 Python 包。它应该安装requirements.txt 中的插件。这是requirements.txt的内容:

requests
Run Code Online (Sandbox Code Playgroud)

运行时sls deploy,这是控制台输出:

Serverless: Generated requirements from /Users/user/Desktop/ShoeSwiper/Serverless/requirements.txt in /Users/user/Desktop/ShoeSwiper/Serverless/.serverless/requirements.txt...
Serverless: Installing requirements from /Users/user/Library/Caches/serverless-python-requirements/007/requirements.txt ...
Serverless: Docker Image: lambci/lambda:build-python3.8
Serverless: …
Run Code Online (Sandbox Code Playgroud)

python docker serverless

4
推荐指数
1
解决办法
2123
查看次数

provider.logRetentionInDays 未按预期工作

我使用的是无服务器框架版本 2.11.0

尝试部署时,它抛出无服务器错误:

Configuration error at 'provider.logRetentionInDays': should be equal to one of the allowed values
Run Code Online (Sandbox Code Playgroud)

但它没有显示任何允许的值。同样在我的例子中,我给出的值为 90(整数)。我做错了什么吗?

serverless-framework serverless-architecture serverless aws-serverless serverless-application-model

4
推荐指数
1
解决办法
2025
查看次数

如何在AWS eventbridge eventpattern中的anything-but子句中使用多个前缀?

我遇到一种情况,需要使用 eventbridge 中的 eventpatterns 过滤掉某些事件。我想对所有事件运行规则,除了用户名以 abc 或 xyz 开头的事件。我尝试过以下 2 种语法,但没有一个有效:

"userIdentity": {
      "sessionContext": {
        "sessionIssuer": {
          "userName": [
            {
              "anything-but": {
                "prefix": [
                  "abc-",
                  "xyz-"
                ]
              }
            }
          ]
        }
      }
    }

"userIdentity": {
      "sessionContext": {
        "sessionIssuer": {
          "userName": [
            {
              "anything-but": [{
                "prefix": "abc-",
                "prefix": "xyz-"
              }]
            }
          ]
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

保存规则时出现以下错误:“事件模式无效。原因:在除列表之外的任何内容中,不支持 start|null|boolean。

我是否在语法中遗漏了某些内容,或者如果这是一个限制,那么这个问题还有其他选择吗?

amazon-web-services amazon-cloudwatch serverless amazon-cloudwatch-events aws-event-bridge

4
推荐指数
1
解决办法
7926
查看次数

微服务、Lambda 与无服务器函数的区别

我只是想找到一个通用定义,两者之间有什么区别

\n
    \n
  1. 微服务
  2. \n
  3. 拉姆达函数
  4. \n
  5. 和无服务器功能
  6. \n
\n

我的目标是在 Kyma 上实现 \xe2\x80\x9ereal\xe2\x80\x9c 微服务 - 已经实现的关键点是什么,这样我就不会 \xe2\x80\x9ejust\xe2\x80\x9c实现一个功能?

\n

microservices serverless kyma

4
推荐指数
1
解决办法
3163
查看次数

吉普 错误!堆栈错误:EACCES:权限被拒绝,mkdir '/usr/local/lib/node_modules/serverless/node_modules/snappy/.node-gyp'

我有一个 AWS CodeBuild 项目,它尝试安装无服务器框架,但在标题中返回错误,但它表示框架已成功安装。我的理解是,这无法安装 snappy 模块。这是为什么?我该如何解决这个问题?

我在 buildspec.yaml 中运行的命令是:

npm install -g serverless
Run Code Online (Sandbox Code Playgroud)

我的用户是:

/root
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

serverless-framework aws-codebuild serverless

4
推荐指数
1
解决办法
4374
查看次数

标准 SQS 与每条消息都有唯一 groupId 的 FIFO SQS 的吞吐量

我不太关心事件的顺序,但我希望消息只被处理一次。侦听 SQS 消息的 lambda 会将其存储在 DynamoDB 中,因此吞吐量非常重要,因为我有多个微服务(作为生产者)将消息写入此 SQS,这些消息将由单个微服务读取。

关于只处理一次消息,这是 FIFO 队列支持的,但据说吞吐量不太好。

如果每条消息都有唯一的 groupId,那么 FIFO 队列的吞吐量与标准队列相同吗?

如果没有,我的下一个选择可能是在存储消息时在 DynamoDB 中使用“attribute_not_exists”。

其中哪一个应该效果更好?

amazon-sqs amazon-web-services amazon-dynamodb serverless-framework serverless

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

无服务器错误 AWS 配置文件“”似乎未配置?

这是我第一次使用 AWS,我正在尝试通过无服务器运行 API。我不确定如何配置 AWS 配置文件。我似乎在网上也找不到太多有关它的信息。有人可能有链接吗?或者有什么可以引导我走向一个方向?

amazon-web-services serverless aws-serverless

4
推荐指数
1
解决办法
5024
查看次数

在 NodeJS lambda 中使用自定义层

我在尝试将图层导入 lambda 函数时遇到错误。我已经检查了所有设置和配置,但我只是不明白为什么当我的函数部署并运行时,我收到来自 AWS 的错误,说它无法找到该layers层:

{
    "errorType": "Error",
    "errorMessage": "Cannot find module 'layers'\nRequire stack:\n- /var/task/entities/transakWebhookEvent.js\n- /var/task/handler.js\n- /var/task/s_money_movements_api.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
    "code": "MODULE_NOT_FOUND",
    "requireStack": [
        "/var/task/entities/transakWebhookEvent.js",
        "/var/task/handler.js",
        "/var/task/s_money_movements_api.js",
        "/var/runtime/UserFunction.js",
        "/var/runtime/index.js"
    ],
    "stack": [
        "Error: Cannot find module 'layers'",
        "Require stack:",
        "- /var/task/entities/transakWebhookEvent.js",
        "- /var/task/handler.js",
        "- /var/task/s_money_movements_api.js",
        "- /var/runtime/UserFunction.js",
        "- /var/runtime/index.js",
        "    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)",
        "    at Module._require.i.require (/var/task/serverless_sdk/index.js:9:73131)",
        "    at require (internal/modules/cjs/helpers.js:74:18)",
        "    at Object.<anonymous> (/var/task/entities/transakWebhookEvent.js:5:20)",
        "    at Module._compile (internal/modules/cjs/loader.js:999:30)",
        "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)",
        "    at Module.load (internal/modules/cjs/loader.js:863:32)",
        "    at …
Run Code Online (Sandbox Code Playgroud)

layer amazon-web-services node.js serverless

4
推荐指数
1
解决办法
4772
查看次数

无法查看 s3 上传的图像文件

我正在使用 s3 上传图像文件。但每当我尝试使用 URL 以及从 s3 控制台下载时,都会下载图像文件。但是,图像查看器将看不到它。它只是显示不兼容的文件类型。

myS3Function.uploadFile(request.body.fileName, request.files.myFileData, "image_folder").then(filename => {
 //success
})
Run Code Online (Sandbox Code Playgroud)

const AWS = require('aws-sdk');

const s3 = new AWS.S3({
 region: process.env.REGION
});

exports.uploadFile  = (filename, data, folderName) => {
return new Promise((resolve, reject) => {
    const params = {
        Bucket: process.env.AWS_S3_BUCKET, 
        Key: folderName+'/'+filename,
        Body: data.data,
        ACL:'public-read',
        ContentType: "image/jpeg"
    };
    s3.upload(params, function(s3Err, data) {
        if (s3Err) reject(s3Err)
        console.log(`File uploaded successfully at ${data.Location}`)
        resolve(`${data.Location}`)

    });
});
}
Run Code Online (Sandbox Code Playgroud)

我现在使用邮递员上传文件作为表单数据。我可以正确地看到使用此代码上传的文本文件。那么为什么图像会出现这个问题呢?此外,图像和 pdf 实际文件大小也略有增加。

在此输入图像描述

在此输入图像描述

javascript amazon-s3 amazon-web-services serverless-framework serverless

4
推荐指数
1
解决办法
5293
查看次数