我使用Serverless-Authentication-boilerplate并希望映射自定义错误响应.但它总是返回500错误.
authorize.js
// Authorize
function authorize(event, callback) {
let providerConfig = config(event);
try {
let data = utils.readToken(event.authorizationToken, providerConfig.token_secret);
console.log("Decrypted data: " + JSON.stringify(data));
let methodArn = event.methodArn.replace(/(GET|POST|PUT|DELETE)/g, '*').replace(/mgnt.+/g, 'mgnt/*');
console.log(`Change methodArn to: ${methodArn}`);
// TODO: handle expiration time validation
callback(null, utils.generatePolicy(
data.id, // which is $context.authorizer.principalId
'Allow',
methodArn));
} catch (err) {
console.log(err);
callback('401 Unauthenticated');
}
}
Run Code Online (Sandbox Code Playgroud)
S-function.json
responses:{
"401 Unauthenticated.*": {
"statusCode": "401"
},
"default": {
"statusCode": "200",
"responseModels": {
"application/json;charset=UTF-8": "Empty"
},
"responseTemplates": {
"application/json;charset=UTF-8": …Run Code Online (Sandbox Code Playgroud) 我正在尝试调试sls调用本地.
但是我一直在:
/Users/nikos/.nvm/versions/node/v6.9.1/bin/node --debug-brk=63417 --expose_debug_as=v8debug /Users/nikos/.nvm/versions/node/v6.9.1/bin/serverless invoke local -f createTodo
Debugger listening on [::]:63417
Process finished with exit code 130 (interrupted by signal 2: SIGINT)
Run Code Online (Sandbox Code Playgroud) 我正在使用无服务器和无服务器本地进行本地开发。
我有一个外部文件,其中包含对我node.env在应用程序中检索到的环境变量的引用。
据我了解,我应该能够设置环境变量,例如
dev:
AWS_KEY: 'key',
SECRET: 'secret
test:
AWS_KEY: 'test-key',
SECRET: 'test-secret',
etc:
...
Run Code Online (Sandbox Code Playgroud)
并通过serverless.yml中的以下行将这些环境变量包含在我的应用程序中
provider:
name: aws
runtime: nodejs4.3
stage: ${opt:stage, self:custom.default_stage}
deploymentBucket: serverless-deploy-packages/${opt:stage, self:custom.default_stage}
environment:
${file(./serverless-env.yml):${opt:stage, self:custom.default_stage}}
Run Code Online (Sandbox Code Playgroud)
然后在命令行中,我打电话
serverless offline --stage dev --port 9000
我以为这会在我的应用程序中包含正确的var,但是它不起作用。这不是应该的工作方式吗?我在这里做错什么了吗?
我想在我的Git Repository中创建一个备份并将其保存到AWS CodeCommit.我不想包括使用我的本地机器.任何人都可以告诉我如何直接或通过AWS Lambda进行此操作?
我有一个无服务器项目,正在创建API网关API等.项目中的一个功能需要为API端点生成URL.
我的计划是使用serverless.yml中的资源输出获取API ID,然后创建URL并将其作为env参数传递给lambda函数.
我的问题/问题是如何将API ID作为serverless.yml中的云形成输出?
我试过了:
resources:
Outputs:
RESTApiId:
Description: The id of the API created in the API gateway
Value:
Ref: name-of-api
Run Code Online (Sandbox Code Playgroud)
但这会给出错误:
The CloudFormation template is invalid: Unresolved resource dependencies [name-of-api] in the Outputs block of the template
Run Code Online (Sandbox Code Playgroud) 我的dynamoDB表中有以下数据。
这是我的代码:
const userStatusParams = {
TableName: process.env.USERSTATUS_TABLE,
KeyConditionExpression: "loggedIn = :loggedIn",
ExpressionAttributeValues: {
":loggedIn": true
}
};
var usersResult;
try {
usersResult = await dynamoDbLib.call("query", userStatusParams);
console.log(usersResult);
}catch (e) {
console.log("Error occurred querying for users belong to group.");
console.log(e);
}
Run Code Online (Sandbox Code Playgroud)
亚马逊返回此错误:
{ ValidationException: Query condition missed key schema element: userId
at Request.extractError ...
Run Code Online (Sandbox Code Playgroud)
我如何让它返回所有登录记录== true的记录?
目前,我的数据库通过我的serverless.yml配置来构建。
phoneNumberTable: #This table is used to track phone numbers used in the system.
Type: AWS::DynamoDB::Table
Properties:
TableName: ${self:custom.phoneNumberTable}
AttributeDefinitions: #UserID in this case …Run Code Online (Sandbox Code Playgroud) amazon-web-services node.js amazon-dynamodb serverless-framework
这里的核心问题是:" 如何在使用无服务器框架处理的CORS GET请求中允许自定义标头? ".如果您知道答案,请通过Go,收取200美元并回答该问题.如果这不是一个直接答案的问题,这里有详细信息:
我正在使用AWS Lambda上的无服务器框架编写应用程序(API通过AWS API Gateway进行管理.坦率地说,我不完全确定这意味着什么或者提供了什么好处,但这就是无服务器为我自动配置的内容).我正在尝试创建一个开放的API,需要启用CORS.我正在使用Lambda代理集成.我遵循了这里的做法.他们给我带来了部分成功.如果我不包含我的自定义标题,我的应用程序当前已启用CORS.但是,它仍然不适用于自定义标头.
当我向API发送以下请求时:
var data = null;
var xhr = new XMLHttpRequest();
xhr.withCredentials = false;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === 4) {
console.log(this.responseText);
}
});
xhr.open("GET", "https://api.spongebobify.com/");
xhr.setRequestHeader("text", "hey");
xhr.send(data);
Run Code Online (Sandbox Code Playgroud)
...我收到此错误:
Failed to load https://api.spongebobify.com/: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://forum.serverless.com' is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)
如果我使用Chrome开发工具检查"响应标头",则会确认此错误消息:响应标头中没有Access-Control-Allow-Origin.
但是,如果我发送相同的请求与setRequestHeader()注释掉,它完美地工作(是的,我知道它返回403错误:这是故意行为).
这就是我认为正在发生的事情.我的服务有两个潜在的CORS问题:域相关(请求不来自原始域)和自定义头相关(CORS规范未安全列出的头,更多这里).不知何故,无服务器框架在第二个问题上绊倒,导致它甚至没有达到它发出适当的头以允许所有("*")域的程度.
这是我的serverless.yml配置文件:
# serverless.yml …Run Code Online (Sandbox Code Playgroud) 我通过使用无服务器框架部署的lambda函数配置了API网关.我已经在yaml文件中定义了一些queryStringParameters为true.但是,即使在URL中未传递Required(强制)queryStringParams,请求也会通过该服务.PFB类似的配置.
functions:
functionName:
name: serviceName
handler: handler.handle
events:
- http:
path: /path
method: get
request:
parameters:
querystrings:
param1: true
param2: true
似乎无服务器无法验证param1和param2是否作为queryString传递.我们应该有一个明确的请求验证器吗?是否可以使用无服务器?
我试图了解我需要经历的各个步骤和要求,以便使我们的网站在法规方面(长防火墙)在中国可用,也在技术方面(技术限制和执行更改)从中国提供https://unly.org/
目前似乎不允许这样做:http : //www.chinafirewalltest.com/? siteurl= https%3A%2F%2Funly.org%2F
我不需要也不想拥有.ch网站,我只想通过https://unly.org/将我的网站提供中文版本。此外,该网站目前托管在AWS Lambda上(使用无服务器框架),并且仅部署在eu-west-1区域(爱尔兰)中。
该网站没有在线销售任何产品:这是一个信息网站,而不是电子商务。
我已经研究了这个问题几个小时,但是对于实现此目标所需的确切步骤,我有些迷失。
以下是一些我尚未找到答案的问题:
cn-north-1(中国北京),或者eu-west-1如果我获得ICP许可证,中国用户可以访问我的lambda吗?无论部署区域在哪里,我似乎都需要ICP许可证,如AWS FAQ在 https://www.amazonaws.cn/en/about-aws/china/faqs/#new%20step上所述:
问:如果要在AWS中国(北京)地区或AWS中国(宁夏)地区托管公共内容,是否需要提交ICP备案或ICP许可证?
是。根据中国法律法规,如果您使用任一AWS中国地区托管提供非商业互联网信息服务的网站,则必须通过相关政府机构对非商业网站(“ ICP备案”)进行备案程序。如果您使用任一AWS中国地区托管提供商业互联网信息服务的网站,则必须从相关政府机构获得商业网站的增值电信许可证(“ ICP许可证”)。在使用AWS中国地区之一托管公共内容之前,可能会要求您提供ICP记录或ICP许可证(如果适用)。
AWS中国(北京)地区由负责北京地区托管内容的Sinnet运营,而AWS中国(宁夏)地区由负责宁夏地区托管内容的NWCD运营。Sinnet和NWCD都为寻求ICP相关服务的客户提供免费支持,尽管客户需承担适用政府机构收取的任何费用。要了解有关存档程序的更多信息,请访问Sinnet(http://www.sinnet.com.cn/service.aspx?PartNodeId=35)和NWCD(http://nwcdcloud.cn/ICP.aspx)。
至于实际获得许可证,这里有点话题了,但是我不明白第一个提供商的工作流程:
无论如何,该过程似乎需要大约4-6周的时间。因此,可能要花费更多的时间。
关于现在的技术细节,似乎中国地区(cn-north-1北京和cn-northwest-1宁夏)在AWS Lambda上表现得非常特殊。
REGIONAL端点environment变量看到
此外,对网站本身也会产生技术影响:
而且我可能已经错过了其他技术限制,因为那只是我在挖掘2小时内了解到的那些技术限制。
我还有其他步骤被忽略吗?(法规或技术)您是否对如何在中国启用AWS Lambda托管网站有任何建议或反馈?
amazon-web-services aws-lambda great-firewall-of-china serverless-framework aws-serverless
aws-lambda ×4
node.js ×3
cors ×1
debugging ×1
git ×1
lambda ×1
python ×1
serverless ×1
yaml ×1