我是无服务器和 AWS SAM 的新手。我尝试为我的应用程序的新 lambda 函数和 api 网关创建 template.yaml,并使用 AWS SAM 部署到 AWS。效果很好。但我的问题是,对于每次部署,我们都必须创建新的云形成堆栈,但是有没有一种方法可以更新函数的各个 lambda 代码,而无需使用 AWS SAM 部署整个堆栈?
我也检查了无服务器框架,我们可以使用下面的命令单独部署 lambda 函数,而无需创建新的堆栈 无服务器部署函数 -f functionName
使用 SAM 是否有这样的灵活性?我确实检查了 SAM CLI,它提供了用于测试 api 和 lambda 函数的本地环境,但没有看到任何单独的 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) 我有一个无服务器的 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
我运行 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之前运行过,仍然遇到同样的错误。
免责声明:我承认这更像是一个广泛的最佳实践问题,而不是一个特定的编程问题,但是,我相信 SO 群是它的最佳受众。我知道这个类似的问题(我应该在无服务器应用程序中使用 Express.js 吗?),但答案似乎没有回答我的问题。
出于典型原因,我想将 Express.js 从 AWS Lightsail/EC2 迁移到无服务器,而 Lambda 是我的首选武器。但是,将整个框架连同其上的应用程序一起视为函数可能有点笨重,因此可能不适合在 AWS Lambda 或 Google/Azure Functions 上运行。虽然我确信这是可行的,但这是个好主意吗?这种设置不会降低效率并使处理诸如会话状态之类的事情变得复杂,最终会破坏无服务器功能的目的吗?
express aws-lambda azure-functions serverless aws-serverless
我正在尝试使用 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) 所以我在无服务器部署过程中遇到了这个问题:
\nServerlessError: An error occurred: MyDdbTable - Cannot perform more than one GSI creation or deletion in a single update.\nRun 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
我正在使用 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 分钟来构建每个代码更改。我可以只处理 …
我的目标是使用层在我们的几个 lambda 函数之间共享库代码,并能够在本地调试和运行测试。
npm 能够从本地文件系统安装依赖项。当我们更改库代码时,我们希望该库的所有用户都能获取更新的代码,而无需设置专用的 npm 服务器。我可以使用相对路径在本地进行调试,但那是在我涉及sam build.
sam build在存储库的根目录创建一个隐藏文件夹并构建该文件夹并最终运行npm install,但是这次文件夹结构不同。文件中使用的相对路径package.json现在已损坏。我们不能使用显式路径,因为我们的存储库位于用户文件夹下,这当然对于不同的开发人员来说是不同的。
这就是我所做的:
我使用创建了一个项目sam init,并采用了项目的默认值(除了 的名称sam-app-2)nodejs 12.x(选项1和1)。
该命令创建了一个名为 的文件夹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(包含 …
我们使用无服务器架构以及 AWS Lambda 和 API 网关。lambda 的执行时间在几毫秒范围内。客户端的最终响应在几秒钟内收到(这远远超过了 lambda 的执行时间,即使考虑到冷启动场景也考虑了 init 持续时间)。
\n在使用 API 网关日志进行调试时,会出现以秒为单位的集成延迟,这使得端到端响应相当慢。为了消除初始化持续时间或冷启动,我在 CloudWatch 中添加了规则,用于定期调用 lambda 以使它们保持温暖。
\n初始化持续时间被完全删除,这也有助于减少集成延迟。有些 Lambda 无法安排,因为调用它们需要身份验证,为此我添加了 5 的预配置并发。
\n该 Lambda 在日志中也有初始化持续时间。Lambda 配置是消除冷启动的另一种选择,但这不会对 API 网关上 Lambda 响应可用的时间产生影响。
\n我已按照以下链接将预配置并发分配给 Lambda:
\n\n我添加了配置的 Lambda 的 CloudWatch 日志:
\nDuration: 1331.38 ms Billed Duration: 1332 ms Memory Size: 256 MB Max Memory Used: 130 MB Init Duration: 1174.18 ms
我在 …
aws-serverless ×10
aws-lambda ×5
serverless ×4
aws-sam ×2
aws-sam-cli ×1
docker ×1
express ×1
javascript ×1
node.js ×1
npm ×1