我有一个具有以下结构的 NodeJS 无服务器项目:
-node_modules
-package.json
-serverless.yml
-funcitons
-medium
-mediumHandler.js
Run Code Online (Sandbox Code Playgroud)
我的无服务器.yml:
service: googleAnalytic
provider:
name: aws
runtime: nodejs6.10
stage: dev
region: us-east-1
package:
include:
- node_modules/**
functions:
mediumHandler:
handler: functions/medium/mediumHandler.mediumHandler
events:
- schedule:
name: MediumSourceData
description: 'Captures data between set dates'
rate: rate(2 minutes)
- cloudwatchEvent:
event:
source:
- "Lambda"
detail-type:
- ""
- cloudwatchLog: '/aws/lambda/mediumHandler'
Run Code Online (Sandbox Code Playgroud)
我的 sls 信息显示:
Service Information
service: googleAnalytic
stage: dev
region: us-east-1
stack: googleAnalytic-dev
api keys:
None
endpoints:
None
functions:
mediumHandler: googleAnalytic-dev-mediumHandler
Run Code Online (Sandbox Code Playgroud)
当我运行 sls 时:
serverless …Run Code Online (Sandbox Code Playgroud) 如何在 SAM 模板中创建 IAM 角色,就像我在 SAM 包中所做的那样。我尝试了如下:
"lambdaFunctionRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"apigateway.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
},
"ManagedPolicyArns": [
{
"Ref": "lambdaBasePolicy"
}
],
"Policies": [
{
"PolicyName": "root",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"s3:*",
"dynamodb:*",
"iam:ListRoles",
"ses:*",
"events:*"
],
"Resource": "*"
}
] …Run Code Online (Sandbox Code Playgroud) 我正在构建一个 React 应用程序,使用 API Gateway、lambda 和 cognito(基本上从https://serverless-stack.com教程开始)。我想为我的 DynamoDb 设置细粒度的访问控制(即通过基于登录用户限制对 DynamoDb 表的访问的 IAM 策略 - 如https://docs.aws.amazon.com/IAM/latest/UserGuide/ reference_policies_examples_dynamodb_rows.html )
AFAIK,一个 lambda 函数承担一个服务角色,如 serverless.yml 文件中定义的那样,它本身与附加到登录的 cognito 用户的 AIM 策略无关。我知道使用aim_authorizer,我可以获得登录用户的信息。
我的问题:是否可以让 lambda 代表给定的认知用户执行 AWS 调用,从而遵守附加到该用户的 IAM 策略?(有点类似于 serverless-stack 教程如何与 S3 交互)
欢迎所有建议。
每当我尝试通过浏览器通过 POST 访问无服务器 lambda 函数时,我都会收到错误消息
对预检请求的响应未通过访问控制检查:请求的资源上不存在 >'Access-Control-Allow-Origin' 标头。
当它是一个/GET它工作正常我读过它是因为它没有发送飞行前请求。当我把它改成POST这个的时候就是失败了。
我正在运行的命令:
sam local start-api
我的 template.yaml 是:
...
Resources:
PropertiesFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: target/service-0.0.1-SNAPSHOT.jar
Handler: com.aws.PropertiesHandler::handleRequest
Runtime: java8
Events:
PropertiesApi:
Type: Api
Properties:
Path: /properties
Method: post
...
Run Code Online (Sandbox Code Playgroud)
如何在这些端点上启用 CORS?
amazon-web-services aws-lambda aws-api-gateway aws-sam-cli serverless
我找不到任何方法如何使用无服务器 netlify 函数设置 CORS。我已经使用这个函数示例来创建我自己的电子邮件表单发件人:
const nodemailer = require('nodemailer');
exports.handler = function(event, context, callback) {
let transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
type: 'OAuth2',
user: process.env.MAIL_LOGIN,
clientId: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
refreshToken: process.env.REFRESH_TOKEN,
accessToken: process.env.ACCESS_TOKEN
}
});
console.log(event.body);
transporter.sendMail({
from: process.env.MAIL_LOGIN,
to: process.env.MAIL_TO,
subject: process.env.SUBJECT + new Date().toLocaleString(),
text: event.body
}, function(error, info) {
if (error) {
callback(error);
} else {
callback(null, {
statusCode: 200,
body: "Ok"
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,我能够通过每个域发送它,这并不安全,因为有些人可以将垃圾邮件发送到该收件箱。
你能跟我举个例子吗?先感谢您
最近我使用无服务器框架创建/部署AWS lambda函数/API网关。这是部署 Lambda/API 的一种非常酷的方式,但我不知道如何将其应用到现有的 AWS lambda/API。
有没有什么办法可以做到这一点,而无需删除现有的,然后使用无服务器重新创建,因为我有数十个现有的 lambda 函数和 api。
目前,我正在研究将复杂的 Web 应用程序从 AWS 迁移到 GCP 的可能性和正确方法。将通用计算和网络服务从一个提供商映射到另一个提供商实际上没有问题,但我想知道 GCP 是否有类似于AWS Step Functions 的服务?我已经看过 Google Dataflow和 Google Cloud Tasks。第二个似乎是这样的,但我不确定它是否是最佳解决方案。
所以问题是谷歌的哪些服务提供了与 AWS Step Functions 相同的功能?如果没有这样的 - 那么你会推荐哪些服务的组合来实现分布式任务(主要是云功能)的有效编排。谢谢!
amazon-web-services web google-cloud-platform aws-step-functions serverless
我正在 Zeit Now 上从 Express 迁移到无服务器功能。
Stripe webhook 文档要求提供原始正文请求,使用 Express 时我可以通过 bodyParser 获取它,但是它如何在无服务器功能上工作?如何以字符串格式接收正文以验证条带签名?
支持团队将我重定向到这个文档链接,我很困惑,据我所知,我必须传入text/plain请求标头,但我无法控制它,因为 Stripe 是发送 webhook 的那个。
export default async (req, res) => {
let sig = req.headers["stripe-signature"];
let rawBody = req.body;
let event = stripe.webhooks.constructEvent(rawBody, sig, process.env.STRIPE_SIGNING_SECRET);
...
}
Run Code Online (Sandbox Code Playgroud)
在我的函数中,我req.body作为一个对象接收,我该如何解决这个问题?
我正在尝试使用命令 Command 在本地测试无服务器 lambda 函数
serverless invoke local -f send --log --stage test
Run Code Online (Sandbox Code Playgroud)
错误
python3: can't open file '/snapshot/serverless/lib/plugins/aws/invokeLocal/invoke.py': [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)
此命令在包含 serverless.yml、requirements.txt、handler.py 的目录中运行。
无法理解为什么会发生此错误以及解决方案是什么
免责声明:我承认这更像是一个广泛的最佳实践问题,而不是一个特定的编程问题,但是,我相信 SO 群是它的最佳受众。我知道这个类似的问题(我应该在无服务器应用程序中使用 Express.js 吗?),但答案似乎没有回答我的问题。
出于典型原因,我想将 Express.js 从 AWS Lightsail/EC2 迁移到无服务器,而 Lambda 是我的首选武器。但是,将整个框架连同其上的应用程序一起视为函数可能有点笨重,因此可能不适合在 AWS Lambda 或 Google/Azure Functions 上运行。虽然我确信这是可行的,但这是个好主意吗?这种设置不会降低效率并使处理诸如会话状态之类的事情变得复杂,最终会破坏无服务器功能的目的吗?
express aws-lambda azure-functions serverless aws-serverless
serverless ×10
aws-lambda ×5
node.js ×3
aws-sam-cli ×1
express ×1
javascript ×1
netlify ×1
python ×1
vercel ×1
web ×1