标签: aws-serverless

AWS SAM - 我们可以在不部署整个堆栈的情况下为单个函数部署代码吗?

我是无服务器和 AWS SAM 的新手。我尝试为我的应用程序的新 lambda 函数和 api 网关创建 template.yaml,并使用 AWS SAM 部署到 AWS。效果很好。但我的问题是,对于每次部署,我们都必须创建新的云形成堆栈,但是有没有一种方法可以更新函数的各个 lambda 代码,而无需使用 AWS SAM 部署整个堆栈?

我也检查了无服务器框架,我们可以使用下面的命令单独部署 lambda 函数,而无需创建新的堆栈 无服务器部署函数 -f functionName

使用 SAM 是否有这样的灵活性?我确实检查了 SAM CLI,它提供了用于测试 api 和 lambda 函数的本地环境,但没有看到任何单独的 lambda 部署函数。有人可以帮我吗?

amazon-web-services aws-serverless aws-sam

8
推荐指数
0
解决办法
3414
查看次数

无服务器 - Lambda 层“找不到模块‘请求’”

当我使用以下方法部署我的无服务器 API 时:

serverless deploy
Run Code Online (Sandbox Code Playgroud)

lambda 层已创建,但是当我运行该函数时,出现此错误:

"Cannot find module 'request'"
Run Code Online (Sandbox Code Playgroud)

但是,如果我通过控制台手动上传 .zip 文件(部署时上传的完全相同的文件),它工作正常。

任何人都知道为什么会发生这种情况?

environment:
SLS_DEBUG: "*"

provider:
name: aws
runtime: nodejs8.10
stage: ${opt:api-type, 'uat'}-${opt:api, 'payment'}
region: ca-central-1
timeout: 30
memorySize: 128
role: ${file(config/prod.env.json):ROLE}
vpc:
    securityGroupIds:
    - ${file(config/prod.env.json):SECURITY_GROUP}
    subnetIds:
    - ${file(config/prod.env.json):SUBNET}
apiGateway:
    apiKeySourceType: HEADER
apiKeys:
    - ${file(config/${opt:api-type, 'uat'}.env.json):${opt:api, "payment"}-APIKEY}

functions:
- '${file(src/handlers/${opt:api, "payment"}.serverless.yml)}'

package:
# individually: true
exclude:
    - node_modules/**
    - nodejs/**

plugins:
- serverless-offline
- serverless-plugin-warmup
- serverless-content-encoding

custom:
contentEncoding:
    minimumCompressionSize: 0 # Minimum body size required for …
Run Code Online (Sandbox Code Playgroud)

aws-lambda serverless-framework aws-serverless

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

无服务器:通过调用方法触发并忘记无法正常工作

我有一个无服务器的 lambda函数,在其中我想触发(调用)一个方法而忘记它

我用这种方式做

   // myFunction1
   const params = {
    FunctionName: "myLambdaPath-myFunction2", 
    InvocationType: "Event", 
    Payload: JSON.stringify(body), 
   };

   console.log('invoking lambda function2'); // Able to log this line
   lambda.invoke(params, function(err, data) {
      if (err) {
        console.error(err, err.stack);
      } else {
        console.log(data);
      }
    });


  // my function2 handler
  myFunction2 = (event) => {
   console.log('does not come here') // Not able to log this line
  }
Run Code Online (Sandbox Code Playgroud)

我注意到,直到并且除非我执行Promise returnin myFunction1,否则它不会触发myFunction2,但是不应该设置lambda InvocationType = "Event"意味着我们希望此操作被触发并忘记并且不关心回调响应吗?

我在这里想念什么吗?

非常感谢您的帮助。

javascript aws-lambda serverless aws-lambda-edge aws-serverless

8
推荐指数
1
解决办法
68
查看次数

AWS SAM:构建失败错误:Docker 无法访问。Docker 需要运行才能在容器内构建

我运行 AWS SAM 并使用sam build --use-container然后出现以下错误。

Starting Build inside a container Building function 'SamTutorialFunction Build Failed Error: Docker is unreachable. Docker needs to be running to build inside a container

sudo service docker start之前运行过,仍然遇到同样的错误。

amazon-web-services docker aws-lambda aws-serverless

8
推荐指数
2
解决办法
9592
查看次数

Express.js 应用程序无服务器,使用 Lambda 或函数 - 一个好主意?

免责声明:我承认这更像是一个广泛的最佳实践问题,而不是一个特定的编程问题,但是,我相信 SO 群是它的最佳受众。我知道这个类似的问题(我应该在无服务器应用程序中使用 Express.js 吗?),但答案似乎没有回答我的问题。

出于典型原因,我想将 Express.js 从 AWS Lightsail/EC2 迁移到无服务器,而 Lambda 是我的首选武器。但是,将整个框架连同其上的应用程序一起视为函数可能有点笨重,因此可能不适合在 AWS Lambda 或 Google/Azure Functions 上运行。虽然我确信这是可行的,但这是个好主意吗?这种设置不会降低效率并使处理诸如会话状态之类的事情变得复杂,最终会破坏无服务器功能的目的吗?

express aws-lambda azure-functions serverless aws-serverless

8
推荐指数
1
解决办法
1365
查看次数

无服务器错误 - 没有文件匹配包含/排除模式

我正在尝试使用 python 进行一些骨架部署。这是我的 serverless.yaml

我的文件夹结构是

serverless-test
|_lambdas
|____handler.py
|_layers
|____common
|_________somefunction.py
Run Code Online (Sandbox Code Playgroud)
service: serverless-test

frameworkVersion: '2'

provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221

  stage: test
  region: us-west-2

functions:
  hello:
    handler: lambdas/handler.hello
Run Code Online (Sandbox Code Playgroud)

这很好用。现在,一旦我添加图层,我就会收到以下错误

No file matches include / exclude patterns

service: serverless-test

frameworkVersion: '2'

provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221

  stage: test
  region: us-west-2

functions:
  hello:
    handler: lambdas/handler.hello
    layers:
      - {Ref: CommonLambdaLayer}

layers:
  common:
    path: layers/common
    name: common-module
    description: common set of functions
Run Code Online (Sandbox Code Playgroud)

我还尝试添加包含和排除模式。但这并没有解决我的问题

service: serverless-test

frameworkVersion: '2'

provider:
  name: aws …
Run Code Online (Sandbox Code Playgroud)

serverless-architecture serverless aws-serverless

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

AWS:无法在一次更新中执行多个 GSI 创建或删除

所以我在无服务器部署过程中遇到了这个问题:

\n
ServerlessError: An error occurred: MyDdbTable - Cannot perform more than one GSI creation or deletion in a single update.\n
Run Code Online (Sandbox Code Playgroud)\n

我的DDB表配置是这样的: \n serverless.yml中的配置

\n
      AttributeDefinitions:\n          - AttributeName: externalId\n            AttributeType: S\n          - AttributeName: code\n            AttributeType: S\n          - AttributeName: accountId\n            AttributeType: S\n        KeySchema:\n          - AttributeName: externalId\n            KeyType: HASH\n          - AttributeName: code\n            KeyType: RANGE\n        GlobalSecondaryIndexes:\n          - IndexName: gsi-account-id\n            KeySchema:\n              - AttributeName: accountId\n                KeyType: HASH\n              - AttributeName: code\n                KeyType: RANGE\n            Projection:\n              ProjectionType: ALL\n          - IndexName: externalId\n            KeySchema:\n              - AttributeName: externalId\n                KeyType: HASH\n …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-dynamodb serverless aws-serverless

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

每次更新代码时,使用 AWS SAM-CLI 都需要重建

我正在使用 SAM CLI 开发 API Gateway Lambda 代理集成。根据文档,我应该能够sam local start-api在本地测试我的端点。该start-api命令允许“热重新加载”,如AWS SAM 文档中所述。但是,我没有看到这种行为。

我的template.yaml文件如下所示:

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./hello_world
      DockerTag: python3.9-v1
Run Code Online (Sandbox Code Playgroud)

当我跑步时:

> sam build && sam local start-api
Run Code Online (Sandbox Code Playgroud)

我可以看到端点正在工作:

在http://127.0.0.1:3000/hello处安装 HelloWorldFunction
您现在可以浏览到上述端点来调用您的函数。您在使用功能时无需重新启动/重新加载 SAM CLI,更改将立即/自动反映。

lambda_handler但是,当我对内部的函数进行更改时./hello_world/app.py, 的响应curl http://localhost:3000保持不变。不会发生热重载。

我发现的唯一解决方案是针对每个代码更改运行sam build。这极大地减慢了开发时间——由于 内部的一些依赖关系requirements.txt,我必须等待 1-2 分钟来构建每个代码更改。我可以只处理 …

amazon-web-services aws-sam-cli aws-serverless aws-sam

8
推荐指数
2
解决办法
8556
查看次数

如何获取相对 package.json 依赖项以在 Windows 上使用 AWS 的 sam build 命令?

我的目标是使用层在我们的几个 lambda 函数之间共享库代码,并能够在本地调试和运行测试。

npm 能够从本地文件系统安装依赖项。当我们更改库代码时,我们希望该库的所有用户都能获取更新的代码,而无需设置专用的 npm 服务器。我可以使用相对路径在本地进行调试,但那是在我涉及sam build. sam build在存储库的根目录创建一个隐藏文件夹并构建该文件夹并最终运行npm install,但是这次文件夹结构不同。文件中使用的相对路径package.json现在已损坏。我们不能使用显式路径,因为我们的存储库位于用户文件夹下,这当然对于不同的开发人员来说是不同的。

这就是我所做的:

我使用创建了一个项目sam init,并采用了项目的默认值(除了 的名称sam-app-2nodejs 12.x(选项11)。

该命令创建了一个名为 的文件夹sam-app-2,它是以下所有文件名的引用。

我创建了一个dependencies/nodejs文件夹。

我添加dep.js到该文件夹​​:

exports.x = 'It works!!';
Run Code Online (Sandbox Code Playgroud)

我还添加package.json到同一文件夹:

{
  "name": "dep",
  "version": "1.0.0",
  "description": "",
  "main": "dep.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
Run Code Online (Sandbox Code Playgroud)

在 hello-world(包含 …

amazon-web-services node.js npm aws-serverless

7
推荐指数
2
解决办法
8940
查看次数

预配置并发对 Lambda 函数的响应时间影响较小

我们使用无服务器架构以及 AWS Lambda 和 API 网关。lambda 的执行时间在几毫秒范围内客户端的最终响应在几秒钟内收到(这远远超过了 lambda 的执行时间,即使考虑到冷启动场景也考虑了 init 持续时间)。

\n

在使用 API 网关日志进行调试时,会出现以秒为单位的集成延迟,这使得端到端响应相当慢。为了消除初始化持续时间或冷启动,我在 CloudWatch 中添加了规则,用于定期调用 lambda 以使它们保持温暖。

\n

初始化持续时间被完全删除,这也有助于减少集成延迟。有些 Lambda 无法安排,因为调用它们需要身份验证,为此我添加了 5 的预配置并发。

\n

该 Lambda 在日志中也有初始化持续时间。Lambda 配置是消除冷启动的另一种选择,但这不会对 API 网关上 Lambda 响应可用的时间产生影响。

\n

我已按照以下链接将预配置并发分配给 Lambda:

\n\n

我添加了配置的 Lambda 的 CloudWatch 日志:

\n

Duration: 1331.38 ms Billed Duration: 1332 ms Memory Size: 256 MB Max Memory Used: 130 MB Init Duration: 1174.18 ms

\n

我在 …

aws-lambda aws-api-gateway aws-serverless

7
推荐指数
1
解决办法
3247
查看次数