使用无服务器框架,我希望能够从环境变量更改 AWS 区域。
provider:
name: aws
region: ${env:AWS_REGION}
Run Code Online (Sandbox Code Playgroud)
然后,AWS_REGION可以设置为eu-west-2。
但是,我想将其设置在.env文件中:
AWS_REGION=eu-west-2
Run Code Online (Sandbox Code Playgroud)
然后让.env无服务器读取。
有很多关于在serverless.yml文件中设置变量以及从该文件导出它们的主题,但我想将它们放入文件中。
我正在使用无服务器框架将 PHP 代码部署为 IBM Cloud Function。
以下是操作 PHP 文件中的代码:
function main($args): array {
Sentry\init(['dsn' => 'SENTRY_DSN' ]);
try {
throw new \Exception('Some error')
} catch (\Throwable $exception) {
Sentry\captureException($exception);
}
}
Run Code Online (Sandbox Code Playgroud)
这是 serverless.yml 文件:
service: cloudfunc
provider:
name: openwhisk
runtime: php
package:
individually: true
exclude:
- "**"
include:
- "vendor/**"
functions:
test-sentry:
handler: actions/test-sentry.main
annotations:
raw-http: true
events:
- http:
path: /test-sentry
method: post
resp: http
package:
include:
- actions/test-sentry.php
plugins:
- serverless-openwhisk
Run Code Online (Sandbox Code Playgroud)
当我从本地环境(NGINX/PHP Docker 容器)测试操作处理程序时,错误将被发送到 Sentry。
但是,当我尝试从 IBM Cloud …
Stack XXX 的创建和部署没有问题。我更新了一个依赖项,现在想重新部署它,但是当我调用时sls deploy,它返回Stack with id YYY does not exist. 但是,堆栈 YYY 确实存在,并且与堆栈 XXX 位于同一区域。
我已经删除了堆栈 YYY 的 S3 文件并重新部署了它,这并没有解决问题。其他人已经讨论过sls remove导致这个问题,但我没有在任何一个堆栈上调用它。我还读到问题可能是 S3 中 100 个存储桶的软限制,但我没有接近那个。
这是在 XXX 中引用堆栈 YYY 的位置和方式:
functions:
firstFunctionName:
handler: ./handler.firstFunction
environment:
CONTENT_TABLE: ${cf:YYY.ContentTable}
Run Code Online (Sandbox Code Playgroud)
我希望sls deploy可以毫无问题地运行。这是带有环境信息的错误消息:
Serverless Error ---------------------------------------
Stack with id YYY does not exist
Get Support --------------------------------------------
Docs: docs.serverless.com
Bugs: github.com/serverless/serverless/issues
Issues: forum.serverless.com
Your Environment Information ---------------------------
OS: win32
Node Version: 10.15.3
Serverless Version: 1.46.1
Run Code Online (Sandbox Code Playgroud) 我有一个可以从 API 网关或 ALB 请求触发的 Lambda 函数。我还有一个 RDS Aurora PostgreSQL 实例,它们都在 VPC 中运行。
我能够从 Lambda 连接到 RDS 实例就好了,但是我无法访问互联网,例如尝试向https://jsonplaceholder.typicode.com/todos/1发出请求将导致超时.
我也无法使用 DBeaver 等 SQL 客户端连接到远程数据库。
下面是一些详细信息,但如果您需要其他任何东西,请告诉我。我难住了。
Lambda 入站规则
Security group ID Ports Source
sg-0f2c4426c8fc85235 80 0.0.0.0/0
sg-0f2c4426c8fc85235 5432 0.0.0.0/0
sg-0f2c4426c8fc85235 All sg-0f2c4426c8fc85235
sg-0f2c4426c8fc85235 22 0.0.0.0/0
sg-0f2c4426c8fc85235 443 0.0.0.0/0
Run Code Online (Sandbox Code Playgroud)
Lambda 出站规则
Security group ID Ports Destination
sg-0f2c4426c8fc85235 All 0.0.0.0/0
Run Code Online (Sandbox Code Playgroud)
RDS 连接

专有网络

公共子网

私有子网

编辑
Nat 网关(与公共子网关联)

路由表

路由表路由



编辑 2
Lambda 子网

我不明白我的授权有什么问题。
我有一个 Hello 函数,它只返回一条简单的静态消息。如果我在没有设置“Authorizer”的情况下部署,它就可以工作。我已经在邮递员上进行了测试。当我尝试添加授权者时,问题就出现了。
我的 Cognito 已完全正常工作。在我的前端,我可以注册,然后登录,然后从此登录会话获取令牌。
当我去邮差测试时,我总是得到“未经授权”的答案。在 Postman 上,我测试了 GET 方法,在“标头”选项卡上,我添加了“授权”属性,并粘贴了我从登录会话中获得的令牌值。我还在一些地方推荐的前缀“bearer”的值字段上对此进行了测试。没有成功。
过去一周我一直在努力解决这个问题。请,任何帮助都将非常有用。
serverless.yml
provider:
name: aws
runtime: nodejs10.x
stage: dev
region: eu-west-1
environment:
MY_TABLE: ${self:custom.myStage}_${self:custom.settings.tb_items}
MY_STAGE: ${self:custom.myStage}
MY_DOMAIN: ${self:custom.myDomain}
iamRoleStatements:
- Effect: "Allow"
Action:
- "dynamodb:GetItem"
- "dynamodb:PutItem"
- "dynamodb:UpdateItem"
- "dynamodb:DeleteItem"
- "dynamodb:Scan"
Resource: "*"
functions:
hello:
handler: ${self:custom.pathFunc}/phraseOption.hello
events:
- http:
method: GET
path: hello
cors: true
integration: lambda-proxy
authorizer:
type: COGNITO_USER_POOLS
authorizerId:
Ref: ApiGatewayAuthorizer
resources:
Resources:
CognitoUserPool:
Type: "AWS::Cognito::UserPool"
DeletionPolicy: Retain
Properties:
MfaConfiguration: OFF
UserPoolName: ${self:custom.myStage}_aePool …Run Code Online (Sandbox Code Playgroud) unauthorized amazon-cognito aws-lambda aws-api-gateway serverless-framework
无服务器框架使开发人员可以非常轻松地创建连接到 lambda 函数的 API 网关。像这样
hello:
name: hello-handler
description: blablabla
handler: /lambda-functions/hello-handler.handler
role: HelloRole
package:
include:
- lambda-functions/hello-handler.js
events:
- http: GET hello
Run Code Online (Sandbox Code Playgroud)
我的问题是如何更改将要创建的 API 网关的名称?
我正在尝试在 YAML 中为 DynamoDB 添加事件流,DynamoDB 表是一个根据其部署到的环境而变化的变量,我用来Fn::GetAtt确定TABLE_NAME,但它给了我一个例外。
Fn::GetAtt?例外:
missed comma between flow collection entries in "erverless.yml" at line 60,
column28:Fn::GetAtt: [ ${self:custom.TABLE_NAME ...
Run Code Online (Sandbox Code Playgroud)
代码:
custom:
TABLE_NAME : mix of account + env + name
events:
- stream:
type: dynamodb
arn:
Fn::GetAtt: [ ${self:custom.TABLE_NAME}, StreamArn ]
Run Code Online (Sandbox Code Playgroud) yaml serverless-framework amazon-dynamodb-streams serverless
我正在使用 AWS 并使用无服务器框架。我的无服务器 lambda 函数被事件触发。然后我与数据库交谈,我可以用数据库打开的连接数量有限制。
所以我只想一次运行 5 个 lambda 函数并将其他事件排入队列。我知道有:
provisionedConcurrency: 3 # optional, Count of provisioned lambda instances
reservedConcurrency: 5 # optional, reserved concurrency limit for this function. By default, AWS uses account concurrency limit
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,指定数量的长时间运行的作业将在那里,它们将为事件提供服务。
但我想要的不是事件排队,而是触发函数,以便一次最多运行 5 个函数。
我想知道 AWS 是否支持这种事件排队的概念?
aws-lambda serverless-framework serverless-architecture serverless aws-serverless
我尝试!If在部分中使用条件resources但失败了。我想控制是否设置provisionedConcurrency我的 lambda。lambda 在function节 下定义。
functions:
getTransactionsHandler:
...
resources:
Conditions:
CommonPCNotZero: !Not [!Equals [0, '${self:custom.commonPC}']]
Resources:
!If
- CommonPCNotZero
- getTransactionsHandler:
Type: AWS::Lambda::Alias
Properties:
FunctionName: !Ref GetTransactionsHandlerLambdaFunction
FunctionVersion: !Join ['', [!Ref GetTransactionsHandlerLambdaFunction, ':$LATEST']]
ProvisionedConcurrencyConfig:
ProvisionedConcurrentExecutions: '${self:custom.commonPC}'
- !Ref AWS::NoValue
Run Code Online (Sandbox Code Playgroud)
运行时出现以下错误sls deploy:
Error: The CloudFormation template is invalid: Template format error: [/Resources/Fn::If] resource definition is malformed
Run Code Online (Sandbox Code Playgroud)
使用条件的正确方法是什么!if?
amazon-web-services aws-cloudformation aws-lambda serverless-framework
问题
\n我有一个项目是独立的aws 无服务器后端,它利用 lambda 层概念来共享node_modules和其他custom dependencies。
在我的案例中,自定义依赖项的用例之一是将所有常见代码(例如HTTP_STATUS_CODE枚举)以及Api responses util状态代码和续集模型和服务放在一个文件夹中,稍后将其复制到node_modules并将其托管到s3 bucket
文件夹结构
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 customDependencies\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 nodejs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sequelizeORM\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 config\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 seeders\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 services\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 node_modules\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 functions\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 func1\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 func2\n \xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 func3\n \n\nRun Code Online (Sandbox Code Playgroud)\n在将函数部署到 AWS 提供商之前,我将所有文件从customDependenciesto复制node_modules并将其推node_modules送到 S3 并创建一个所有 lambda 函数引用的层资源node_modules
使用通用代码的函数示例
\n//func1\n\nimport {HTTP_STATUS_CODE, stringifyResponse} from …Run Code Online (Sandbox Code Playgroud) azure amazon-web-services webpack serverless-framework serverless
aws-lambda ×4
serverless ×3
azure ×1
ibm-cloud ×1
openwhisk ×1
php ×1
sentry ×1
unauthorized ×1
webpack ×1
yaml ×1