背景

AWS CDK(Cloud Development Kit)是一种软件开发框架,使开发人员能够使用常见的编程语言(如TypeScript、Python、Java等)来定义基础设施即代码(Infrastructure as Code,IaC)。CDK 允许开发人员使用编程语言中的类和方法来创建 AWS 资源,而不是手动编写模板文件。

CDK 的一些特性包括:

  1. 多语言支持:CDK 支持多种编程语言,包括TypeScript、Python、Java、C#等,使开发人员可以使用自己喜欢的语言来定义基础设施。
  2. 丰富的构造库:CDK 提供了大量的构造库(Construct Libraries),涵盖了 AWS 中几乎所有的服务和资源,这使得开发人员可以方便地创建各种复杂的基础设施。
  3. 抽象层:CDK 通过提供高级的抽象层来简化基础设施的定义过程,开发人员可以使用更具表现力和可重用性的概念来描述他们的基础设施。
  4. 类型安全:使用 CDK 进行开发时,可以利用所选编程语言的类型系统来实现类型安全,这有助于减少错误,并提供更好的开发体验。
  5. 部署工具:CDK 提供了用于部署基础设施的命令行工具,使得将定义的基础设施部署到 AWS 环境变得简单和快速。

cdk配置

  1. 安装 Node.js:CDK 是基于 Node.js 构建的,因此首先需要安装 Node.js。你可以从 Node.js 官方网站下载并安装适用于你操作系统的 Node.js 版本。
  2. 安装 AWS CDK CLI:CDK 提供了一个命令行界面(CLI),你可以使用它来创建、部署和管理 CDK 应用程序。安装 CDK CLI 可以通过 npm(Node.js 包管理器)进行安装。在命令行中运行以下命令来全局安装 CDK CLI:
Copy code
npm install -g aws-cdk
  • 1.
  • 2.
  1. 验证安装:安装完成后,在命令行中输入以下命令来验证 CDK 是否成功安装:
css
Copy code
cdk --version
  • 1.
  • 2.
  • 3.

如果一切顺利,你应该看到 CDK 版本号的输出。

  1. 配置 AWS 访问凭证:CDK 需要访问你的 AWS 账户才能创建和管理资源。你可以通过 AWS CLI 配置访问凭证,或者在 ~/.aws/credentials 文件中手动配置凭证。确保你的凭证具有足够的权限来创建和管理所需的 AWS 资源。
  2. 选择编程语言:CDK 支持多种编程语言,包括 TypeScript、Python、Java 等。选择一种你熟悉的语言,并确保你已经安装了相应的开发环境和工具。

项目

cdk init app --language python


cdk deploy
  • 1.
  • 2.
  • 3.
  • 4.

python项目代码

from aws_cdk import (
    # Duration,
    Stack,
    # aws_sqs as sqs,
    ec2,
)
from constructs import Construct

class Ec2PythonStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # The code that defines your stack goes here

        # example resource
        # queue = sqs.Queue(
        #     self, "Ec2PythonQueue",
        #     visibility_timeout=Duration.seconds(300),
        # )

        # VPC (Customize VPC configuration as needed)
        vpc = ec2.Vpc(self, "MyVpc",
            max_azs=2,
            subnet_configuration=[
                ec2.SubnetConfiguration(
                    subnet_type=ec2.SubnetType.PUBLIC,
                    name="PublicSubnet",
                    cidr_mask=24
                )
            ]
        )

        # Security Group (Adjust rules for your specific requirements)
        security_group = ec2.SecurityGroup(self, "SecurityGroup",
            vpc=vpc,
            allow_all_outbound=True
        )
        security_group.add_ingress_rule(
            ec2.Peer.any_ipv4(),
            ec2.Port.tcp(22),
            "Allow SSH Access from Anywhere"
        )

        # AMI (Choose an AMI suitable for your needs)
        amzn_linux = ec2.MachineImage.latest_amazon_linux(
            generation=ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
            edition=ec2.AmazonLinuxEdition.STANDARD,
            virtualization=ec2.AmazonLinuxVirt.HVM,
            storage=ec2.AmazonLinuxStorage.GENERAL_PURPOSE
        )

        # Instance Type (Select the appropriate instance type)
        instance_type = ec2.InstanceType("t3.micro")

        # Key Pair (Create a key pair and provide its name)
        key_name = "MyKeyPair"  # Replace with your key pair name

        # EC2 Instance
        instance = ec2.Instance(self, "Instance",
            instance_type=instance_type,
            machine_image=amzn_linux,
            vpc=vpc,
            security_group=security_group,
            key_name=key_name
        )


        #!/usr/bin/env python3
import os

import aws_cdk as cdk

from ec2_python.ec2_python_stack import Ec2PythonStack


app = cdk.App()
Ec2PythonStack(app, "Ec2PythonStack",
    # If you don't specify 'env', this stack will be environment-agnostic.
    # Account/Region-dependent features and context lookups will not work,
    # but a single synthesized template can be deployed anywhere.

    # Uncomment the next line to specialize this stack for the AWS Account
    # and Region that are implied by the current CLI configuration.

    #env=cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')),

    # Uncomment the next line if you know exactly what Account and Region you
    # want to deploy the stack to. */

    #env=cdk.Environment(account='123456789012', region='us-east-1'),

    # For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html
    )

app.synth()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.

部署

export AWS_ACCESS_KEY_ID="xxxxxxxxxx"
export AWS_SECRET_ACCESS_KEY="7xxxxxxxxxx"
export AWS_REGION="cn-north-1"

cdk bootstrap

cdk deploy
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

Cdk 转换为cloudformation然后部署

实战基于AWS CDK进行AWS资源IaC编排_基础设施

测试链接

实战基于AWS CDK进行AWS资源IaC编排_编程语言_02

清理

cdk destroy
  • 1.

实战基于AWS CDK进行AWS资源IaC编排_基础设施_03

总结

基于 CDKTF(Cloud Development Kit for Terraform)进行 AWS 资源 IaC 编排结合了 Terraform 的强大功能和 AWS CDK 的编程灵活性。CDKTF 允许使用熟悉的编程语言(如 TypeScript、Python 和 Java)编写 Terraform 配置,从而简化了复杂基础设施的创建和管理过程。通过 CDKTF,开发人员可以利用编程语言的特性,如条件逻辑、循环和抽象,来构建可复用的基础设施组件。

使用 CDKTF 的优势包括:提供了强类型支持和丰富的编程功能,使得配置文件更具可读性和可维护性;允许与现有 Terraform 模块和资源无缝集成;支持 Terraform 的状态管理和计划执行功能,确保基础设施的稳定性和一致性。CDKTF 适合希望在编写基础设施代码时充分利用编程语言优势的开发人员,特别是在处理复杂和动态基础设施需求时。