标签: serverless-framework

如何使用无服务器部署功能,使其仅包含所需的文件夹/文件

    |--serverless.yml
    |--lib/
    |--node_modules/
    |--api/
        |--manageclient/
            |--addClient/
                |--handler.js
Run Code Online (Sandbox Code Playgroud)

这是我的文件夹结构,如何使用无服务器部署函数,使其仅包含 handler.js 和 node_modules/ 和 lib/。

您能否指定要在主 serverless.yml 上写入的功能命令?

我的YML函数声明

handler: api/manageclient/addClient/addclient.addclient
   package:
     exclude:
       - ./*
       - !api/manageclient/addClient/**
       - !api/node_modules/**
       - !api/lib/**
Run Code Online (Sandbox Code Playgroud)

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

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

如何确定 Lambda 是在本地运行还是在 Java AWS 无服务器框架设置下的 AWS 下运行

我正在使用 AWS SAM Java 无服务器应用程序。我正在使用 eclipse AWS 无服务器插件创建简单的基于 Dynamo DB 的 CRUD 应用程序。应用程序接受 http 请求,并根据 HTTP 方法尝试在 DynamoDB 上执行相应的 CRUD 操作。

因此,除了我无法弄清楚如何将环境变量或属性文件传递到我的 Lambda java 代码以确定 lambda 是在本地运行还是在 AWS 环境中运行之外,一切都运行良好。根据我想要使用本地 Dynamo DB 客户端或 AWS DB 客户端的情况。这是代码片段:

    String environment = System.getenv("profile");
    AmazonDynamoDB dynamoDBclient = null;

    if("local".equalsIgnoreCase(environment)) {
        dynamoDBclient = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
                new AwsClientBuilder.EndpointConfiguration("http://172.16.123.1:8000", "local"))
                .build(); 
    } else {
        dynamoDBclient = AmazonDynamoDBClientBuilder.standard().build();
    }

    dynamoDBMapper = new DynamoDBMapper(dynamoDBclient);
Run Code Online (Sandbox Code Playgroud)

试图弄清楚如何传递这个环境变量“profile”。在 SAM 本地运行/调试配置中,我没有看到任何选项可以执行此操作。

java amazon-web-services serverless-framework

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

在 CloudFormation 或 serverless.yml 中提供 OriginAccessIdentity 参考

我想要一个可以访问私有 S3 存储桶的 CloudFront 分配。为此,我必须创建一个原始访问身份。手动,我可以使用 AWS 控制台来做到这一点,但我想通过 CloudFormation 脚本或无服务器(使用serverless.yml)来创建它。在执行此操作时,我可以将原始访问身份的物理 ID 添加到我的 CloudFront 分配(使用一个脚本)。

相关文档:https : //docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-cloudfront.html

我试过这个:

myDistribution:
  Type: AWS::CloudFront::Distribution
  Properties:
    DistributionConfig:
      Origins:
      - DomainName:bucket.s3.amazonaws.com
        Id: myS3Origin
        S3OriginConfig: {
          OriginAccessIdentity:origin-access-identity/cloudfront/ !Ref cloudfrontoriginaccessidentity
        }
      Enabled: 'true'
      Comment: Some comment
      DefaultCacheBehavior:
        ForwardedValues:
          QueryString: 'false'
          Cookies:
            Forward: none
        AllowedMethods:
        - GET
        - HEAD
        - OPTIONS
        TargetOriginId: myS3Origin
        ViewerProtocolPolicy: redirect-to-https
      PriceClass: PriceClass_200
      ViewerCertificate:
        CloudFrontDefaultCertificate: 'true'
cloudfrontoriginaccessidentity:
  Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
  Properties:
    CloudFrontOriginAccessIdentityConfig:
      Comment: "some comment"
Run Code Online (Sandbox Code Playgroud)

我必须创建一个原始访问身份和一个具有此身份的 CloudFront 分配。我们可以在一个 CloudFormation 脚本中或使用无服务器(使用serverless.yml)来完成这两项工作吗?

amazon-s3 aws-cloudformation serverless-framework serverless

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

无服务器框架不是通过配置在 AWS 上部署 API 网关

我正在尝试使用无服务器框架创建一个 Lambda,当客户端连接到 websocket API 网关时调用它。AWS CloudFormation 正在创建已定义但未创建 websocket API 网关的 Lambda 函数。

在尝试编写自己的(不起作用)之后,我将我在无服务器文档中找到的示例复制并粘贴到新创建的无服务器文件夹中,只是为了看看它是否可以工作 - 它没有,我可以找不到其他似乎有类似问题的人。


到目前为止,我已经尝试了此处记录的简单和扩展方法(这是示例代码所基于的方法):https : //serverless.com/framework/docs/providers/aws/events/websocket/

我也尝试关注这个博客,这也导致了 Lambda 的创建,但没有创建 API 网关。 https://serverless.com/blog/api-gateway-websockets-example/

这是我的 serverless.yml 文件。除了 API 网关之外,它按照我的预期进行部署:

service: temp
provider:
  name: aws
  runtime: nodejs8.10
  region: eu-west-2

functions:
  default:
    handler: handler.connect
    events:
      - websocket: 
        route: $default
Run Code Online (Sandbox Code Playgroud)

这是无服务器部署 -v 输出:

$ serverless deploy -v
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
CloudFormation - CREATE_IN_PROGRESS - AWS::CloudFormation::Stack - temp-dev
CloudFormation - CREATE_IN_PROGRESS …
Run Code Online (Sandbox Code Playgroud)

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

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

如何在 serverless.yml 中引用二级索引?

我不太清楚引用或变量如何与 CloudFormation 一起工作。

目前我在 serverless.yml 中的 iAmRole 看起来像:

  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      # Restrict our IAM role permissions to
      # the specific table for the stage
      Resource:
        - "Fn::GetAtt": [ ReportsTable, Arn ]
Run Code Online (Sandbox Code Playgroud)

ReportsTable 是在另一个文件中创建的表,如下所示:

Resources:
  ReportsTable:
    Type: AWS::DynamoDB::Table
    Properties:
    ...
    LocalSecondaryIndexes:
        - IndexName: typeId-accessToken-index
          KeySchema:
          - AttributeName: typeId
            KeyType: HASH
            ...etc
Run Code Online (Sandbox Code Playgroud)

我知道 Fn::GetAtt 数组中的第二个值引用了一个属性名,但我不明白 Arn 来自哪里。它看起来像一个变量,但它没有在任何地方定义。

最终,我需要添加另一个引用我创建的本地二级索引的 Effect、Action、Resource 块,但我不知道从哪里开始。

编辑:看起来 Arn 来自 dynamoDB 表返回值( …

aws-cloudformation serverless-framework aws-serverless

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

如何获取 Cloud Formation 特定资源属性的 AWS Lambda 函数的 ARN?

我似乎无法获取RefFn:GetAtt返回用于设置资源的有效值。

无服务器.yml

...etc...

functions:
  bearerTokenAuthentication:
    handler: app.bearerTokenAuthentication
    name: ${self:service}-auth-bearer

resources:
  - ${file(./serverless_resources.yml)}
Run Code Online (Sandbox Code Playgroud)

serverless_resources.yml

Resources:
  ApiGateway:
    Type: AWS::ApiGateway::RestApi
    Properties:
        Name: restapi-${self:provider.stage}
        Description: Endpoints
        ApiKeySourceType: HEADER # (to read the API key from the X-API-Key header of a request)

  ApiGatewayBearerAuthorizer:
    Type: AWS::ApiGateway::Authorizer
    Properties:
      Type: token
      IdentitySource: method.request.header.Authorization
      Name: BearerAuthorization
      AuthorizerResultTtlInSeconds: 300
      AuthorizerUri: !Join  #arn:aws:apigateway:${self:provider.region}:lambda:path/${self:functions.bearerTokenAuthentication.name}
        - ''
        - - 'arn:aws:apigateway:'
          - !Ref 'AWS::Region'
          - ':lambda:path/2015-03-31/functions/'
          - !GetAtt 
            - bearerTokenAuthentication # also tried !Ref bearerTokenAuthentication and '${self:functions.bearerTokenAuthentication.name}'
            - Arn
          - …
Run Code Online (Sandbox Code Playgroud)

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

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

使用 aws 角色执行无服务器部署

我正在尝试使用无服务器框架部署一个简单的 lambda 函数。我的 IAM 用户没有运行 cloudformation 的必要权限:

User: arn:aws:iam::xxx:user/xxx is not authorized to perform: cloudformation:DescribeStacks on resource: arn:aws:cloudformation:us-east-1:xxx:stack/xx
Run Code Online (Sandbox Code Playgroud)

这或多或少是有意为之,因为我们的设置使用 IAM 角色来执行某些任务。我已经在 ~/.aws/config 文件中配置了这些角色,对于 aws cli 操作,我可以调用

aws s3 ls --profile myrole
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我将角色“myrole”中的所有策略附加到我的 IAM 用户以执行 aws-cli 命令。

有没有什么方法可以为无服务器做类似的事情,即将角色(不是不同的用户)附加到

serverless depoly 
Run Code Online (Sandbox Code Playgroud)

陈述?

如果我通过导出更改角色

AWS_PROFILE=myrole

或打电话

serverless deploy --aws-profile myrole

我得到Error: Profile myrole does not exist即使的角色定义 /.aws/credentials~/.aws/config

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

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

lambda 层是否包含 aws-sdk

我正在使用无服务器框架以及 lambda 层和几个 lambdas 函数。我必须包含 aws-sdk 才能支持某些功能。

aws-sdk 的 lambda 层大小为 80MB,而 aws-sdk 单独占用 40MB。

我所知道的是 Lambda 函数默认包含 aws-sdk。但这是否也意味着 lambda 层?

笔记

  • 我尝试删除 aws-sdk 并部署,并且 lambda 函数显示错误“找不到模块 aws-sdk”
  • NODE_PATH: "./:/opt/node_modules" 包含在 serverless.yml 中(这是否会导致默认情况下不包含 aws-sdk)?
  • 运行时是 nodejs10.x

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

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

混合 Terraform 和无服务器框架

这更像是一个悬而未决的问题,我只是希望得到任何意见和建议。我想到了 AWS,但它可能也与其他云提供商有关。

我想提供易于维护并涵盖现代无服务器架构的所有要求的 IaaC 解决方案。Terraform 是定义基础设施的绝佳工具,拥有众多官方资源和来自社区的稳定支持。我真的很喜欢它的语法和模块的整个概念。然而,使用 Lambdas 是非常糟糕的。它还提出了另一个问题:是否应该使用与基础架构更改相同的流程来部署代码更改?代码和基础设施之间的界限在哪里?

另一方面,无服务器框架允许非常容易地开发和部署 Lambda。当谈到资源的使用时,它非常自以为是,但它带有许多值得一试的开箱即用功能。它不应该真正用于定义整个基础设施。

我目前的方法是使用 Terraform 定义任何共享资源,使用 Serverless 定义任何与域相关的资源。这里我有另一个与我之前的问题相关的问题:部署依赖。简单的场景:Lambda.1将用户添加到Cognito(共享资源)Lambda.2作为触发器。我必须创建一个自定义解决方案来管理部署顺序(Lambda.2必须先部署等)。可以将无服务器框架部署连接到 Terraform 中,但话又说回来:代码部署是否应该与基础设施部署混合?

amazon-web-services terraform serverless-framework serverless

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

AWS Lambda + Angular Web 应用程序抛出“错误:找不到模块‘@vendia/serverless-express’”

我正在尝试按照教程https://medium.com/better-programming/getting-started-with-serverless-angular-universal-on-aws-lambda-8754bcc4dc19在 AWS 无服务器 Lambda 上部署 Angular Web 应用程序

直到上周它都运行良好,但开始抛出错误“错误:找不到模块‘@vendia/serverless-express’”,即使在任何地方都没有提到‘@vendia/serverless-express’。生成的 lambda.js 使用“aws-serverless-express”。

通过 npm 安装“@vendia/serverless-express”,它被添加到 package.json。部署后,仍然报告错误。

重现步骤:

  1. 确保 angular 版本为 7 或更低,因为工具包不适用于更高版本
  2. ng new project-name --style css --routing false
  3. cd 项目名称
  4. ng 添加@ng-toolkit/universal@7.1.2
  5. npm run build:prod
  6. npm 运行服务器
  7. ng 添加@ng-toolkit/serverless@8.1.0
  8. npm i serverless-api-compression
  9. npm 运行构建:无服务器:部署

如果需要任何进一步的信息,请告诉我。提前致谢!

amazon-web-services serverless-framework angular aws-serverless

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