我已经做了一段时间的无服务器开发,主要是 AWS,并且刚刚开始进入 SNS 发布/订阅设计模式。我正在使用打字稿,并且类型支持非常好,但是我无法为从 SNS 或 S3 触发器传入 Lambda 的事件找到正确的类型。这些确实会使功能之间的接缝非常安全。目前我正在定义我自己的接口,但这会让人厌烦。例如
interface IAWSSNSTriggerPayload {
Records: [
{
EventSource: string,
EventVersion: string,
EventSubscriptionArn: string,
Sns: {
Type: string,
MessageId: string,
TopicArn: string,
Subject: string,
Message: string,
Timestamp: string,
SignatureVersion: string,
Signature: string,
SigningCertUrl: string,
UnsubscribeUrl: string,
MessageAttributes: {},
}
}
]
}
export const handler = (event: IAWSSNSTriggerPayload, context, cb) => {
const response = {
statusCode: 200,
body: JSON.stringify({
message: 'Go Serverless Webpack (Typescript) v1.0! Your function executed successfully! And from …Run Code Online (Sandbox Code Playgroud)amazon-web-services amazon-sns typescript aws-lambda serverless
我正在运行如下命令。
serverless invoke local --function twilio_incoming_call
Run Code Online (Sandbox Code Playgroud)
当我在我的代码中本地运行时,我计划检测这一点,而不是寻找 POST 变量,而是寻找我将提供的 MOCK 文件。
但是,我不知道如何检测我是否使用此本地命令运行无服务器。
你怎么做到这一点?
我在无服务器网站上环顾四周,可以找到很多关于在本地运行但没有检测到您是否在本地的信息。
我想在我的 Windows 7 机器上安装无服务器。我的 npm 版本是 6.1.0。我使用了命令
npm install -g serverless
C:\Users\ADMIN\AppData\Roaming\npm\serverless -> C:\Users\ADMIN\AppData\Roaming\npm\node_modules\serverless\bin\serverless
C:\Users\ADMIN\AppData\Roaming\npm\slss -> C:\Users\ADMIN\AppData\Roaming\npm\node_modules\serverless\bin\serverless
C:\Users\ADMIN\AppData\Roaming\npm\sls -> C:\Users\ADMIN\AppData\Roaming\npm\node_modules\serverless\bin\serverless
> spawn-sync@1.0.15 postinstall C:\Users\ADMIN\AppData\Roaming\npm\node_modules\serverless\node_modules\spawn-sync
> node postinstall
> serverless@1.30.1 postinstall C:\Users\ADMIN\AppData\Roaming\npm\node_modules\serverless
> node ./scripts/postinstall.js
+ serverless@1.30.1
added 351 packages from 269 contributors in 154.064s
Run Code Online (Sandbox Code Playgroud)
但是当我在命令提示符下输入 serverless 时,它告诉我
'serverless' is not recognized as an internal or external command,
operable program or batch file.
Run Code Online (Sandbox Code Playgroud) 尝试sls deploy使用带有schedule事件的函数时出现以下错误:
An error occurred: SupWorldEventsRuleSchedule1 - The requested
resource exceeds the maximum number allowed. (Service:
AmazonCloudWatchEvents; Status Code: 400; Error Code:
LimitExceededException; Request ID: f39cee40-a651-11e8-a111-97a9e3d0f938).
Run Code Online (Sandbox Code Playgroud)
配置:
functions:
supWorld:
handler: dist/handlers/index.helloWorld
events:
- schedule:
rate: cron(*/10 * * * ? *)
enabled: true
Run Code Online (Sandbox Code Playgroud)
此错误的奇怪之处在于没有schedule与此 lambda 堆栈相关联的其他事件。
我想了解是否有用于在无服务器中定义可选路径参数的快速语法(部署在 AWS lambda 上)。
这是我的功能
职能:
MyFunc:
handler: handler.myFunc
events:
- http:
path: /getdata/{my_id}
method: get
request:
parameters:
paths:
my_id: true
Run Code Online (Sandbox Code Playgroud)
我在互联网上发现了一个定义可选参数的技巧,例如:
path: /getdata/{?my_id}
Run Code Online (Sandbox Code Playgroud)
但它不适用于无服务器。我在部署时恢复了这个错误:
Resource's path part only allow a-zA-Z0-9._- and curly braces at the beginning and the end.
Run Code Online (Sandbox Code Playgroud)
我也想知道是否改变:
my_id: false
Run Code Online (Sandbox Code Playgroud)
会是我的情况(但事实并非如此)
那么让 my_id 可选的无服务器方式是什么,所以两个 http 调用:
http://.../getdata
http://.../getdata/12345
Run Code Online (Sandbox Code Playgroud)
将由 MyFunc 管理?
希望有一个更清晰的解决方案,因为需要创建两个不同的端点/func/lambda
谢谢
我设法根据https://serverless.com/framework/docs/providers/cloudflare/guide/使用无服务器框架部署了我的第一个 cloudflare 工作器, 并且当我到达云端时它正在工作。
在开发过程中,希望能够在http://localhost:8080/ *上进行测试
使用 serverless.yml 中指定的函数启动本地 http 服务器并处理我的请求的最简单方法是什么?
我查看了https://github.com/serverless/examples/tree/master/google-node-simple-http-endpoint 但没有“开始”脚本。
https://github.com/serverless/上似乎没有关于 cloudflare 的例子
cloudflare serverless-framework serverless serverless-plugins cloudflare-workers
我不确定我在这里做错了什么?我现在在无服务器设置中让我的突变与我的 apollo-server-lambda 一起运行已经有一段时间了,当我尝试运行这样的查询时,我的查询工作正常:
{ "mutation": "{ signIn(username: \"SomeUser\", password: \"SomePassword\" ) { token } }" }
Run Code Online (Sandbox Code Playgroud)
我刚收到消息:“必须提供查询字符串。” 状态 400。
我已经像这样设置了我的解析器:
const resolvers = {
Query: {
users: async (_, args, ctx) => User.load(args, ctx)
},
Mutation: {
signIn: async (_, { username, password }, ctx) => Auth.signIn({ username, password }, ctx)
}
};
Run Code Online (Sandbox Code Playgroud)
对于额外的信息,这里是我的 typeDefs:
const typeDefs = gql`
type User {
id: ID!,
firstname: String,
lastname: String,
username: String,
createdAt: String,
role: String
}
type AuthToken {
token: String …Run Code Online (Sandbox Code Playgroud) 我在为我用 Node.js 编写的 AWS lambda 函数设置基本身份验证时遇到问题。
问题:
AWS lambda 函数是附加服务的代理。这个函数只转发整个请求并给用户整个响应。这就是为什么我需要强制使用Authentication标头,我希望有传递凭据的提示窗口:https : //developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
除了我的 lambda 函数的代理部分之外,我还专注于身份验证问题,并编写了以下代码:
export const proxy = async (event) => {
const authorizationHeader = event.headers.Authorization;
if (typeof authorizationHeader === undefined) {
throw new Error("Unauthorized");
}
...
};
Run Code Online (Sandbox Code Playgroud)
service:
name: proxy-auth-test
plugins:
- serverless-webpack
provider:
name: aws
runtime: nodejs8.10
memorySize: 128
timeout: 10
functions:
proxy-async:
handler: handler.proxy
events:
- http:
method: get
path: api/proxy
resources:
Resources:
GatewayResponse:
Type: 'AWS::ApiGateway::GatewayResponse'
Properties:
ResponseParameters:
gatewayresponse.header.WWW-Authenticate: "'Basic'"
ResponseType: UNAUTHORIZED
RestApiId: …Run Code Online (Sandbox Code Playgroud) 我已经配置了一个 AWS API 网关并创建了一个 Lambda 函数来连接到外部 REST API。API Gateway 和 Lambda 不在 VPC 中,因此出口 IP 地址是随机的。我面临的挑战是外部 REST API 位于防火墙后面,这需要将 Lambda 的 IP 地址或子网列入白名单。
我查看了 AWS IP 地址页面(如下),但是没有明确提及 API Gateway 或 Lambda。
https://docs.aws.amazon.com/general/latest/gr/aws-ip-ranges.html#filter-json-file
有没有人以前遇到过这个问题并找到了解决办法。出于此解决方案的目的,我不能将 API 网关和 Lambda 放在 VPC 中。
任何帮助将不胜感激!
我想要一个可以访问私有 S3 存储桶的 CloudFront 分配。为此,我必须创建一个原始访问身份。手动,我可以使用 AWS 控制台来做到这一点,但我想通过 CloudFormation 脚本或无服务器(使用serverless.yml)来创建它。在执行此操作时,我可以将原始访问身份的物理 ID 添加到我的 CloudFront 分配(使用一个脚本)。
相关文档:https : //docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-cloudfront.html
我试过这个:
myDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Origins:
- DomainName:bucket.s3.amazonaws.com
Id: myS3Origin
S3OriginConfig: {
OriginAccessIdentity:origin-access-identity/cloudfront/ !Ref cloudfrontoriginaccessidentity
}
Enabled: 'true'
Comment: Some comment
DefaultCacheBehavior:
ForwardedValues:
QueryString: 'false'
Cookies:
Forward: none
AllowedMethods:
- GET
- HEAD
- OPTIONS
TargetOriginId: myS3Origin
ViewerProtocolPolicy: redirect-to-https
PriceClass: PriceClass_200
ViewerCertificate:
CloudFrontDefaultCertificate: 'true'
cloudfrontoriginaccessidentity:
Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
Properties:
CloudFrontOriginAccessIdentityConfig:
Comment: "some comment"
Run Code Online (Sandbox Code Playgroud)
我必须创建一个原始访问身份和一个具有此身份的 CloudFront 分配。我们可以在一个 CloudFormation 脚本中或使用无服务器(使用serverless.yml)来完成这两项工作吗?
amazon-s3 aws-cloudformation serverless-framework serverless
serverless ×10
aws-lambda ×5
amazon-s3 ×1
amazon-sns ×1
apollo ×1
cloudflare ×1
graphql ×1
http ×1
ip ×1
javascript ×1
lambda ×1
node.js ×1
typescript ×1