标签: aws-lambda

AWS - 想要将多个文件上传到 S3,并且只有当所有文件都上传时才会触发 lambda 函数

我正在寻求有关设计此最佳方式的建议-

用例

我想将多个文件放入 S3。成功保存所有文件后,我想触发一个 lambda 函数来做一些其他工作。

天真的方法

我解决这个问题的方法是在 Dynamo 中保存一条记录,其中包含一个唯一标识符和我将上传的记录总数以及应该存在于 S3 中的密钥。

一个基本的实现是采用我现有的 lambda 函数,该函数在我的 S3 存储桶写入时调用,并让它手动检查是否所有其他文件都已保存。

Lambda 函数会知道(查看 Dynamo 以确定我们要查找的内容)并查询 S3 以查看其他文件是否在其中。如果是,请使用 SNS 触发我的另一个 lambda 来执行其他工作。

编辑:另一种方法是让我将文件放在 S3 中的客户端程序负责直接调用另一个 lambda 函数,因为从技术上讲,它知道所有文件何时上传。这种方法的问题是我不希望这是客户端程序的责任......我希望客户端程序不在乎。一旦它上传了文件,它应该能够退出。

想法

我不认为这是一个好主意。主要是因为 Lambda 函数应该是轻量级的,并且从 Lambda 函数内轮询数据库以获取所有上传文件的 S3 密钥,然后检查 S3 是否存在 - 每次都这样做似乎是贫民窟并且非常重复。

什么是更好的方法?我正在考虑使用 SWF 之类的东西,但不确定这对我的解决方案来说是否太过分了,或者它是否能让我做我想做的事。该文档也没有显示真正的“示例”。这只是一个讨论,没有太多的分步指南(也许我找错了地方)。

编辑回应以下 mbaird 的建议-

选项 1 (SNS)这就是我会去的。这很简单,并没有真正违反单一职责原则。也就是说,客户端上传文件并发送通知(通过 SNS)表明其工作已完成。

选项 2(Dynamo 流)因此,这本质上是选项 1 的另一个“实现”。客户端进行服务调用,在这种情况下,这会导致表更新与 SNS 通知(选项 1)。此更新将触发 Lambda 函数,而不是通知。不错的解决方案,但我更喜欢使用 SNS 进行通信,而不是依赖数据库的功能(在本例中为 Dynamo 流)来调用 Lambda 函数。

在任何情况下,我都在使用 AWS 技术并与他们的产品(Lambda 函数、SNS 等)耦合,但我觉得依赖于 Dynamo 流之类的东西使其耦合更加紧密。对我的用例来说并不是一个很大的问题,但仍然感觉很脏;D …

amazon-s3 amazon-web-services amazon-swf aws-lambda

10
推荐指数
1
解决办法
4148
查看次数

如何在 lambda 中使用 axios?

我是否必须在本地安装 axios 模块,然后将其部署到 lambda,或者有没有办法通过内联代码编辑器以及在浏览器中执行此操作?

amazon-web-services alexa aws-lambda alexa-skills-kit axios

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

在创建 lambda 之前 Terraform 执行脚本

我有一个 terraform 配置,可以在 aws 上正确创建一个 lambda 函数,并提供一个 zip 文件。

我的问题是我总是必须先打包 lambda(为此我使用无服务器打包方法),所以我想执行一个脚本来打包我的函数并将 zip 移动到正确的目录,然后 terraform 创建 lambda 函数。

那可能吗?也许使用 null_resource 和 local-exec 的组合?

aws-lambda terraform

10
推荐指数
1
解决办法
3323
查看次数

AWS Lambda:处理程序外部的异步调用(初始化部分,调用 lambda)

我想通过以下代码在 lambda 处理程序之外调用异步函数:

var client;
(async () => {
    var result =  await initSecrets("MyWebApi");
    var secret = JSON.parse(result.Payload);
    client= new MyWebApiClient(secret.API_KEY, secret.API_SECRET); 
});

async function initSecrets(secretName) {
    var input = {
    "secretName" : secretName
    };
    var result = await lambda.invoke({
       FunctionName: 'getSecrets',
       InvocationType: "RequestResponse",
       Payload: JSON.stringify(input)
    }).promise();
    return result;
}

exports.handler = async function (event, context) {

    var myReq = await client('Request');
    console.log(myReq);
};
Run Code Online (Sandbox Code Playgroud)

“客户端”未初始化。如果在处理程序中执行,相同的代码可以完美运行。initSecrets 包含 getSecrets() 的 lambda 调用,它调用 AWS SecretsManager 有谁知道如何在处理程序外部正确调用异步函数以进行初始化?

非常感谢您的支持。

asynchronous initialization async-await aws-lambda aws-secrets-manager

10
推荐指数
1
解决办法
2217
查看次数

DynamoDB BatchWriteItem:提供的项目键列表包含重复项

我正在尝试使用 DynamoDB 操作BatchWriteItem,其中我想将多条记录插入到一个表中。

该表有一个分区键和一个排序键。

我正在使用 AWS lambda 和 Go 语言。

我将元素插入到切片中。

我正在遵循这个程序。

  1. 创建PutRequest结构并为列表中的第一条记录添加 AttributeValues。

  2. 我正在创造WriteRequest这个PutRequest

  3. 我将此添加WriteRequest到array of WriteRequests

  4. 我正在创建BatchWriteItemInput它由 组成RequestItems,它基本上是一个Tablename的映射和WriteRequests.

之后,我调用BatchWriteItem,这会导致错误 - 提供的项目键列表包含重复项。

任何指针,为什么会发生这种情况?

amazon-web-services amazon-dynamodb aws-lambda

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

CloudWatch Insights:获取错误 lambda 的日志

一个 lambda 可以有一个成功或错误的结果。

我想查看错误的 lambda 日志。我正在尝试通过 CloudWatch Insights 查询来做到这一点。

我怎样才能做到这一点?

amazon-cloudwatch aws-lambda amazon-cloudwatchlogs aws-cloudwatch-log-insights

10
推荐指数
3
解决办法
6112
查看次数

将 firebase 添加到应用程序和服务器时的 initializeApp

我将 firebase 用于 auth 和 db,并将 AWS lambda 用于云函数。

要将 firebase 添加到我的 JS 项目中,我initializeApp将 firebase 配置作为参数,如下所述:https : //firebase.google.com/docs/web/setup。

如此处所述:https : //firebase.google.com/docs/admin/setup,我还需要initializeApp在我的 lambda 函数中。

如下:

const admin = require('firebase-admin');
const serviceAccount = require('../path/to/service-account.json');

const firebaseAdmin = admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "dB_URL"
});
Run Code Online (Sandbox Code Playgroud)

凭据来自 firebase-admin 库,因此我无法将其添加到我的 web firebase 配置中。所以,我需要初始化两次。

但是,如果我这样做,服务器将抛出错误:

默认 Firebase 应用已存在。这意味着您多次调用 initializeApp() 而不提供应用程序名称作为第二个参数。在大多数情况下,您只需要调用 initializeApp() 一次。但如果您确实想初始化多个应用程序,请将第二个参数传递给 initializeApp() 以给每个应用程序一个唯一的名称。

我在这里错过了什么吗?最佳做法是什么?我糊涂了。

之前有人遇到过同样的问题:使用 Firebase SDK 和 Netlify Lambda 函数

对该用户有用的是使用此处记录的 REST API:https : //firebase.google.com/docs/projects/api/workflow_set-up-and-manage-project …

node.js firebase aws-lambda firebase-admin

10
推荐指数
2
解决办法
8696
查看次数

如何将 next.js 9 部署到 aws lambda

我正在使用 next.js9 开发一个项目。我有一些问题和疑问。我想将我的 next.js 9 项目部署到 AWS lambda。

  1. 官方 next.js 9 文档告诉我“页面目录中的每个页面都变成了无服务器 lambda。” 上面的库不像文档那样工作。如何从每个页面部署到每个 lambda?

  2. 什么是合理的部署方案?请在生产级别使用nextjs 9的人帮助我。

  3. 我正在使用这个库https://github.com/danielcondemarin/serverless-next.js。它运行良好。但所有选项都是固定的。我想将我的项目部署到东京地区。但我不知道如何更改区域。始终部署到弗吉尼亚北部地区。我已经检查过 doc 但我认为他们没有选择。并像这个 yml 文件一样进行测试。

无服务器.yml

myNextApplication:
  component: serverless-next.js
region: ap-northeast-1
Run Code Online (Sandbox Code Playgroud)

但它不起作用。如果有人知道如何使用 serverless-next.js 更改区域。请帮我。

先感谢您

deployment reactjs aws-lambda next.js

10
推荐指数
3
解决办法
7607
查看次数

AWS CDK 如何根据 OpenApi 规范创建由 Lambda 支持的 API 网关?

我想使用 AWS CDK 来定义 API 网关和 APIG 将代理到的 lambda。

OpenAPI 规范支持x-amazon-apigateway-integration对 Swagger 规范的自定义扩展(在此处详细说明),为此需要 lambda 的调用 URL。如果 lambda 定义在与 API 相同的堆栈中,我在 OpenAPI 规范中看不到如何提供它。我能想到的最好的方法是使用 lambda 定义一个堆栈,然后从中获取输出并运行sed以在 OpenAPI 规范中执行查找和替换以插入 uri,然后使用此修改创建第二个堆栈OpenAPI 规范。

例子:

  /items:
    post:
      x-amazon-apigateway-integration:
        uri: "arn:aws:apigateway:eu-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:eu-west-2:123456789012:function:MyStack-SingletonLambda4677ac3018fa48679f6-B1OYQ50UIVWJ/invocations"
        passthroughBehavior: "when_no_match"
        httpMethod: "POST"
        type: "aws_proxy"

Run Code Online (Sandbox Code Playgroud)

一季度。这似乎是一个鸡与蛋的问题,以上是唯一的方法吗?

我尝试使用SpecRestApi CDK 构造的defaultIntegration属性。该文件指出:

除非指定了集成,否则用作此 API 中创建的所有方法的默认值的集成。

这似乎应该能够使用 CDK 规范中定义的 lambda 定义默认集成,因此所有方法都使用此集成,而无需提前知道 lambda 的 uri。

因此我试过这个:

SingletonFunction myLambda = ...

SpecRestApi openapiRestApi = SpecRestApi.Builder.create(this, "MyApi")
                        .restApiName("MyApi")
                        .apiDefinition(ApiDefinition.fromAsset("openapi.yaml"))
                        .defaultIntegration(LambdaIntegration.Builder.create(myLambda)
                                    .proxy(false)
                                    .build())
                        .deploy(true) …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services swagger aws-lambda aws-api-gateway openapi

10
推荐指数
2
解决办法
4979
查看次数

如何使用 TypeScript 编写的 API Gateway 在 VS Code 中调试本地 AWS Lambda 函数?

我们即将开始使用 Lambda 函数。
我们有必须使用 TypeScript 的技术限制。
当从 Postman 调用相关端点时,我希望能够在 VS Code 中调试我的 ts 文件。

所以,我们有以下开发环境:

  • 视窗 10
  • Docker for Windows(使用 Hyper-V 而不是 WSL 2)
  • 打字稿 4.1
  • 节点 12.17
  • SAM CLI 1.13.2

我已经使用sam initHello World 模板来生成初始文件夹结构。
我已经对其进行了增强(主要基于本文)以使用 TypeScript。

文件夹结构

.
??? template.yaml
??? .aws-sam
??? .vscode
|   ??? launch.json
??? events
??? hello-world
|   ??? dist
|       ??? app.js
|       ??? app.js.map
|   ??? src  
|       ??? app.ts
|   ??? package.json
|   ??? tsconfig.json
Run Code Online (Sandbox Code Playgroud)

template.yaml

.
??? …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services node.js typescript aws-lambda aws-sam-cli

10
推荐指数
2
解决办法
2233
查看次数