标签: serverless-framework

无服务器离线和 DynamoDB 抛出 Local UnknownEndpoint: Inaccessible host: localhost at port 8000 Service may not be available in localhostregion

我正在尝试无服务器,但我没有运气能够serverless-offline使用serverless-dynamodb-local. 我的设置非常少,需要 3 分钟才能重现,我是这样做的:

  1. 生成一个 TS Serverless 项目,例如 -sls create -t aws-nodejs-typescript --path folder-name
  2. 安装依赖项npm i
  3. 添加 DynamoDB 本地npm install --save serverless-dynamodb-local
  4. 添加无服务器离线npm install serverless-offline --save-dev
  5. 安装dynamodbsls dynamodb install


现在我更新serverless.ts文件

  1. 以正确的顺序包含已安装的插件
  plugins: [
    'serverless-esbuild',
    'serverless-dynamodb-local',
    'serverless-offline'
  ],
Run Code Online (Sandbox Code Playgroud)
  1. 添加customDynamoDB 配置,例如
  custom: {
    esbuild: { ... },
    dynamodb: {
      stages: ['dev'],
      start: {
        migrate: true
      }
    }
Run Code Online (Sandbox Code Playgroud)
  1. 最后一步是在资源中添加 DynamoDB
  resources: {
    Resources: {
      usersTable: {
        Type: 'AWS::DynamoDB::Table',
        Properties: { …
Run Code Online (Sandbox Code Playgroud)

typescript serverless-framework serverless serverless-offline amazon-dynamodb-local

2
推荐指数
1
解决办法
3375
查看次数

无服务器框架不会在使用队列触发器的 Lambda 之前创建 SQS 队列

使用无服务器框架,如何使我的 Lambda 函数依赖于该resources部分中的 SQS 队列,因为它是函数本身的触发器?

在我的 中serverless.yaml,我定义了一个新的队列和 Lambda 函数。

然后,我想使用该队列作为 Lambda 函数的事件源(触发器)。

我通过手动创建队列 ARN 来做到这一点:

functions:
  consumer:
    handler: App\Service\Consumer
    events:
      - sqs:
          arn:
            Fn::Join:
              - ':'
              - arn:aws:sqs
              - Ref: AWS::Region
              - Ref: AWS::AccountId
              - ${opt:stage}-skill-assigner
Run Code Online (Sandbox Code Playgroud)

并在资源中创建队列:

resources:
  Resources:
    SkillAssignerQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: ${opt:stage}-skill-assigner
Run Code Online (Sandbox Code Playgroud)

如果我在将队列用作函数触发器之前在部署中创建队列,则效果很好。

但是,如果我尝试部署它们,当它尝试创建事件源映射时,它会失败并出现此错误:

提供的请求无效:接收消息时发生错误。SQS 错误代码:AWS.SimpleQueueService.NonExistentQueue。SQS 错误消息:此 wsdl 版本的指定队列不存在。

amazon-sqs amazon-web-services aws-lambda serverless-framework

2
推荐指数
1
解决办法
1442
查看次数

无服务器框架 - useDotenv 未在 AWS 中加载 env 文件

我在 serverless.yml 上使用 useDotenv 属性,但它未在 AWS 中加载:

org: xyz
app: route-learner
service: route-learner-cron
frameworkVersion: '3'

useDotenv: true

provider:
  name: aws
  runtime: python3.8
  stage: ${opt:stage, 'dev'}

functions:
  extract_route:
    handler: src.functions.extract_route.run
    events:
      # Invoke Lambda function at every 5th minute.
      - schedule:
          rate: cron(5,15,25,35,45,55 * * * ? *)
    vpc:
      securityGroupIds:
        - ...
      subnetIds:
        - ...

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: true
Run Code Online (Sandbox Code Playgroud)

我在根目录中有一个 .env.prod 文件,其中包含以下内容:

DB_URI=my_db_url
DB_VERBOSE=True
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令部署该功能:

serverless deploy --stage prod --verbose
Run Code Online (Sandbox Code Playgroud)

调用该函数后,我看到以下错误:

[ERROR] KeyError: 'DB_URI'
Traceback (most recent call …
Run Code Online (Sandbox Code Playgroud)

python environment-variables python-venv serverless-framework

2
推荐指数
1
解决办法
1469
查看次数

如何在无服务器离线状态下从另一个 lambda 调用 lambda 函数?

我正在尝试使用无服务器框架在 lambda 函数中调用 lambda 函数。我现在正在使用这段代码,部署到 AWS 后它可以正常工作。但它在 serverless-offline 中本地返回一些错误。

我现在使用的代码:

const middy = require("@middy/core");
const httpErrorHandler = require("@middy/http-error-handler");
const httpUrlEncodeBodyParser = require("@middy/http-urlencode-body-parser");

const AWS = require("aws-sdk");

const lambda = new AWS.Lambda();

const baseHandler = async (payload) => {
  const params = {
    FunctionName: `my-api-${process.env.STAGE}-handleProcessA`,
    InvocationType: "Event",
    LogType: "None",
    Payload: JSON.stringify(payload),
  };

  await lambda.invoke(params).promise();

  return standardResponse();
}

const endpoint = middy(baseHandler)
  .use(httpUrlEncodeBodyParser())
  .use(httpErrorHandler());

module.exports = { endpoint };

Run Code Online (Sandbox Code Playgroud)

当这个被触发时,它表示找不到该函数: Function not found: arn:aws:lambda:us-west-2:893853743015:function:my-api-local-handleProcessA

我也尝试了这些问题的建议: /sf/answers/4113647121/ /sf/answers/4897727201/

根据建议,我更改了这部分:

const lambda = new …
Run Code Online (Sandbox Code Playgroud)

node.js aws-lambda serverless-framework serverless-offline

2
推荐指数
1
解决办法
1693
查看次数

创建 AWS Aurora Serverless V2 集群时是否需要创建读取器和写入器数据库实例?

我正在使用 Cloudformation 和 Serverless Framework 创建 AWS Aurora Serverless V2 Postgres 数据库集群 (AWS::RDS::DBCluster)(见下文)。目前还不清楚我是否还应该创建两个数据库实例 (AWS::RDS::DBInstance),以便集群具有可用的读取器和写入器实例?

当我运行 AWS RDS 向导时,Aurora Serverless V2 集群会自动设置两个实例(读取器和写入器)。我假设在创建 cloudformation 脚本时我应该做同样的事情?

Type: AWS::RDS::DBCluster
DeletionPolicy: Delete
Properties:
  DBClusterIdentifier: db-test-cluster
  Engine: aurora-postgresql
  MasterUsername: username_from_secrets_manager
  MasterUserPassword: password_from_secrets_manager
  ServerlessV2ScalingConfiguration:
    MinCapacity: 0.5
    MaxCapacity: 2
  BackupRetentionPeriod: 1
  DatabaseName: test-db
  EngineMode: provisioned
  Port: 5432
  Tags:
    - Key: "Name"
      Value: db-test-cluster
Run Code Online (Sandbox Code Playgroud)

DbInstance 1 - 读取器

Type: AWS::RDS::DBInstance
Properties:
  Engine: aurora-postgresql
  DBInstanceClass: db.serverless
  DBClusterIdentifier: !Ref auroraServerlessCluster
Run Code Online (Sandbox Code Playgroud)

DbInstance 2 - 编写器

Type: AWS::RDS::DBInstance
Properties:
  Engine: aurora-postgresql
  DBInstanceClass: …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-rds aws-cloudformation serverless-framework aws-aurora-serverless

2
推荐指数
1
解决办法
1508
查看次数

无服务器框架是否支持任何类型的多云负载平衡?

无服务器框架是否支持将相同的API部署到多个云提供商(AWS,Azure和IBM)并根据传统的负载均衡器方法(即循环或延迟)将请求路由到每个提供商?

无服务器框架是否直接支持此功能?

无服务器是否与全局负载平衡器(例如dyn或neustar)集成?

aws-lambda serverless-framework openwhisk azure-functions serverless-architecture

1
推荐指数
1
解决办法
563
查看次数

AWS Lambda中的API超时?

我正在尝试在AWS中创建一个lambda函数,它将创建一个新的Stripe标记:

import stripePackage from 'stripe';
const stripe = stripePackage('...');

module.exports.create = (event, context, callback) => {
    stripe.tokens.create({
      card: {
        "number": 4242424242424242,
        "exp_month": '02',
        "exp_year": '22',
        "cvc": '123'
      }
    }, (err, token) => {
      if (err) {
        console.log(err);
        callback(null, {
          statusCode: 400,
          body: "error"
        });
      }
      callback(null, {
        statusCode: 200,
        body: "ok"
      });
      console.log(token);
    });
}
Run Code Online (Sandbox Code Playgroud)

但是,每次都会超时.我有一个出站连接的安全组,如下所示:

 Ports  Destination
 All    0.0.0.0/0
Run Code Online (Sandbox Code Playgroud)

但是,我似乎唯一可以连接的是其他AWS服务.如何将我的Lambda函数打开到AWS外部的连接?

amazon-web-services aws-lambda serverless-framework

1
推荐指数
1
解决办法
541
查看次数

云形成将RDS端点设置为Route53 CName记录

以下是YAML格式的示例云形成文件。想法是使Route53记录依赖于RDS数据库的创建,然后在其创建后从RDS数据库的端点获取值。

我在这些参考文档中进行了大量研究,但始终无法正确获取语法。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#aws-properties-rds-database-instance-returnvalues

您可以看到它应该有一个返回值,但是我不确定如何获取它并将其用于route53 cName记录名称。

resources:
      Resources:
        uploadBucket:
           Type: AWS::S3::Bucket
           Properties:
             BucketName: ${self:custom.uploadBucket}
        RDSDatabase:
          Type: AWS::RDS::DBInstance
          Properties:
            Engine : mysql
            MasterUsername: ${env:RDS_USERNAME}
            MasterUserPassword: ${env:RDS_PASSWORD}
            DBInstanceClass : db.t2.micro
            AllocatedStorage: '5'
            PubliclyAccessible: true
            #TODO: The Value of Stage is also available as a TAG automatically which I may use to replace this manually being put here..
            Tags:
              -
                Key: "Name"
                Value: ${self:custom.databaseName}
          DeletionPolicy: Snapshot
        DNSRecordSet:
          Type: AWS::Route53::RecordSet
          Properties:
            HostedZoneName: mydomain.com.
            Name: database-${self:custom.stage}.mydomain.com
            Type: CNAME
            TTL: '300'
            ResourceRecords:
            - [[Put End Point Here]] …
Run Code Online (Sandbox Code Playgroud)

amazon-rds aws-cloudformation amazon-route53 serverless-framework serverless

1
推荐指数
2
解决办法
1818
查看次数

如何将无服务器cloudformation输出变量导出到文件或任务运行器?

我正在使用serverless.yml在AWS cloudformation中创建几个服务,特别是:cognitoUserPool和UserPoolClient。

这两个创建都将返回ID,这些ID将用于在我的带有ognito库的平面html文件上连接到Amazon cognito的ID,因此,由于我从S3提供平面文件,因此我需要将这些值编码在文件中。

现在,我正在寻找一种自动化的方法,也许在文件中保留一个占位符,然后通过预处理器运行它们,该预处理器会使用输出值更改占位符,然后再将其上传到S3。

有什么想法可以实现吗?我的第一个猜测是从无服务器部署中导出输出变量,然后在任务运行器上使用这些值。

amazon-web-services aws-cloudformation serverless-framework

1
推荐指数
1
解决办法
991
查看次数

serverless.yml中http事件的函数“ func_name”中的“ path”属性丢失或无效

当我尝试部署到aws时,由于缺少“ path”属性或该属性无效,导致出现错误。

无服务器部署-v
#要么
无服务器运行--watch
# serveless file

service:
  name: aws-nodejs-ecma-script

# Add the serverless-webpack plugin
plugins:
  - serverless-webpack

provider:
  name: aws
  runtime: nodejs6.10

functions:
  events_get:
    handler: get.handler
    events:
      - http:
        method: get
        path: test
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-lambda serverless-framework serverless

1
推荐指数
1
解决办法
719
查看次数