我正在配置 lambda 函数的 API 网关与Serverless Framework 0.4.2 版的集成。
我的问题是定义端点的请求参数。API 网关条目的AWS 文档说:
请求参数
表示 Amazon API Gateway 可以接受的请求参数。请求参数表示为键/值映射,源作为键,布尔标志作为值。布尔标志用于指定是否需要该参数。源必须与模式 method.request.{location}.{name} 匹配,其中 location 是查询字符串、路径或标头。name 是有效的唯一参数名称。此处指定的源可用于集成以映射到集成请求参数或模板。
据我了解, 中的配置s-function.json直接提供给 AWS CLI,因此我以以下格式指定了请求参数:
"method.request.querystring.startYear": true. 但是,我收到一个Invalid mapping expression specified: true错误。我也尝试将配置指定为"method.request.querystring.startYear": "true"相同的结果。
s-function.json:
{
"name": "myname",
// etc...
"endpoints": [
{
"path": "mypath",
"method": "GET",
"type": "AWS",
"authorizationType": "none",
"apiKeyRequired": false,
"requestParameters": {
"method.request.querystring.startYear": true,
"method.request.querystring.startMonth": true,
"method.request.querystring.startDay": true,
"method.request.querystring.currentYear": true,
"method.request.querystring.currentMonth": true,
"method.request.querystring.currentDay": true, …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-cli aws-api-gateway serverless-framework
我一直在尝试寻找在 Azure Functions 上的无服务器环境中运行 Django 的方法。
\n\n假设我只能使用 Azure 服务,我想确保我们将编写的 Django 代码应该是可移植的(可以部署在其他任何地方)。
\n\n我一直在尝试几种方法,包括Azure 上的 Python:第 4 部分\xe2\x80\x94运行无服务器 Django和无服务器框架,但我仍然无法使环境运行无错误。
\n\n我想确定,即使有人有运行 Django 无服务器的工作想法以及一些关于良好资源的指导?
\n我有一个 cognito 用户池,它作为身份提供者连接到 google(以便我可以使用 gmail 帐户登录)。我还有一个带有文件 () 的私人存储桶 s3。如何使用我的 lambda 函数,使用 Cognito(AcessToken,IdToken)返回的令牌来访问我的非公开 s3 存储桶?
我只想使用我的认知来访问我在 s3 上的私人文件。
类似于仅用于 s3 存储桶的 lambda 函数的 Cognito 授权器。
amazon-s3 amazon-web-services amazon-cognito serverless-framework
使用 POST 获取文件和一些参数并返回 JSON 响应的 API。
curl -X POST www.endpoint.com \
-F file=@/myfile.txt \
-F foo=bar # other params
Run Code Online (Sandbox Code Playgroud)
我使用二进制数据与 Lambda + API 网关一起工作,但 10MB 限制是问题所在。
我考虑过将文件上传到 S3 的 POST API。然后由 Lambda 读取生成的事件。但为此我有几个问题-
amazon-s3 amazon-web-services aws-lambda aws-api-gateway serverless-framework
要在CloudFormation 中创建CloudWatch 仪表板,您必须以字符串化 JSON 而不是单独的 JSON 结构的形式提供仪表板的源代码。
这很烦人,因为我的 JSON 必须在我的字符串文字内转义serverless.yml:
...
resources:
Resources:
MyDashboard:
Type: AWS::CloudWatch::Dashboard
Properties:
DashboardName: My-Dashboard
DashboardBody: "{\"widgets\": [...]}"
Run Code Online (Sandbox Code Playgroud)
我尝试使用文件引用:
...
resources:
Resources:
MyDashboard:
Type: AWS::CloudWatch::Dashboard
Properties:
DashboardName: My-Dashboard
DashboardBody: ${file(my-dashboard.json)}
Run Code Online (Sandbox Code Playgroud)
但serverless将内容作为 YAML 结构的一部分插入,而不是作为 JSON 字符串的一部分:
...
resources:
Resources:
MyDashboard:
Type: AWS::CloudWatch::Dashboard
Properties:
DashboardName: My-Dashboard
DashboardBody:
Widgets:
- ...
- ...
Run Code Online (Sandbox Code Playgroud)
有没有办法stringify从 JSON 获取 JSON my-dashboard.json?
我开始尝试用 node 和 puppeteer 编写一个 lambda 函数。我正在使用无服务器框架
我一直在尝试按照https://github.com/alixaxel/chrome-aws-lambda 上的说明进行操作。我的功能在本地按预期工作,具有:
$ sls invoke local -f hello
Run Code Online (Sandbox Code Playgroud)
但是,当我运行时:
$ sls invoke -f hello
Run Code Online (Sandbox Code Playgroud)
我得到:
{
"errorType": "Error",
"errorMessage": "spawn ETXTBSY",
"trace": [
"Error: spawn ETXTBSY",
" at ChildProcess.spawn (internal/child_process.js:407:11)",
" at Object.spawn (child_process.js:548:9)",
" at Launcher.launch (/opt/nodejs/node_modules/puppeteer-core/lib/Launcher.js:132:40)",
" at async Object.main (/var/task/index.js:50:15)",
" at async module.exports.hello (/var/task/handler.js:6:13)"
]
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它工作?
我的 handler.js 包含:
'use strict';
var index = require('./index.js');
module.exports.hello = async event => {
// var t = async event …Run Code Online (Sandbox Code Playgroud) google-chrome node.js aws-lambda serverless-framework puppeteer
当我尝试部署到 serverless.yml 中配置的现有 lambda 函数时,如下所示,它说“发生错误:ApiLambdaFunction - an-existing-function-name-created-by-my-devops 已经存在。”
functions:
api:
name: an-existing-function-name-created-by-my-devops
Run Code Online (Sandbox Code Playgroud)
所以不允许部署到不是由无服务器创建的现有 lambda 吗?
根据此处和此处的 AWS 文档,我应该能够使用 cloudformation自动创建和验证证书。显然,当您在 中指定 aHostedZoneId时DomainValidationOptions,它应该创建所需的 DNS 记录以完成验证(至少从非常模糊的文档中看起来是这样)。我的证书 CF 模板如下所示:
Resources:
MyAPICert:
Type: AWS::CertificateManager::Certificate
Properties:
DomainName: xxxx.dev.mydomain.io
DomainValidationOptions:
- DomainName: mydomain.io
HostedZoneId: /hostedzone/Z03XXXXXXXXXXXX
ValidationMethod: DNS
Run Code Online (Sandbox Code Playgroud)
“mydomain.io”(当然已更改)是使用 AWS 作为注册商注册的,因为文件说必须是自动验证才能工作的情况。
上面的这个模板作为资源包含在 serverless.yml 中。然而,当我部署,堆栈创建只是卡住等待DNS记录-即我的理解是它不会添加所需的CNAME条目应该做的,因此堆栈被卡住。
有没有人让这个功能工作?
而且,是的,我知道尝试做同样事情的 3rd 方自定义资源,如果 CF 现在应该在本地执行此操作,我不想使用它们。
ssl amazon-web-services aws-cloudformation amazon-route53 serverless-framework
由于与 REST 网关相比价格大幅降低,我对 HTTP 网关感到非常兴奋,但我坚持创建不会完全破坏我的serverless.yml文件的路由。
Serverless 的 HTTP 网关文档描述了这一点来定义路由:
functions:
params:
handler: handler.params
events:
- httpApi:
method: GET
path: /get/for/any/{param}
Run Code Online (Sandbox Code Playgroud)
支持'*',但这会导致问题,OPTIONS因为这些会覆盖创建的 CORS 策略(因此 OPTIONS 请求实际上会到达应用程序,这没有任何意义,尤其是在路由通过授权者保护的情况下)。
此外,不可能定义多个方法。
# does not work
method: GET,POST,DELETE
# also not possible
method:
- GET
- POST
- DELETE
Run Code Online (Sandbox Code Playgroud)
我发现的唯一配置是分别定义所有路由:
events:
- httpApi:
path: /someApi/{proxy+}
method: GET
- httpApi:
path: /someApi/{proxy+}
method: POST
- httpApi:
path: /someApi/{proxy+}
method: DELETE
Run Code Online (Sandbox Code Playgroud)
这很好用,用户界面甚至捆绑了路由,因为它们位于相同的前缀路径上:
但是有了这个,我必须为我的所有主要资源分别定义所有 HTTP 方法,包括附加的授权方。
有没有办法把它结合起来?
我已经使用 CloudFormation 模板设置了一个 API 网关(v1,而不是 v2)REST API 资源。最近我注意到还创建了默认的 execute-api 端点,我可以在设置中禁用它。
这个 API 的类型是AWS::ApiGateway::RestApi.
自然,我希望通过模板来完成,所以问题是:这个设置可以在 CloudFormation 模板中定义,而不是在 AWS 控制台中手动单击吗?此选项可用于 CloudFormation 模板中的 APIGateway V2 API 资源 ( AWS::ApiGatewayV2::Api) 但不适用于 APIGateway V1 REST API 资源 ( AWS::ApiGateway::RestApi),即使可以在控制台中手动更改 APIGateway V1 REST API。
也有这样的CLI方式的AWS::ApiGateway::RestApi。
以下是我用来搜索此设置的一些链接:
AWS::ApiGatewayV2::API
AWS::ApiGateway::RestApi
Disabling default api-execute endpoint via CLI
rest amazon-web-services aws-cloudformation aws-api-gateway serverless-framework