标签: aws-lambda

如何使用 aws-amplify 处理 api 错误?

我目前正在尝试使用aws-amplifyreact lib将数据发布到由 aws api-gateway 触发的 aws lambda 函数。

这是代码:

API.post("snippets","snippets/", {
        body: data,
    }).then(response => response).catch(console.log(err))
Run Code Online (Sandbox Code Playgroud)

在主要情况下,一切正常。

但是我的 lambda 函数旨在验证输入数据并返回一个状态代码400,返回的有效负载如下所示:

{
    "errors": [
        {
            "field": "title",
            "message": "This field is required"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想捕获这些错误以便在前端显示它们,但aws-amplify似乎有一个未记录的行为。

默认情况下,400返回的状态代码会抛出一条默认错误消息:

Error: Request failed with status code 400
    at createError (createError.js:16)
    at settle (settle.js:18)
    at XMLHttpRequest.handleLoad (xhr.js:77)
Run Code Online (Sandbox Code Playgroud)

有没有办法获得返回的有效载荷而不是这个神奇的错误?

amazon-web-services reactjs amazon-cognito aws-lambda aws-amplify

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

禁用 CloudWatch 以监控 Lambda 函数的日志

是否有任何可能的方法可以禁用 CloudWatch 来记录 Lambda 函数的事件?如果可能,那么执行此操作的步骤是什么。

amazon-web-services amazon-cloudwatch aws-lambda

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

防止pip安装某些依赖项

我们正在用 Python 为 Alexa 技能开发一个AWS Lambda函数,并pip用于将ask-sdk包安装到我们的dist/目录中:

pip install -t dist/ ask-sdk
Run Code Online (Sandbox Code Playgroud)

问题在于-t dist/因为pip想要在那里拥有所有依赖项,即使它们是在系统范围内安装的。

现在,ask-sdk依赖于boto3拉入大量其他软件包。但是,AWS Lambda运行时环境提供了boto3并且不需要将其及其依赖项与我们的代码打包在一起。我确实已经boto3安装在系统中并且import boto3可以正常工作,所以我认为pip应该很高兴,但因为-t dist/它总是安装它。

我可以以某种方式安装ask-sdk系统中不存在的只是及其依赖项,例如ask-sdk-core,而不是那些已经安装的依赖项吗?

一种方法是列出所有模块并使用,pip --no-deps但这意味着不断手动跟踪依赖项,我们希望避免这种情况。

不知何故我想告诉pip:如果已经安装了软件包,即使没有安装-t dist/也不要放入副本dist/.

那可能吗?

谢谢!

python pip aws-lambda

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

AWS Lambda NodeJS 连接到 RDS Postgres 数据库

我正在尝试测试我的 Lambda 和 RDS 实例之间的连接。我将它们都放在同一个私有子网上,所有端口都在安全组中打开。当我触发 Lambda 时,我确实看到在 RDS 实例上打开了一个连接。但是,Lambda 在 4 分 40 秒后超时。PG 环境变量在 Lambda 配置中设置。

const { Client } = require('pg');
const client = new Client();

var hello = [
  { name: 'test', description: 'testerface' }
];

exports.handler = async (event, context, callback) => {
    // Postgres Connect
    client.connect();
    const res = client.query('SELECT $1::text as message', ['Hello world!']);
    console.log(res);
    var response = {
        "statusCode": 200,
        "headers": {
            "Content-Type" : "application/json"
        },
        "body": JSON.stringify(hello),
        "isBase64Encoded": false
    };
    callback(null, response); …
Run Code Online (Sandbox Code Playgroud)

postgresql amazon-web-services node.js aws-lambda

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

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
查看次数

如何处理查询字符串 Node Js AWS Lambda

我正在使用 AWS Lambda 通过传递查询参数来创建获取 API,例如。vendorId,但在某些情况下,我需要完整的数据而不传递查询参数,在这种情况下,我的代码被破坏了。让我知道如何处理查询参数。

  var mysql=require('mysql'); //Require whatever connector you need.

  function getConnection()
   {
        var params={
           host     : 'myhostinfo',
           user     : 'myuser',
            password : 'mypwd',
           database : 'mydb'
    };

return mysql.createConnection(params);
}
      //This is your handler.
     exports.handler=function(event, context,callback)
    {

 //This is declared inside the handler: it is guaranteed to never be reused!.
   var connection=getConnection();
var fetchvendors="";


if(event.query.vendorid)
{   
    var vendorid=parseInt(event.query.vendorid);
    fetchvendors="SELECT v.*,c.vcategoryname FROM `tbl_vendors` v LEFT 
 OUTER JOIN tbl_demo_categories c ON v.vendorcatid=c.vcategoryid WHERE 
  v.vendorid="+vendorid;
}

else{
       fetchvendors="SELECT v.*,c.vcategoryname FROM …
Run Code Online (Sandbox Code Playgroud)

mysql node.js aws-lambda

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

不能在 Lambda 函数的模块外使用 import 语句

我创建了一个 lambda 函数来获取存储在 dynamodb 中的项目列表。然后我执行了 npm run build 命令,之后我得到了 .js 文件。我将 dist 内容与节点模块、webpack.config.js 和 package.json 一起压缩并上传。当我尝试对其进行测试时,出现以下错误。但据我检查,代码中没有错误。

{
  "errorType": "Runtime.UserCodeSyntaxError",
  "errorMessage": "SyntaxError: Cannot use import statement outside a module",
  "trace": [
    "Runtime.UserCodeSyntaxError: SyntaxError: Cannot use import statement outside a module",
    "    at _loadUserApp (/var/runtime/UserFunction.js:98:13)",
    "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
    "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
    "    at Module._compile (internal/modules/cjs/loader.js:956:30)",
    "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)",
    "    at Module.load (internal/modules/cjs/loader.js:812:32)",
    "    at Function.Module._load (internal/modules/cjs/loader.js:724:14)",
    "    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)",
    "    at internal/main/run_main_module.js:17:11"
  ]
}
Run Code Online (Sandbox Code Playgroud)

node.js aws-lambda

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

Python 中的 AWS Lambda:在 Lambda 函数处理程序中导入父包/目录

我在我的无服务器应用程序(避免混乱的最简单应用程序)中有一个类似于以下的目录结构,我使用 AWS SAM 和 Python 3.8 作为运行时创建了它:

??? common
?   ??? a.py
??? hello_world
?   ??? __init__.py
?   ??? app.py
?   ??? requirements.txt
??? template.yaml
Run Code Online (Sandbox Code Playgroud)

我想common/a.py在 Lambda 处理程序中导入模块 - hello_world/app.py。现在我知道我可以通过将路径添加到or来在 Python 中正常导入它,但是当代码在 Docker 容器内的 Lambda 中运行时它不起作用。调用时,Lambda 处理函数在目录内运行,不考虑文件夹结构。PYTHONPATHsys.path/var/task

我尝试插入/var/task/common, /var/common,/var甚至像这样/common以sys.path编程方式插入:

import sys
sys.path.insert(0, '/var/task/common')
from common.a import Alpha
Run Code Online (Sandbox Code Playgroud)

但我仍然收到错误:

ModuleNotFoundError: No module named 'common'

我知道Lambda 层,但鉴于我的场景,我想直接引用多个 Lambda 函数中的公共代码,而无需上传到层。我想serverless-python-requirements在无服务器框架中但在 …

python python-3.x aws-lambda aws-sam-cli aws-sam

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

通过链接 API 密钥、使用计划和 Cognito 构建可计费的 API

我一直在使用 AWS API Gateway、Lambda 和无服务器框架构建无服务器 REST API。我想建立一个用户注册的网站,选择一个 API 计划(免费、基本、专业)并获得相应的长期 API 密钥,他们可以使用该密钥每月查询一定次数的无服务器 API。

我知道使用 Cognito 和自托管 UI,您可以使用 CUP(Cognito 用户池)令牌轻松处理用户身份验证,这些令牌实际上是 Json Web 令牌。我想自动创建 API 密钥并将其关联到使用计划,然后关联到 Cognito 用户。

第一部分很简单:使用 AWS Javascript SDK,只需执行以下操作:

var params = {
  keyId: 'whateverKeyId', /* required */
  keyType: 'API_KEY', /* required */
  usagePlanId: 'whateverUsagePlanId' /* required */
};
apigateway.createUsagePlanKey(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});
Run Code Online (Sandbox Code Playgroud)

我在第二部分苦苦挣扎......我应该将 API 密钥作为自定义属性添加到用户池中吗?但是,我真的不知道如何检索 API 密钥。该文件是不是真的清楚。注册后将用户和 API Key 添加到我自己的 DynamoDB 数据库中(这真的会浪费 Cognito)? …

api-key amazon-web-services amazon-cognito aws-lambda

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

AWS CDK 将 API 网关 URL 传递到同一堆栈中的静态站点

我正在尝试在单个堆栈中部署 S3 静态网站和 API 网关/lambda。

S3 静态站点中的 javascript 调用 lambda 来填充 HTML 列表,但它需要知道用于 lambda 集成的 API 网关 URL。

目前,我像这样生成了一个 RestApi ......

    const handler = new lambda.Function(this, "TestHandler", {
      runtime: lambda.Runtime.NODEJS_10_X,
      code: lambda.Code.asset("build/test-service"),
      handler: "index.handler",
      environment: {
      }
    });

    this.api = new apigateway.RestApi(this, "test-api", {
      restApiName: "Test Service"
    });    

    const getIntegration = new apigateway.LambdaIntegration(handler, {
      requestTemplates: { "application/json": '{ "statusCode": "200" }' }
    });

    const apiUrl = this.api.url;
Run Code Online (Sandbox Code Playgroud)

但是在 cdk 部署上,apiUrl =

"https://${Token[TOKEN.39]}.execute-api.${Token[AWS::Region.4]}.${Token[AWS::URLSuffix.1]}/${Token[TOKEN.45]}/"

因此,直到静态站点需要该值之后,才会解析/生成 url。

如何计算/查找/获取 API 网关 URL 并更新 cdk …

aws-lambda aws-api-gateway aws-cdk

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