您如何看待使用您喜欢的编程语言来配置您的基础架构?

基于 CloudFormation 的 AWS CDK(云开发工具包)已经发布了几年来实现这一目标。

作为 Terraform 的忠实粉丝,我对旨在将 AWS CDK 与 Terraform 结合使用的 CDKTF 项目产生了浓厚的兴趣。

在进入 CDKTF 之前,让我们重温一些基本概念。

基础设施即代码

基础架构即代码 (IaC) 基本上是通过定义文件或代码而不是手动或交互式配置来管理和配置 IT 资源(在云中或不在云中)的过程。

主要目标是提供一种集中方式来管理实施和版本控制方面的配置。因此,所有更改都可以使用标准部署管道作为发布过程的一部分进行验证、测试和配置。

在您的下一个项目中使用 IaC 有很多好处:

  • 速度和安全性:您在简单和重复的任务上花费的精力要少得多。

  • 文档:您可以像任何软件项目一样轻松地记录您的代码。

  • 测试:您可以为您的项目编写测试。

现在,我们知道了 IaC 是什么,让我们来谈谈 Terraform,它是目前最流行的 Iac 工具!

地形

Terraform 是 HashiCorp 于 2014 年创建的开源工具。它允许您使用称为 HCL(代表 Hashicorp 配置语言)的简单声明性语言将基础架构定义为代码,以便跨各种公共云提供商部署和管理该基础架构(例如,亚马逊网络服务、微软 Azure、谷歌云平台、DigitalOcean)、私有云和虚拟化平台。

如果你想深入研究 Terraform,我推荐这本优秀的书:Terraform: Up & Running,作者是 O'Reilly。

AWS CDK

AWS 云开发工具包 (AWS CDK) 是由 AWS 发起的开源框架,用于在代码中定义您的云基础设施并通过 AWS CloudFormation 对其进行预置。

使用当前编程语言的熟悉度和表达能力,它提供了称为构造的高级组件,这些组件使用经过验证的默认值预配置云资源,因此您可以轻松构建云应用程序。

[AWS CDK 架构](https://res.cloudinary.com/practicaldev/image/fetch/s--bN3koPe8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/4rwlemnzh6p0nijy700j.png)

您将在文档中找到更多信息

Terraform 的云开发工具包 (CDKTF) 是 Hashicorp 和 AWS 团队合作利用 Terraform 生态系统定义和配置您的基础设施的成果。这允许您在不学习 HashiCorp 配置语言 (HCL) 的情况下使用 Terraform。

CDKTF 目前支持 TypeScript、Python、Java、C# 和 Go(实验性)。

[AWS CDK Terraform](https://res.cloudinary.com/practicaldev/image/fetch/s--GKxgdx59--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/zpv0ciah1bb7zthgvdwr.png)

更多信息来自文档

对于本教程,我们将使用 Python。

Python 是最容易学习的语言之一,对于快速编写脚本和自动化任务非常有帮助。如果你是 Python 新手,我推荐你这个平台开始。

先决条件

—蟒蛇 (3.10)

—管道

—npm

安装

要将 cdk 与 terraform 一起使用,您必须运行以下命令:

$ npm install --global cdktf-cli@latest

进入全屏模式 退出全屏模式

这将安装 cdktf CLI,它允许为各种语言启动新项目。

我们可以通过运行来搭建一个新的 python 项目:

$ mkdir s3-demo && cd s3-demo

$ cdktf init --template="python" --local

进入全屏模式 退出全屏模式

我们使用选项 --local 表示我们将使用 local state storage 来生成 Terraform。

在实际项目中,建议使用远程后端。

默认情况下创建了许多文件。

对于我们的演示,我们将使用 AWS 作为云提供商,因此我们需要安装所需的提供商。

$ pipenv install cdktf-cdktf-provider-aws

进入全屏模式 退出全屏模式

您可以在项目根目录编辑main.py并添加以下代码:

#!/usr/bin/env python
from constructs import Construct
from cdktf import App, TerraformOutput, TerraformStack
from cdktf_cdktf_provider_aws import AwsProvider, s3
# Define your stack

class MyStack(TerraformStack):
    def __init__(self, scope: Construct, ns: str):
        super().__init__(scope, ns)

        # Configure the AWS provider to use the eu-west-3 region
        AwsProvider(self, "AWS", region="eu-west-3")

        # Create your first bucket
        # pass the id of the resource and the name of the bucket
        first_bucket = s3.S3Bucket(
            self, "first_bucket",
            bucket="blog.abdelfare.me",
            acl="public-read"
        )

        TerraformOutput(self, "bucket_name", value=first_bucket.bucket)
        TerraformOutput(self, "bucket_arn", value=first_bucket.arn)

app = App()
MyStack(app, "s3-demo")

app.synth()

进入全屏模式 退出全屏模式

我发现 SDK 非常直观。

基本上,我们创建了继承自TerraformStack类的Main Stack。我们设置了 aws 提供程序(不要忘记定义 AWS 配置文件)并在一行代码中创建了我们的第一个 S3 存储桶

TerraformOutput允许导出一些值并在另一个堆栈中重用它们。

现在一切准备就绪,我们可以通过运行以下命令生成 terraform 配置文件:

$ cdktf synth

进入全屏模式 退出全屏模式

我们可以看到包含所有 terraform 配置的新目录cdktf.out

这一步相当于执行命令terraform plan.

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--w1gaa-Kv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/tp6vmcf1j1738hthw9x4.png)

我们可以通过运行以下命令来部署我们的堆栈:

$ cdktf deploy

进入全屏模式 退出全屏模式

此命令在后台运行terraform apply

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--wnseyr0i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/opgudyp6vb1950p1koko.png)

我们可以看到所有的新变化并确认执行。

我们去吧!

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--ez5AZs6c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/ygny8v97jdsxflmonlo4.png)

我们的存储桶已成功创建。

我们可以使用以下命令查看堆栈的输出:

cdktf output

进入全屏模式 退出全屏模式

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--ssImfR6W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/eki04vamvfe0jlol7i5o.png)

我们现在可以通过运行以下命令来销毁我们的堆栈:

$ cdktf destroy

进入全屏模式 退出全屏模式

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--sEnaGWx1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/3jpj1j25jzmtxakyi0ui.png)

何时将 CDK 用于 Terraform

CDKTF 提供了许多好处,但它并不是每个项目的正确选择。在以下情况下,您应该考虑使用 CDKTF:

  • 您有强烈的偏好或需要使用过程语言来定义基础架构。

  • 您需要创建抽象来帮助管理复杂性。

  • 您可以轻松进行自己的故障排除,不需要商业支持。

需要考虑的一些痛点:

  • 初始 CDK 设置很耗时

  • 由于综合步骤,部署时间可能会很慢

你有使用 CDKTF 的经验吗?你在生产中使用过吗?

随时在评论中与我们分享您的经验。

您可以在我的 github repo上找到本文的代码。

在下一篇文章中,我将使用 *ECSFargateECRALBCDK + Terraform 搭建一个完整的容器化架构,敬请期待😃!*

点击阅读全文
Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐