CDKTFでインフラストラクチャを展開する


CDKまたはクラウド開発キットは、開発者によって日々使われているソフトウェア言語のコードとしてインフラストラクチャを書く方法として、2018年にAWSから出てきました.そのリリース以来、コミュニティはそれの周りに構築されており、新しい味が到着している.AWS CDK、CDKTF、およびCDK 8 sはすべて同じコアに基づいていますが、異なる形式にコンパイルします.AWS CDKはCloudFormationにコンパイルされ、CDKTFはterraform互換のJSONにコンパイルされ、CDK 8 sはKubernetes設定にコンパイルされます.
このポストでは、DigitaloceanのterraformプロバイダーとCDKTFを使用する方法を歩いていきます.terraformプロバイダーは、リモートシステムと対話するために、terraformのための「プラグイン」です.この場合、プロバイダーはDigitalOceanによって作成され、維持されます.我々は、デジタル海洋プロジェクト、VPC、Postgresデータベース、および液滴を作成するいくつかの例を共有します.

prereqsとインストール
cdktfを使うには、以下のパッケージをインストールします.
  • 地形≥ 0.12
  • ノード.js≥ 12.16
  • 糸≥ 1.21
  • cdktfをインストールするにはnpm install $ npm install --global cdktf-cliまた、必要がありますcreate a personal access token あなたがこの設定を展開したいならば、デジタル海で.

    サンプルプロジェクトの作成と初期化
    最初にディレクトリを作って、それに変えましょう.$ mkdir cdk-do-example && cd cdk-do-exampleプロジェクトを初期化するinit コマンド.一般的には--local フラグを指定するので、すべての状態がローカルに格納される.$ cdktf init --template=typescript --localプロジェクト名と説明のためにプロンプトが表示されますが、デフォルトは結構です.
    プロジェクトを設定する最後のステップは、terraformプロバイダを追加することですcdktf.json . エディタでプロジェクトを開き、次のようにDigitalAudioプロバイダを追加します.
    {
      "language": "typescript",
      "app": "npm run --silent compile && node main.js",
      "terraformProviders": [
        "digitalocean/digitalocean@~> 2.9"
      ],
      "terraformModules": [],
      "context": {
        "excludeStackIdFromLogicalIds": "true",
        "allowSepCharsInLogicalIds": "true"
      }
    }
    

    依存関係のインストール
    ランcdktf get DigialOceanを使用して依存関係をダウンロードします.
    $ cdktf get
    Generated typescript constructs in the output directory: .gen
    

    いくつかのタイプスクリプトを書きましょう
    オープンmain.ts エディタで、doプロジェクトを作成することから始めましょう.
    import { Construct } from 'constructs'
    import { App, TerraformStack, Token } from 'cdktf'
    import { DigitaloceanProvider } from './.gen/providers/digitalocean'
    import { Project } from './.gen/providers/digitalocean'
    
    class MyStack extends TerraformStack {
      constructor(scope: Construct, name: string) {
        super(scope, name)
    
        new DigitaloceanProvider(this, 'digitalocean', {
          token: Token.asString(process.env.DO_TOKEN) 
        })
    
        new Project(this, 'example-project', {
          name: 'Example Rails Project'
        })
    
      }
    }
    
    const app = new App()
    new MyStack(app, 'cdk-do-example')
    app.synth()
    
    あなたは新しいDigitaloceanProvider を実行し、doパーソナルアクセストークンに割り当てられた環境変数を渡します.次に、我々はProject , には、name .
    必要に応じて、上記のコードのテストとしてcdktf deploy CDKTFプロジェクトを配備するには.リソースの下でリストされた変更をしたいなら、CLIは尋ねます.「はい」と入力し、いったん終了すると、正常に作成されたリソースの横に緑色のチェックが表示されます.
    CLIプロンプト

    配備の成功:

    ここでVPC、Postgresデータベース、および液滴を追加します.それらの例が入ってしまえば、再び展開する前にまとめます.

    VPCを作る
    import { Construct } from 'constructs'
    import { App, TerraformStack, Token } from 'cdktf'
    import { DigitaloceanProvider, Droplet, Vpc } from './.gen/providers/digitalocean'
    import { Project } from './.gen/providers/digitalocean'
    
    class MyStack extends TerraformStack {
      constructor(scope: Construct, name: string) {
        super(scope, name)
    
        new DigitaloceanProvider(this, 'digitalocean', {
          token: Token.asString(process.env.DO_TOKEN) 
        })
        ...more code above
    
        new Vpc(this, 'example-vpc', {
          name: 'example-vpc',
          region: 'sfo3'
        })
    
      }
    }
    
    const app = new App()
    new MyStack(app, 'cdk-do-example')
    app.synth()
    
    注:お客様のアカウントでVPCを持っていない場合は、cdktfプロジェクトをクリーンアップする際に削除されません.

    Postgresデータベースを作成する
    import { Construct } from 'constructs'
    import { App, TerraformStack, Token } from 'cdktf'
    import { DigitaloceanProvider, Droplet, Vpc, DatabaseCluster, DatabaseUser, DatabaseDb } from './.gen/providers/digitalocean'
    import { Project } from './.gen/providers/digitalocean'
    
    class MyStack extends TerraformStack {
      constructor(scope: Construct, name: string) {
        super(scope, name)
    
        new DigitaloceanProvider(this, 'digitalocean', {
          token: Token.asString(process.env.DO_TOKEN) 
        })
        ...more code above
    
        const postgres = new DatabaseCluster(this, 'example-postgres', {
          name: 'example-postgres',
          engine: 'pg',
          version: '13',
          size: 'db-s-1vcpu-1gb',
          region: 'sfo3',
          nodeCount: 1
        })
    
        new DatabaseUser(this, 'example-postgres-user', {
          clusterId: `${postgres.id}`,
          name: 'example'
        })
    
        new DatabaseDb(this, 'example-postgres-db', {
          clusterId: `${postgres.id}`,
          name: 'example-db'
        })
    
      }
    }
    
    const app = new App()
    new MyStack(app, 'cdk-do-example')
    app.synth()
    
    我々が割り当てた通知DatabaseCluster 変数へconst postgres . 次に、変数を使用してDatabaseUser and DatabaseDb を返します.

    滴を作る
    import { Construct } from 'constructs'
    import { App, TerraformStack, Token } from 'cdktf'
    import { DigitaloceanProvider, Droplet, Vpc, DatabaseCluster, DatabaseUser, DatabaseDb } from './.gen/providers/digitalocean'
    import { Project } from './.gen/providers/digitalocean'
    
    class MyStack extends TerraformStack {
      constructor(scope: Construct, name: string) {
        super(scope, name)
    
        new DigitaloceanProvider(this, 'digitalocean', {
          token: Token.asString(process.env.DO_TOKEN) 
        })
        ...more code above
    
        new Droplet(this, 'example-droplet', {
          name: 'example-droplet',
          size: 's-1vcpu-1gb',
          region: 'sfo3',
          image: 'ubuntu-20-04-x64'
        })
    
      }
    }
    
    const app = new App()
    new MyStack(app, 'cdk-do-example')
    app.synth()
    

    まとめましょう
    あなたが走るならばcdktf deploy 今、それはすべてを作成しますが、作成された何もデジタル海洋プロジェクトまたは我々が作成するVPCに置かれる.それをしましょう.
    import { Construct } from 'constructs'
    import { App, TerraformStack, Token } from 'cdktf'
    import { DigitaloceanProvider, Droplet, Vpc} from './.gen/providers/digitalocean'
    import { DatabaseCluster, DatabaseUser, DatabaseDb } from './.gen/providers/digitalocean'
    import { Project, ProjectResources } from './.gen/providers/digitalocean'
    
    class MyStack extends TerraformStack {
      constructor(scope: Construct, name: string) {
        super(scope, name)
    
        new DigitaloceanProvider(this, 'digitalocean', {
          token: Token.asString(process.env.DO_TOKEN) 
        })
    
        const project = new Project(this, 'example-project', {
          name: 'Example Rails Project'
        })
    
        const vpc = new Vpc(this, 'example-vpc', {
          name: 'example-vpc',
          region: 'sfo3'
        })
    
        const postgres = new DatabaseCluster(this, 'example-postgres', {
          name: 'example-postgres',
          engine: 'pg',
          version: '13',
          size: 'db-s-1vcpu-1gb',
          region: 'sfo3',
          nodeCount: 1,
          privateNetworkUuid: vpc.id
        })
    
        new DatabaseUser(this, 'example-postgres-user', {
          clusterId: `${postgres.id}`,
          name: 'example'
        })
    
        new DatabaseDb(this, 'example-postgres-db', {
          clusterId: `${postgres.id}`,
          name: 'example-db'
        })
    
        const droplet = new Droplet(this, 'example-droplet', {
          name: 'example-droplet',
          size: 's-1vcpu-1gb',
          region: 'sfo3',
          image: 'ubuntu-20-04-x64',
          vpcUuid: vpc.id
        })
    
        new ProjectResources(this, 'example-project-resources', {
          project: project.id,
          resources: [
            postgres.urn,
            droplet.urn
          ],
          dependsOn: [ postgres, droplet ]
        })
      }
    }
    
    const app = new App()
    new MyStack(app, 'cdk-do-example')
    app.synth()
    
    プロジェクト、vpc、および液滴を変数に割り当てることから始めます.にDatabaseCluster 定義、我々は加えますprivateNetworkUuid: [vpc.id](http://vpc.id) データベースを新しく作成したVPCに配置します.同様にDroplet 定義、我々はVPCにそれを置きますvpcUuid: vpc.id .
    最後に、新しいProjectResource デジタルオーシャンプロジェクトに他のリソースを割り当てる.この小さな例では、データベースと液滴をプロジェクトに割り当てますurn を返します.両方ともterraformヘルパーを使用して作成されるまで、それらを割り当てるのを待ちますdependsOn .
    すべての場所で、再度展開することができます.データベースと液滴の作成は少しかかりますので、患者.🙂 完了したら、すべての作成し、使用するために準備を参照してくださいデジタルオーシャンダッシュボードを確認してください.

    を実行してくださいcdktf destroy あなたのアカウントからこれらのリソースを削除するか、またはデジタルオーシャンによって課金されます

    知るべきこと
    CDKTFはまだ若いプロジェクトですので、高速に変更され、ドキュメントが制限されています.
    限られたドキュメントに役立つものはほとんどありません.プロバイダのドキュメントを読むことができますTerraform registry site としてガイドとして使用します.また、VSCodeを使用してtypescriptのような言語を使用すると、コードヒント、ホバー情報、および署名情報がたくさんあります.下のGIFは、問題を解決するときにVsCodeに表示されるものの例です.は、DropletConfig .

    不明なエラーに遭遇したときにCDKTF_LOG_LEVEL=debug 非常に冗長な出力を得るために、配備と/または破壊コマンドに.

    ラッピング
    このポストでは、CDKTFを使用して、あなたの選択の言語でより複雑なインフラストラクチャを構築する良いプライマーを与えるデジタルオーシャンにいくつかの基本的な例のリソースを作成します.このポストからコードを見つけることができますrepo . あなたがCDKやインフラストラクチャについての詳細については、Twitterで私をpingすることができますコードとしてチャットしたい場合.