我目前正在尝试使用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
是否有任何可能的方法可以禁用 CloudWatch 来记录 Lambda 函数的事件?如果可能,那么执行此操作的步骤是什么。
我们正在用 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/.
那可能吗?
谢谢!
我正在尝试测试我的 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) 我想通过以下代码在 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
我正在使用 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) 我创建了一个 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) 我在我的无服务器应用程序(避免混乱的最简单应用程序)中有一个类似于以下的目录结构,我使用 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在无服务器框架中但在 …
我一直在使用 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)? …
我正在尝试在单个堆栈中部署 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 ×10
node.js ×3
python ×2
api-key ×1
async-await ×1
asynchronous ×1
aws-amplify ×1
aws-cdk ×1
aws-sam ×1
aws-sam-cli ×1
mysql ×1
pip ×1
postgresql ×1
python-3.x ×1
reactjs ×1