问题标签 [aws-sam]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1454 浏览

node.js - 我应该如何使用 NodeJS 在 AWS Lambda 上处理 node_modules?

我已经开始AWS Lambda用于一个小型网站。我将有大约 10-15 个 lambdas 连接到不同的触发器(API、SQS 等)

我们将AWS SAM用于创建我们的堆栈和NodeJS大多数 lambda 方法。

我进行了很多搜索以找到 node_modules 的最佳实践,但无法真正得出结论。大多数提议的解决方案都包括层,我无法真正理解我应该如何构建这些层以及它们如何与本地测试一起工作。

问题:

  1. “按原样”使用 node_modules 和将 node_modules 目录转换为层之间有什么区别?它会有益于性能吗?只有在加载冷 lambda 时才会受益吗?

  2. 如果层是解决方案,我是否应该为所有 lambda 使用一层(例如,某种 CI 脚本会在部署前“合并”它们)?或者使用所有 lambdas 中所有相同的 node_module 版本创建一个单一存储库解决方案?这似乎有点不干净,但我在寻找最佳解决方案时看到了这样的建议。

我正在寻找一个不会损害性能的体面解决方案,以及一个在本地工作并在部署代码之前测试我们的代码的选项。

0 投票
2 回答
760 浏览

amazon-web-services - AWS CodePipeline - 在 CloudFormation 中部署:操作执行失败需要功能:[CAPABILITY_AUTO_EXPAND]

我刚刚开始使用 AWS CI/CD 管道。我想制作一个简单的管道来部署 lambda 函数(以及后来的 api 网关):

在 CodeCommit 中提交 -> 在 CodeBuild 中准备 CloudFormation 包 -> 部署到 CloudFormation

CodeCommit 和 CodeBuild 工作得很好,但在部署阶段(在 CodePipeline 中)我总是收到此错误:

CodePipeline 错误

但在 UI 中,我无法选择 CAPABILITY_AUTO_EXPAND,只能选择 CAPABILITY_IAM,这并不能解决问题:

CodePipeline 部署配置

如果我通过 CLI 进行部署,我想我可以设置 CAPABILITY_AUTO_EXPAND 选项,但我想通过 UI 进行。

我能做些什么?

SAM 模板 yaml:

0 投票
3 回答
9161 浏览

amazon-web-services - 部署 SAM 教程应用程序时找不到需求文件

我想开始使用 aws-sam 在本地测试我的 lambda。我尝试了来自https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-quick-start.html的教程

我创建了示例应用程序sam init --runtime python3.6 ,然后当我这样做时, sam build --use-container我得到了这个奇怪的异常,它无法获取 requirements.txt。我应该怎么办 ?我使用 pyhon 3.7.2

0 投票
0 回答
157 浏览

aws-sam - 如何获取给定已部署资源的资源 ID?

我们创建了一个“AWS::Serverless::Function”,路径为“/customers”,方法为“GET”。

我们现在正在尝试使用路径“/customers”和方法“OPTIONS”创建一个“AWS::ApiGateway::Method”

我们可以通过手动使用 /customers 的 API ID 和资源 ID 来做到这一点。但是,我们不想对这些 ID 进行硬编码。

我们可以使用“${ServerlessRestApi}”获取 RestApiId,使用“${ServerlessRestApi.RootResourceId}”获取根 (/) 资源 ID,但是我们需要 /customers 而不是 /。

我们需要将 ${ServerlessRestApi.RootResourceId} (/) 更改为 ${ServerlessRestApi.CustomersId} (/customers)。

0 投票
2 回答
3465 浏览

amazon-web-services - 如何对使用层方法的 lambda 逻辑进行单元测试?

嗨,我有我的 AWS Lambda,我想给它添加一个层。我希望能够只测试 lambda 的单一方法。然而,他们中的许多人使用层逻辑,因此在我看来并不容易。这样做的最佳方法是什么?

一种方法是打包层,主机在某处并将其用作依赖项。在那种情况下,为什么还要费心使用图层?

我的另一个想法是使用 sam-cli 在本地部署 lambda。我知道如何使用它来测试整个 lambda 逻辑,但我看不到如何单独对方法进行单元测试;/你有什么经验?韩国

编辑。我的解决方案

  • 添加 pytest

  • 将所有测试放在test目录中

  • 添加调用测试的测试 lambda 处理程序

import pytest def lambda_handler(event, _): res = pytest.main(['-x', './tests']) return res

  • 添加指向先前创建的 lambda 处理程序的 template.yml

Resources: MyFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: src/ Handler: test.lambda_handler Runtime: python3.6 Events: MyInfo: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /my-service/test Method: get Environment: Variables: ELASTICSEARCH_DOC_TYPE: "article" ELASTICSEARCH_INDEX: "artilces" ELASTICSEARCH_HOST: "elastic" ELASTICSEARCH_PORT: "9200" ELASTICSEARCH_URL: "http://my_elastic.com:9200" Layers: - arn:aws:lambda:eu-west-1:XXXXXXXXXXXXX:layer:lambda_layer:37

  • sam local invoke --no-event
0 投票
2 回答
2717 浏览

amazon-rds - 本地运行SAM时如何连接RDS实例?

我正在使用 SAM(无服务器应用程序模型)在本地测试连接到云中 Aurora RDS 实例的 Lambda 函数。

使用以下命令:

Lambda 函数正在执行,但在返回 SQL 结果时,它返回 null 作为输出。

如何配置 Docker 容器以与 RDS 实例通信?

0 投票
1 回答
1700 浏览

amazon-web-services - 使用 SAM 创建 API 密钥和使用计划

我正在学习 AWS SAM,但无法找到有关如何通过 SAM 模板创建 API 密钥和使用计划的信息。

我想创建一个 API 密钥并将其与上面指定的“GetFamilyByIdApi”的使用计划相关联。任何帮助,将不胜感激。

0 投票
1 回答
1427 浏览

aws-lambda - SAM 模板“无效的模板属性或属性 [MyApi]”

运行 CLI 命令 aws cloudformation deploy 后出现以下错误(在 sam 包之后)

“创建变更集失败:Waiter ChangeSetCreateComplete 失败:Waiter 遇到终端故障状态状态:FAILED。原因:无效的模板属性或属性 [MyApi]”

这是模板。我无法获得有关哪个是无效属性的信息。这可能吗?否则这个模板有什么问题?

0 投票
1 回答
637 浏览

amazon-web-services - SAM 模板 - 始终为 lambda 启用事件触发器

我有一个使用 SAM 模板创建的 lambda 函数,该函数每 5 分钟安排一次事件触发器。

当第一次创建 lambda 时,事件被启用。但是,当有人手动禁用触发器时,重新运行堆栈不会再次启用它。

原生云形成有一个名为AWS::Events::RuleState的属性。但这在 SAM 函数的 Events 属性中不受支持。请注意,此 Events 属性由 SAM 引擎转换为 AWS::Events::Rule。

我尝试在 SAM 中添加相同的 State 属性,但这不起作用。

现在的问题实际上是如何确保在使用 SAM 时始终启用事件。

这有一个黑客可用。

示例代码:

提前致谢

0 投票
1 回答
1955 浏览

aws-lambda - API 名称始终是 SAM 中的堆栈名称

我正在使用 AWS CLI 部署 SAM 模板。

AWS Api 名称设置为与 CloudFormation 堆栈名称相同。根据下面的模板内容,我希望 Api 被称为“用户”。

是否可以设置 API 名称?

SAM 模板:

更新附加信息(用于部署的完整模板和 AWS CLI 命令):

模板:

CLI 命令: