标签: serverless

无法在SAM模板中添加策略

我正在研究SAM模板,用于在AWS Serverless存储库中发布我的应用程序。但是,当我尝试为lambda添加策略时,会显示错误消息:Invalid Serverless Application Specification文档。发现的错误数量:1.错误:ID为[SyncPostDataFromSfLambda]的资源无效。“策略”属性中仅支持策略模板。

以下是我的SAM模板的示例:

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::Serverless-2016-10-31",
    "Description": "Deployment",
    "Resources": {
        "SyncPostDataToSfLambda": {
            "Type": "AWS::Serverless::Function",
            "Properties": {
                "Handler": "index.handler",
                "FunctionName": "myLambdaFunction",
                "CodeUri": "s3 URL",
                "Runtime": "nodejs6.10",
                "MemorySize": 512,
                "Policies": [
                    "AmazonDynamoDBFullAccess"
                ],
                "Events": {
                    "PostResource": {
                        "Type": "Api",
                        "Properties": {
                            "RestApiId": {
                                "Ref": "API"
                            },
                            "Path": "/apipath",
                            "Method": "post"
                        }
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

aws-lambda serverless

6
推荐指数
3
解决办法
5002
查看次数

如何从 AWS Lambda Serverless 执行 .jar 文件?

我试过下面的代码。

var exec = require('child_process').execFile;
  var runCmd = 'java -jar ' + process.env.LAMBDA_TASK_ROOT + '/src/' + 'myjar.jar'

  exec(runCmd,
    function (err, resp) {
      if (err) {
        cb(null, { err: err})

      } else {
        cb(null, { resp: resp})
      }
    )
Run Code Online (Sandbox Code Playgroud)

在这里,我也将我的 jar 文件放在根文件夹和 src 文件夹中。但它给出了我的以下错误。我已经添加了带有代码的 .jar 文件。但是出现以下错误。

"err": {
    "code": "ENOENT",
    "errno": "ENOENT",
    "syscall": "spawn java -jar /var/task/src/myjar.jar",
    "path": "java -jar /var/task/src/myjar.jar",
    "spawnargs": [],
    "cmd": "java -jar /var/task/src/myjar.jar"
}
Run Code Online (Sandbox Code Playgroud)

那么如何,我可以在 AWS Lambda 环境中执行这个 .jar 文件吗?请帮我。

jar amazon-web-services aws-lambda serverless

6
推荐指数
2
解决办法
6499
查看次数

使用 SQS、SNS 和 APIGW 进行无服务器或 SAM 和本地开发

我正在评估无服务器 v AWS SAM CLI。我试图了解在使用以下内容进行开发时如何促进本地开发工作流程:-

  • Lambda 是用 Python 编写的
  • 由带有 SES 邮件负载的 SNS 通知触发
  • 读取 S3 对象
  • 读写dynamodb
  • 写入 SQS
  • 写到 SNS 话题

我可以从文档中看到无服务器具有以下本地选项:-

  • S3
  • 动态数据库
  • SNS 事件入站

如果有以下解决方案,则不明显:-

  • API 网关本地支持 python lambdas
  • 写入 SQS
  • 写入 SNS

我可以从 SAM 文档中看到,可以针对本地 DynamoDB 测试 python Lambdas。不清楚还有什么可能,或者您是否必须将其指向一个实际的 AWS 实例(S3、SQS 等)

任何指针?

amazon-web-services aws-sam-cli serverless

6
推荐指数
1
解决办法
2890
查看次数

API Gateway 无服务器 Lambda 集成“不支持的媒体类型”

我正在使用无服务器部署我的 API,使用 lambda 集成,我收到错误“不支持的媒体类型”。我在这里做错了什么,但不确定是什么。如果我在 AWS 控制台中手动设置它,它工作得很好,但我想在无服务器中进行。下面是我的 serverless.yml 的一个片段,一个我希望它在部署后看起来像的屏幕截图,以及我的 serverless.yml 的当前外观的屏幕截图。

    events:
  - http:
      path: /path
      method: post
      integration: lambda
Run Code Online (Sandbox Code Playgroud)

AWS 控制台中的集成响应和方法响应当前的样子:

在此处输入图片说明

我希望它们看起来像什么:

在此处输入图片说明

基本上,集成响应 HTTP 状态模式和方法响应模型需要包含在 serverless.yml 中,但我还没有找到正确的配置。它们根本没有包含在我的示例中,因为我不知道要放入哪个失败的示例。文档使它看起来相当简单,但到目前为止我的所有尝试都没有得到我想要的结果。

amazon-web-services aws-api-gateway serverless-framework serverless

6
推荐指数
0
解决办法
828
查看次数

无服务器应用程序中的缓存失效

我正在尝试使用 AWS lambda、API 网关和 Dynamo 作为数据存储来实现具有 GET 和 PUT API 的用户服务

GET API 将获取给定 userId 的数据,PUT 将更新给定 userId 的用户详细信息

我的要求是

  • 由于 GET API 的吞吐量很大,我需要缓存 API 响应,以便减少后续请求中的响应时间。缓存还需要有一个 TTL。

  • 对同一个 userId 的任何成功 put 请求都会使缓存无效,随后的 GET 请求将从 DB 中获取并再次缓存它

  • 我可能会使用 redis 集群进行缓存。但这可能会增加额外的 VPC 调用开销

题:

  • 我正在使用 AWS lambda 使用无服务器框架进行实现。我应该如何设计缓存层?
  • 可能的解决方案包括 API 网关缓存 - 但在这种方法中,我将如何在更新请求的情况下使缓存无效

amazon-dynamodb aws-lambda aws-api-gateway serverless-framework serverless

6
推荐指数
1
解决办法
2072
查看次数

API 网关,被 CORS 策略阻止:没有“Access-Control-Allow-Origin”标头

我知道这个问题可能会重复,但是现有的问题都没有指向我没有做的任何事情......

我已经使用无服务器框架部署了一个 API,但是我在使用 CORS 时遇到了问题。

我正在使用 axios 执行 get 请求:

axios.get('https://test.execute-api.us-west-1.amazonaws.com/dev/test?from=2012-01-09T21:40:00Z')
     .then(response => {
       this.data = response.data;
     })
     .catch(error => console.log(error))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Access to XMLHttpRequest at 'https://test.execute-api.us-west-1.amazonaws.com/dev/test?from=2012-01-09T21:40:00Z' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Run Code Online (Sandbox Code Playgroud)

我已经做了什么:

  • 确保 API Gateway 中有一个 OPTIONS 方法,其方法响应如下所示:

在此处输入图片说明

  • 确保我部署了这些更改。

此外,我的 Lambda 函数的响应返回以下标头:

return events.APIGatewayProxyResponse{
    StatusCode: http.StatusOK,
    Headers: map[string]string{
        "Access-Control-Allow-Origin":      "http://localhost:8080",
        "Access-Control-Allow-Credentials": "true",
    },
    Body: string(jsonEvents),
}, nil
Run Code Online (Sandbox Code Playgroud)

我也尝试设置Access-Control-Allow-Origin'*'

我的 serverless.yml 文件cors: true …

go aws-api-gateway serverless

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

如何使用无服务器框架中的多个路径参数

我正在尝试部署我的无服务器应用程序。但是有如下问题。

An error occurred: ApiGatewayResourceServicesServiceidVar - A sibling ({id}) of this resource already has a variable path part -- only one is allowed  
Run Code Online (Sandbox Code Playgroud)

下面是我的代码。

updateApplication:
    handler: handler.updateApplication
    memorySize: 3008
    description: Update application
    timeout: 30
    events:
      - http:
          path: services/{serviceId}/applications/{applicationId}
          method: post
          cors: true
          authorizer: authorize
          request:
            parameters:
              paths:
                serviceId: true
                applicationId: true
Run Code Online (Sandbox Code Playgroud)

任何意见或建议将不胜感激。先感谢您。

aws-lambda serverless

6
推荐指数
1
解决办法
4221
查看次数

如何将 NODE_EXTRA_CA_CERTS 的值传递给使用无服务器部署的 AWS Lambda?

我正在使用Serverless部署 Node AWS Lambda。由于运行此代码的机构的内部要求,我需要通过额外的证书。我能找到的唯一解决方案是将NODE_EXTRA_CA_CERTS作为 CLI 参数传递。使用典型的环境变量(例如在dotenv定义)不起作用,因为此时在 Node 中已经配置了证书。

我的额外证书位于MyCerts.pem项目根目录中,我尝试运行的 Lambda 函数称为function1. 在本地运行 LambdaNODE_EXTRA_CA_CERTS=./MyCerts.pem npx serverless invoke local -f function1 -l可以正常工作。但是,一旦我使用 部署到 AWS npx serverless deploy -v,我就找不到正确包含这些附加证书的方法,包括使用NODE_EXTRA_CA_CERTS=./MyCerts.pem npx serverless invoke -f function1 -l.

我已经尝试了所有我能想到的方法并且不知所措。有人可以帮忙吗?

ssl-certificate amazon-web-services node.js aws-lambda serverless

6
推荐指数
1
解决办法
1713
查看次数

Lambda 会收到已消费的 SQS 消息吗?

我有这样的系统设计

SQS -> 触发器 -> Lambda -> 如果失败 -> DLQ

前提条件

  1. Lambda 函数使用 try catch 块,它不会抛出任何错误。
  2. Lambda 函数永远不会耗尽内存或超时。(来自 Lambda 监控)
  3. Lambda 监控中的错误计数为 0
  4. 切勿使用 SQS 控制台查看消息
  5. Lambda SQS batchSize 设置为 1
  6. DLQ 最大接收设置为 1
  7. Lambda 调用大约 60k

跑了一会后

  1. 我们在 DLQ 中发现了一些消息
  2. DLQ 中的消息具有属性 ApproximateReceiveCount 为 2 或更大。

这是预期的吗?

在我看来,如果 Lambda 中没有错误抛出,DLQ 消息应该始终为零。

amazon-sqs node.js aws-lambda serverless

6
推荐指数
1
解决办法
242
查看次数

AWS - 在 SNS 订阅或 Lambda 函数上设置死信队列有什么区别?

在 SNS 主题或 Lambda 函数上设置死信队列有什么区别?

我想知道,因为如果您在 SNS 订阅上设置 DLQ,那么当 Lambda(订阅者)失败时,该订阅消息将故障转移到 DLQ,对吗?那么在这种情况下,在这两个地方设置 DLQ 会产生相同的效果吗?

我在 SNS 主题订阅上设置了 DLQ,但它没有“自动”显示为 Lambda 屏幕设置上的 DLQ,所以我认为可能存在一些差异?

SNS 死信队列参考:https : //docs.aws.amazon.com/sns/latest/dg/sns-dead-letter-queues.html

通常,当 Amazon SNS 由于客户端或服务器端错误而无法访问订阅的终端节点时,消息传送会失败。

Lambda 死信队列参考:https : //aws.amazon.com/about-aws/whats-new/2016/12/aws-lambda-supports-dead-letter-queues/

在标准重试策略(失败时额外重试 2 次)用完后,AWS Lambda 会将调用 Lambda 函数的事件对象写入此 [DLQ] 端点。

拉姆达:

拉姆达 dlq

SNS订阅:

在此处输入图片说明

amazon-web-services dead-letter amazon-sns aws-lambda serverless

6
推荐指数
1
解决办法
1493
查看次数