用于部署Backend的AWS服务是哪种?

时间:2017-07-03 18:19:19

标签: angularjs amazon-web-services amazon-s3 amazon-ec2 aws-lambda

我有一个网站(静态坐在s3中),内容是从s3提供的。我打算写一个休息api(节点或对建议开放)。当前端进行角度$ http调用时,例如,如果我的网站名为example.com,那么调用将是相对url(/ Update)应该被解决的。

我不确定,我应该使用什么类型的aws服务来部署我的后端代码。

更新

我正在使用Codestar,使用Express网络服务。这是我的template.yml。和路线。代码星构建很顺利,但部署失败。

template.yml

    AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
- AWS::CodeStar

Parameters:
  ProjectId:
    Type: String
    Description: AWS CodeStar projectID used to associate new resources to team members

Resources:
  HelloWorld:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs4.3
      Role:
        Fn::ImportValue:
          !Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
      Events:
        GetEvent:
          Type: Api
          Properties:
            Path: /
            Method: get
        PostEvent:
          Type: Api
          Properties:
            Path: /
            Method: post
  GetItemsBylId:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs4.3
      Role:
        Fn::ImportValue:
          !Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
      Events:
        GetEvent:
          Type: Api
          Properties:
            Path: /api/getItemsBylId/:id
            Method: get

这是我的 app.js

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send({
    "Output": "Hello World!"
  });
});

app.get('/api/GetItemsBylId/:id', function (req, res) {
    res.send({
      "Output": "I am up!"
    });
});

以下是 GetItemsBylId

部署时的错误
   Failed to set tags on AWS::Lambda::Function. IAM permissions lambda:ListTags, lambda:TagResource and lambda:UntagResource are required to tag AWS::Lambda::Function resources and to propagate stack level tags.

我很确定这是因为id param。

更新

使用查询参数解决了标记问题。而不是使用,resouce:id,我现在正在使用?id =""。

4 个答案:

答案 0 :(得分:5)

这里有几件事需要考虑:

<强> API Gateway + Lambda

Lambda通常被认为是无服务器解决方案。您只需编写代码,而不是担心底层基础架构,底层AWS托管资源就会为您运行。 API网关与Lambda集成,允许您将各种REST样式的URL映射到Lambda函数。

优点

  • 快速通话非常划算
  • 通过内置SDK轻松与AWS服务集成
  • 使用IAM角色以便轻松访问服务而无需担心凭据
  • 其中大量可以并行运行以处理大量通话
  • 支持多种语言,包括NodeJS
  • 不必担心可用区域

缺点

  • 资源有限
  • 处理本机编译包可能有点麻烦
  • 5分钟的硬限制。这可以使处理图像/视频等任务成为不太可能使用的候选者。
  • 磁盘空间非常有限

<强> Elastic Container Service

利用EC2实例将它们分割成容器的有趣方法。如果您习惯于处理泊坞窗图像,那就太好了。

优点

  • 处理大型文件的更好方法
  • 无需担心Lambda超时
  • 能够分割EC2实例以更好地利用整个机器资源并获得您支付的费用

缺点

  • 如果您不熟悉Docker / Containers,可能很难理解
  • 仍然比Lambda路线贵一点
  • 如果您要处理高IO类型设置,可能需要重新考虑
  • 可能需要处理映射路线 - &gt;服务
  • 您必须小心,您的实例不在单个可用区中,从根本上降低所有服务,直到您可以在另一个可用区中启动新资源。

<强> Elastic Compute (EC2)

我建议您查看更多以IO为中心的工作负载。有许多可用选项,包括预配置IOPS,实例存储,高IO实例类型等。

优点

  • 对系统的最大控制,以及对于那些习惯于传统VPS托管的人来说可能更容易的设置
  • 当您需要处理自定义库,本机代码,各种语言时,会轻松很多
  • 附加到EC2实例的IAM角色可用于允许底层代码轻松访问AWS资源
  • 许多可用于高IO,高带宽和其他需求的实例类型
  • 可以自定义系统,然后将其转换为AMI以允许可重现的系统
  • 可能比Docker / Container解决方案更容易使用
  • 可以轻松使用负载均衡器/自动缩放组根据需要进行扩展和缩小,同时能够指向单个端点(负载均衡器)而不必担心

缺点

  • 成本将成为一个问题
  • 持续监控,以确保您的实例类型符合您的需求,并且您没有充分利用您的付款
  • 定价模式可能有点奇怪,因为每小时与每月相比。然而,有成本估算计算器可以让您知道您的每月估算成本。
  • 如果您使用负载平衡(这是理想的)还有其他成本
  • 必须考虑放置服务器的可用区域,尽管Auto Scaling Groups可以帮助实现自动化。不过,这是另一个要考虑的成本点。
  • 您可以管理底层操作系统,包括更新

<强> Elastic Beanstalk

这是EC2方面的一个很好的界面。如果您只想运行代码并且宁愿做出大部分关于运行它的位置/方式的决定,那么这将非常有用。

优点

  • 对基本用例进行大量猜测
  • EC2 +负载均衡的大部分优点

缺点

  • 由于资源是抽象的,您需要更加谨慎地了解您所承担的成本
  • 可以使对底层资源进行修改变得更加困难(尽管此时您可能处于可以在没有Elastic Beanstalk的情况下管理事物的级别)

现在关于您可能需要存储的数据库:

<强> DynamoDB

NoSQL数据存储。如果您可以将数据存储为键值对而没有相互之间的大量相关数据,那么这个价格很合理。免费等级限制也很好。

优点

  • 管理读/写负载的简单方法
  • 非常快
  • 如果需要,可以使用缓存
  • 价格非常优惠的免费套餐模型

缺点

  • 不适合处理具有大量关系的结构化数据以及查询这些关系的需要
  • 有索引,但如果您需要额外的索引,则开始付费
  • 可能会让那些不熟悉NoSQL的人感到困惑
  • 免费套餐开始进入每小时和每GB定价
  • 更容易找到处理常用关系数据库的SDK / API

<强> SimpleDB

就像这个名字说的一个相当简单的数据库一样。这适用于处理相当小的工作负载或临时存储数据的位置。

优点

  • 可以处理结构化数据
  • 根据具体的使用时间段向您收取费用,而不是向您收取的费用,例如您对EC2的费用
  • 免费等级适用于小负荷

缺点

  • 如果您想存储大量数据为1GB免费分层限制
  • ,那就不太理想了
  • 定价模式可能有点令人困惑
  • 如果您需要进入高读/写工作流程,不推荐使用
  • 如果您需要结构化数据并且几乎一直访问它,可能更适合使用RDS解决方案

<强> RDS

您对大多数人都熟悉的数据库的期望。包括MySQL,Aurora(亚马逊定制的MySQL),PostgreSQL,Oracle,SQL服务器。

优点

  • 与许多人习惯处理数据库的方式更为匹配
  • 使用结构化数据比使用DynamoDB更好
  • 由于它受到热门数据库的支持,因此可以更轻松地进行数据导入/导出,尤其是当您想在本地检查数据时
  • SQL客户端在大多数编程语言中都是相当标准的,因此与
  • 接口将更加容易

缺点

  • 与DynamoDB的免费套餐
  • 相比没有那么好
  • 根据需要可能会变得昂贵
  • 调整IO性能需要更多一点

我想我已经触及了基本的优点和缺点,但可能会遗漏一些评论部分会在此之后提醒我的项目。我还强烈建议查看所有链接的网站,以便更好地了解服务以及满足您的需求,因为我只能回答这个问题。

答案 1 :(得分:1)

没有足够的信息可以给你一个好的答案。这取决于您的后端需要做什么以及它需要如何扩展。如果您只需要提供简单的功能,AWS Lambda函数就是一种好的,简单且非常便宜的方式,无需启动整个EC2实例。 Lambda函数支持Node.js(以及Python,C#和Java)。

这是一种很好的方式,可以在没有太多承诺的情况下尝试。如果您决定需要更合适的服务器环境或需要执行诸如写入文件系统之类的操作,则代码应该很容易移动到运行Node的EC2实例。

在子域即api.example.com上托管您的API可能更容易,而不是在与您的S3存储桶相同的域下,但如果您需要它们都在同一个域下,您可以通过设置在网关中启动S3代理。 (http://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html

答案 2 :(得分:1)

你应该看看AWS Codestar

单按钮推送,您将拥有一个完全运行的CI / CD管道和公开可用的端点供您开发。

答案 3 :(得分:1)

我建议使用无服务器。我也试过了codestar但遇到了一个限制错误

  

AWS CodeStar在处理您的请求时遇到错误:无法创建或更新IAM中的一个或多个策略。项目中的资源数量已超过IAM策略大小限制。请尝试使用不同的参数,或联系AWS Support。

支持说没有解决方法我的template.yml中有大约19个函数,但是当我添加更多它会给我这个错误,我不知道如何解决这个问题,没有项目最多可以有19个功能