标签: serverless-framework

AWS Lambda可以与S/FTP进行交互吗?

我写了一些基本的js来列出FTP的文件,但我得到:

"在完成请求之前退出流程"

那是因为Lambda无法与FTP交互吗?

我正在使用jsftp btw.

这是我的设置:

  • 我使用Serverless来创建项目
  • 对于我的lambda,我使用了nodejs,我使用JSFTP来处理ftp的东西.

我的代码:

// Require Serverless ENV vars
var ServerlessHelpers = require('serverless-helpers-js').loadEnv();

// Require Logic
var lib = require('../lib');

// Lambda Handler
module.exports.handler = function (event, context) {

    lib.respond(event, function (error, response) {
        return context.done(error, response);
    });
};
Run Code Online (Sandbox Code Playgroud)

我的ftp lambda代码:

var JSFtp = require("jsftp");

module.exports.respond = function (event, cb) {

    var ftp = new JSFtp({
        host: "host",
        user: "user",
        password: "password"
    });

    ftp.auth(ftp.user, ftp.password, function(err, res) {
        if (err) console.log(err);
        else console.log(res); …
Run Code Online (Sandbox Code Playgroud)

ftp sftp node.js aws-lambda serverless-framework

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

如何改善无服务器网站的SEO?

当我的网站托管在AWS S3上时,我想在无服务器架构中改进SEO(即,在搜索引擎上正确索引我的页面).

由于我正在使用JavaScript方法进行路由(类似于角度,但更简单),并获得动态内容来填充元标记,我发现一切对于没有JavaScript支持的抓取工具来说非常麻烦,比如Facebook.

我已经插入了默认元标记,当然,这些元标记加载得很好,但我需要更新的元标记.

我知道大多数人在服务器上或通过Prerender.io之类的东西使用预渲染,但我真的想找到一种在无服务器方法上有意义的替代方案.

我认为我已经弄清楚了,因为Open Graph元标记允许"指针"URL,如果需要,您可以在其中使用"仅元标记"HTML.所以我在考虑使用Lambda函数在GET请求中使用正确的元标记生成HTML响应.问题是因为Facebook刮刀没有JavaScript支持,我如何在GET请求上发送动态内容?

javascript seo facebook amazon-s3 serverless-framework

6
推荐指数
2
解决办法
1642
查看次数

如何在无服务器框架中将iamRoleStatements添加到S3触发器存储桶

当我在serverless.yml文件中添加以下代码时

provider:
  name: aws
  runtime: python3.6
  stage: dev
  region: [REGION]
  iamRoleStatements:
    - Effect: "Allow"
      Action:
       - "s3:GetObject"
      Resource: { "Fn::Join": ["", ["arn:aws:s3:::", { "Ref": [BUCKET NAME] }, "/*" ] ] }
Run Code Online (Sandbox Code Playgroud)

在部署时,我得到"CloudFormation模板无效:资源之间的循环依赖:"

我正在使用boto3python3来获取在触发器事件之后上传到S3存储桶的私有文件,以便为该存储桶提供Lambda函数的权限.

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

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

带有排序键的无服务器框架Dynamo DB表资源定义

我目前在我的serverless.yml中有一些代码.

resources:
  Resources:
    uploadBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:service}-${self:custom.stage}-uploads
    visitsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:custom.visitsTable}
        AttributeDefinitions:
          - AttributeName: userId
            AttributeType: S
          - AttributeName: visitId
            AttributeType: S
          - AttributeName: comments
            AttributeType: S
          - AttributeName: attachments
            AttributeType: S
          - AttributeName: ph
            AttributeType: N
          - AttributeName: ch
            AttributeType: N
        KeySchema:
          - AttributeName: userId
            KeyType: HASH
          - AttributeName: visitId
            KeyType: HASH
        ProvisionedThroughput:
            ReadCapacityUnits: 5
            WriteCapacityUnits: 5
Run Code Online (Sandbox Code Playgroud)

我的目标是创建一个包含主键userId,排序键visitId的表,并包含注释,附件,ph&ch的字段.当我尝试时,sls deploy我得到以下错误.

无服务器错误---------------------------------------

发生错误:visitsTable - 属性AttributeDefinitions与表的KeySchema和二级索引不一致.

我在这做错了什么?

编辑:我试过的另一次尝试

resources:
  Resources:
    uploadBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:service}-${self:custom.stage}-uploads …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-dynamodb serverless-framework

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

销毁通过Serverless创建的资源,而不会破坏Lambda端点

我在serverless.yml文件中定义了以下资源.它非常适合为我所有不同的开发阶段创建资源.

resources:
  Resources:
    uploadBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:service}-${self:custom.stage}-uploads
    visitsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:custom.visitsTable}
        AttributeDefinitions:
          - AttributeName: userId
            AttributeType: S
          - AttributeName: visitId
            AttributeType: S
        KeySchema:
          - AttributeName: userId
            KeyType: HASH
          - AttributeName: visitId
            KeyType: RANGE
        ProvisionedThroughput:
            ReadCapacityUnits: ${self:custom.dynamoDbCapacityUnits.${self:custom.stage}}
            WriteCapacityUnits: ${self:custom.dynamoDbCapacityUnits.${self:custom.stage}}
Run Code Online (Sandbox Code Playgroud)

问题是......如果我sls remove在删除数据库时这样做,它还会删除其他所有内容,包括lambda函数及其api网关端点,我需要保留它们,因为我已经为它们明确设置了策略. 如何告诉无服务器我只想删除数据库或S3或其他任何东西而不是其余的?

我试过的事情:

我在AWS上手动删除了,但是如果你这样做并且执行sls部署它不会再次创建数据库!所以不确定最好的方法来做到这一点......

整个Serverless.yml文件

service: mydomain-api

# Use serverless-webpack plugin to transpile ES6/ES7
plugins:
  - serverless-webpack
  - serverless-domain-manager

custom:
  webpackIncludeModules: true
  stage: ${opt:stage, self:provider.stage}
  visitsTable: "${self:service}-visits-${self:custom.stage}"
  domains:
    prod: api.mydomain.com
    staging: staging-api.mydomain.com
    dev: dev-api.mydomain.com …
Run Code Online (Sandbox Code Playgroud)

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

6
推荐指数
2
解决办法
4823
查看次数

如何使用NodeJS在本地测试AWS Lambda处理程序?

我按照这些说明创建了一个在Lambda中执行的基本Web scraper.我有编写selenium代码的经验,但没有使用Node JS.我让项目在Lambda中运行,但是当我尝试在本地编辑项目以执行我想要的selenium代码时,它不起作用.exports.handler我跑的时候没有任何东西被执行node index.js.我如何在本地执行此项目?谢谢!

javascript node.js aws-lambda serverless-framework

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

二进制vs.字符串vs.数字,用于在DynamoDB分区键中存储UUID?

我正在尝试确定对DynamoDB表的分区键使用二进制,数字还是字符串。我的应用程序是React.js / Node.js社交事件管理应用程序,其中存储在DynamoDB中的数据量的一半将用于存储项目和属性与其他项目和属性之间的关系。例如:用户的朋友,活动的参加者等。

因为架构是如此繁琐,并且由于DynamoDB项的最大大小只有400KB,并且出于性能和成本的原因,我担心密钥占用太多空间。就是说,我想使用UUID作为分区键。有众所周知的原因,对于多个节点分发新密钥的分布式无服务器应用程序,他们更喜欢UUID(或类似的熵级别,并且发生碰撞的可能性很小)。

因此,我认为我的选择是:

  1. 使用十六进制编码的UUID(删除破折号后将存储32个字节)
  2. 使用base64(22个字节)编码UUID
  3. 使用z85(20个字节)对UUID进行编码
  4. 对密钥使用二进制类型的属性(16个字节)
  5. 对键使用数字类型的属性(16-18字节吗?)-数字类型只能容纳127位,因此我不得不执行一些技巧,例如剥离版本位,但是对于我的应用程序来说可能还可以。请参阅 在Number类型的DynamoDB属性中可以存储多少位整数数据?有关更多信息。

显然,开发人员的经验需要权衡。使用十六进制字符串最清晰,但最大。编码的字符串较小,但在日志记录,调试等过程中更难处理。Binary和Number比字符串更难,但最小。

我确定我不是第一个考虑这些折衷的人。是否有众所周知的最佳实践或启发式方法来确定应如何在DynamoDB中存储UUID密钥?

如果不是,那么我倾向于使用Binary类型,因为它是最小的存储,并且因为它的本机表示形式(作为base64编码的字符串)可以在人类需要查看和推理键的任何地方使用,包括查询,日志记录,和客户端代码。除了必须从一个转换到/ Buffer如果我使用DocumentClient,我错过了一些问题,在上面的列表中的其他选项之一的二进制类型或优势?

如果有问题,我正计划通过Lambda API进行对DynamoDB的所有访问,因此,即使需要进行转换或编组,也可以,因为我可以在我的API中进行操作。

顺便说一句,这个问题是一个已有 4年历史的问题(DynamoDB中的UUID数据类型)的续集,但是4年是一个快速发展的空间中的一个漫长的时间,因此我认为值得再次提出。

uuid amazon-web-services amazon-dynamodb serverless-framework aws-sdk-js

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

如何在 serverless.yml 中使用 lambda 的条件配置?

我需要配置 lambda viaserverless.yml以针对不同环境使用不同的配置并发。下面是我的 lambda 配置:

 myLambda:
   handler: src/lambdas
   name: myLambda
   provisionedConcurrency: ${self:custom.pc}

...

custom:
  pc: ${env:PC}
Run Code Online (Sandbox Code Playgroud)

PC 值是从环境变量加载的。它适用于大于 0 的值,但我无法0在一种环境中设置值。我想要做的是禁用dev环境中的配置并发。

我已阅读此文档https://forum.serverless.com/t/conditional-serverless-yml-based-on-stage/1763/3,但它似乎对我的情况没有帮助。

如何provisionedConcurrency根据环境设置条件?

amazon-web-services aws-lambda serverless-framework

5
推荐指数
2
解决办法
5865
查看次数

无服务器:从 SecretsManager 值创建 api 密钥

我有一个无服务器堆栈,将 API 部署到 AWS。我想使用存储在 Secrets Manager 中的 API 密钥来保护它。这个想法是在 SSM 中获取密钥的值,在部署时拉取它并将其用作我的 API 密钥。

无服务器.yml

service: my-app
frameworkVersion: '2'

provider:
  name: aws
  runtime: nodejs12.x
  ...
  apiKeys:
    - name: apikey
      value: ${ssm:myapp-api-key}
Run Code Online (Sandbox Code Playgroud)

据我所知,部署的 API Gateway 密钥应该与 SSM Secret 相同,但是当我在控制台中查看时,这两个值是不同的。我在忽略什么?也没有错误消息。

aws-api-gateway serverless-framework aws-secrets-manager

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

AWS Lambda Python 加密 - 无法打开共享对象文件

我正在开发一个部署到 AWS Lambda 的无服务器 Flask 应用程序。该程序使用密码学库(使用版本3.4.7)。在本地,程序运行良好,没有任何问题。但是,每当部署在 Lambda 上时,都会出现以下错误:

from cryptography.fernet import Fernet

File "/var/task/cryptography/fernet.py", line 16, in <module>

from cryptography.hazmat.primitives import hashes, padding

File "/var/task/cryptography/hazmat/primitives/padding.py", line 11, in <module>

from cryptography.hazmat.bindings._padding import lib

ImportError: /var/task/cryptography/hazmat/bindings/_padding.abi3.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当使用“危险材料”模块中的一些必需功能时,会出现非常相似的错误:

File "/var/task/cryptography/hazmat/primitives/kdf/pbkdf2.py", line 28, in __init__
    backend = _get_backend(backend)
File "/var/task/cryptography/hazmat/backends/__init__.py", line 23, in _get_backend
    return default_backend()
File "/var/task/cryptography/hazmat/backends/__init__.py", line 14, in default_backend
    from cryptography.hazmat.backends.openssl.backend import backend
File "/var/task/cryptography/hazmat/backends/openssl/__init__.py", line 6, in <module>
    from …
Run Code Online (Sandbox Code Playgroud)

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

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