如果您正在使用 AWS 基础设施,您可能知道目前有一些工具/框架支持来实施您的 AWS 基础设施,例如CloudFormation、Terraform、AWS CDK。您的团队可以依赖和使用的最佳工具是什么?什么是可以帮助您提高生产力和质量的最佳工具?你有答案吗?如果没有,请阅读这篇文章,我会给你我们的答案和理由。

我们的团队已经与 AWS 合作了几年。我们设计并实施了基础设施组件,包括网络服务器存储以及手动自动化的其他 AWS 服务。在使用 AWS CDK 之前,我们使用过 AWS CloudFormation,但使用它是一项挑战,很难在 JSONYAML 中定义和获得复杂模板的概述 格式。

在这篇文章中,我不会提供 AWS CDK 的具体细节。 如果您不知道它是什么,请查看AWS CDK 主页以获得一些概述并了解它是如何工作的。

[AWS CDK 示例](https://res.cloudinary.com/practicaldev/image/fetch/s--440Ge0-M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i1 .wp.com/blog.innomizetech.com/wp-content/uploads/2019/11/Screen-Shot-2019-11-11-at-9.40.30-PM.png%3Ffit%3D640%252C514%26ssl%3D1 )

如何使用 AWS CDK 在 AWS 上创建 VPC 的示例代码

我们选择 AWS CDK 作为基础设施即代码 (IaC) 的主要工具,原因如下:

借助 AWS CDK,我们“少写多做

当我们尝试寻找替代方法来降低复杂性并克服使用 CloudFormation 的挑战时,我们首先给 AWS CDK 留下了深刻印象。例如,我们有一个 CloudFormation 模板来定义和配置网络资源,包括 VPC、子网、路由表、安全组、堡垒主机、集成网关、nat 网关等。我们需要在中编写大约 1000 行代码使用 CloudFormation 的 JSON 格式。当我们尝试使用 AWS CDK 时,我们只需要编写大约 50 行代码。如您所见,AWS CDK 可以做同样的事情,甚至添加更多功能,例如 NAT 网关的条件数量、子网数量和可用区。

以下代码将创建所有必需的资源,允许您在几分钟内在 AWS 上创建新的 VPC,然后您可以根据您的要求修改或添加更多资源:

import * as cdk from '@aws-cdk/core';
import * as ec2 from '@aws-cdk/aws-ec2';

export class NetworkStack extends cdk.Stack {
  public readonly vpc: ec2.Vpc;

  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    this.vpc = new ec2.Vpc(this, 'VPC', {
      cidr: '10.0.0.0/16',
      natGatewaySubnets: {
        subnetName: 'Public'
      },
      subnetConfiguration: [
        {
          cidrMask: 26,
          name: 'Public',
          subnetType: ec2.SubnetType.PUBLIC
        },
        {
          name: 'Application',
          subnetType: ec2.SubnetType.PRIVATE
        },
        {
          cidrMask: 27,
          name: 'Database',
          subnetType: ec2.SubnetType.ISOLATED
        }
      ]
    });

    const vpcSecurityGroup = new ec2.SecurityGroup(this, 'SecurityGroup', {
      vpc: this.vpc,
      description: 'Allow ssh access to ec2 instances',
      allowAllOutbound: true
    });

    vpcSecurityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(22),
      'allow ssh access from the world'
    );
  }
}

易于共享和重用您的基础设施作为图书馆

声明式基础设施即代码往往使用我们不每天使用的语言,例如 HCL、YAML 或 JSON。 AWS CDK 使用面向对象,提供抽象技术来创建我们系统的模型,我们可以定义模块跨项目共享。我们可以使用内置的构建库或来自社区的可以提高生产力的工具。

CDK 是 Cloud Formation 的开发者友好版本

AWS CDK 是一种命令式编程语言,支持 Java、JavaScript、Python、TypeScript 和 .NET。我们可以利用我们的开发人员编程技能来减少学习新语法(如 Terraform)的时间。考虑一个项目,我们使用 TypeScript 作为前端、后端、CI/CD 和 IoC 的主要编程语言。

在定义基础架构时易于使用逻辑(if 语句、for 循环等)

我们知道如何编写 if 或 for 循环,对吧?使用 CloudFormation 时编写条件有多难?如果您知道答案,那么您就会知道为什么喜欢 AWS CDK。

[CDK条件逻辑](https://res.cloudinary.com/practicaldev/image/fetch/s--mCegVct2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i2.wp .com/blog.innomizetech.com/wp-content/uploads/2019/11/image-9.png%3Ffit%3D640%252C241%26ssl%3D1)

使用 AWS CDK 的条件逻辑

易于获取并与我们的编码审查工作流程集成

AWS CDK 提供了生成CloudFormation 模板的命令,所以我们仍然可以在应用之前查看生成的CloudFormation 模板,它还可以生成dif 以便于查看和做出决定。

在您的 IDE 中完成代码

有谁记得如何使用 CloudFormation 定义 AWS 资源的完整细节? CloudFormation 模板是否有任何 schemaintelligent 可用于 code completion 以加快编码时间?

[CDK代码完成](https://res.cloudinary.com/practicaldev/image/fetch/s--aHQY3UTN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i0.wp .com/blog.innomizetech.com/wp-content/uploads/2019/11/Screen-Shot-2019-11-11-at-9.46.41-PM.png%3Ffit%3D640%252C346%26ssl%3D1)

使用 AWS CDK 完成代码

允许我们测试我们的代码

AWS CDK 允许我们执行快照测试、细粒度断言,帮助我们构建可靠和可测试的代码,这里的是帖子,它提供了使用Jest编写和运行单元测试的分步指南。使用 CloudFormation,您还可以编写一些测试,但它需要另一个工具,查看这个帖子更多详细信息。

易于与我们的 CI/CD 流程集成

部署可以通过一个需要安装任何附加工具的命令来完成。我们还使用 AWS CDK 使用 AWS DevOps 工具(例如 CodeBuild、CodeDeploy)来定义我们的 CI/CD 管道,这比编写大量 CloudFormation 代码要好得多。

AWS CDK 只是高级别的 CloudFormation,所以如果您想了解它的工作原理,我的建议是尝试使用 CloudFormation,围绕它做一些工作,然后尝试将其转换为 AWS CDK,您会发现是继续使用 CloudFormation 还是更改为使用 AWS,或者您可以更改为其他工具,例如 Terraform。

没有什么是最好的,这取决于您的要求、团队、项目和您的公司有一个很好的编码!

这篇文章最初发表在我们的博客上。

为什么你

学会分享和分享学习。

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐