【问题标题】:Is there a dsl for AWS EC2?AWS EC2 有 dsl 吗?
【发布时间】:2022-02-03 16:45:05
【问题描述】:

我正在考虑使用 Amazon 云服务(EC2、S3 等)进行托管。我一直在研究可以指定配置各种实例的 JSON 元数据,复杂性让我很担心。是否有 dsl 可以生成有效的 JSON 元数据,更重要的是验证条目?

【问题讨论】:

标签: dsl cloud-hosting


【解决方案1】:

不幸的是,我最近在搜索后发现了一个空白。我正在使用 Amazon Web Services CloudFormation(您说的是 JSON 元数据吗?)。

CloudFormation JSON 文件存在几个问题:

  1. 我的行数超过 1,500 行,无法阅读,
  2. 您无法表达 API 为您提供的所有内容,尤其是在虚拟私有云领域,
  3. 有很多 bug 需要很长时间才能修复,例如 Elastic Load Balancer 丢失 HTTPS 信息。

所以我一直在使用 Java API 在 Scala 中使用直接 API 调用。其实挺好看的。

Java API 有一种以with 开头的“setter”风格,返回this,因此它们可以被链接起来。在 Scala 中,您可以使用这些来充当穷人的 DSL。所以你可以做类似的事情

val updateRequest = new UpdateAutoScalingGroupRequest()
                    .withAutoScalingGroupName(group.getAutoScalingGroupName)
                    .withAvailabilityZones(subnetAZsOfOurVPC)
                    .withVPCZoneIdentifier(subnetNamesOfOurVPC)

as.updateAutoScalingGroup(updateRequest)

在 Scala 中使用 Java API 可以轻松完成其他事情。例如,将所有子网按 VPC 分组到一个地图中,只需这样做

val subnetsByVPC = ec2.describeSubnets(new DescribeSubnetsRequest).getSubnets.groupBy(_.getVpcId)

【讨论】:

  • 我基本上完成了这个,我使用 Java AWS API 构建了一些 groovy 脚本。我添加了一些元编程来对 API 进行常规化,并添加了一些缺失的选项。效果不错。
  • 我日常工作的需求使我无法为 Amazon Web Services Java API 编写成熟的 Scala DSL。这一定非常棒。而且,坦率地说,它比 CloudFormation 好得多,由于某种原因,它似乎并没有在亚马逊得到太多关注。很麻烦。
【解决方案2】:

如果有人仍在寻找 AWS CloudFormation DSL - 我们一直在使用 Ruby DSL for CloudFormation

https://github.com/bazaarvoice/cloudformation-ruby-dsl

  • 这个简洁的项目提供了一个工具来将您现有的 CloudFormation 模板转换为 Ruby DSL
  • 它将生成有效的 JSON 输出
  • 验证 Ruby 模板条目类似于验证常规 CloudFormation 模板(请参阅 cfn-validate-template
  • 您的模板变成了 Ruby 代码,因此很容易拥有可重用的模块 (DRY)
  • 您可以定义局部变量
  • 您的 DSL 模板中可以包含 cmets
  • 大大提高了可读性
  • 大大减小了 DSL 模板大小

CloudFormation 请求模板正文 size limits 很烦人 - 我们必须将大型 CloudFormation 模板上传到 S3,然后使用它们的 S3 URL 创建/更新堆栈。

【讨论】:

    【解决方案3】:

    现在有,虽然我还没有使用它:Coffin CloudFormation 的 CoffeeScript DSL。

    如果您不是在谈论 CloudFormation,而是在谈论更通用的 API,那么我发现的最好的接口是 AWS' own aws-sdk ruby gem。与他们发布的其他 SDK 不同,这些 SDK 做得很好但很粗糙,make-client/make-request/get-response/look-at-result 事务,ruby SDK wraps a nicer domain-model over the top, so you interact via collections at a higher abstract level

    它还具有相当不错的性能特性,如果您知道不需要新的响应,您可以缓存响应以节省往返时间。

    【讨论】:

      【解决方案4】:

      我有超过 3000 行的 CloudFormation 模板。我发现将 cmets 放入 JSON 非常有帮助!您只需在使用前将其剥离即可。有一个验证器可以验证模板并去除 cmets:http://cloudformation-validation.com/

      【讨论】:

      • 您几乎可以在 CloudFormation 模板中的任何位置添加“元数据”部分,它们可能包含任意数据,因此我将这些用于 cmets。这样做的好处是,任何遇到模板但不知道来源在哪里的人都可以将 cmets 保留在模板中。
      【解决方案5】:

      不,截至 2022 年 2 月,AWS 仍然没有为基础设施即代码提供任何特定于域的语言。它们与Azure's BicepTerraform's HCL 没有任何相似之处。

      这真的让我感到惊讶,因为我通常认为 AWS 比其他主要竞争对手(Azure 和 GCP)更昂贵,但领先于曲线。

      但是,Cloud Formation 现在允许 JSON 和 YAML 格式。略有改善??恕我直言,当您拥有代表整个云堆栈的整个存储库时,并非如此。如果您使用 AWS,请使用 Terraform 来管理 IaC。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-20
        • 2022-01-26
        • 2019-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-03
        • 1970-01-01
        相关资源
        最近更新 更多