🪳

cdktfでCockroachDBを作成する

2023/12/27に公開

CockroachDB


cdktfでCockroachDBを作成する

前回↓の記事を書きました。
https://zenn.dev/mjxo/articles/1df105caf5e4fb

自身の勉強も兼ねてCockroachDBをcdktfで作成してみたいと思います。


CockroachDB側(ブラウザ)

登録

https://www.cockroachlabs.com/ ヘアクセス。








アンケート


Demo


クラスター作成



コンソール画面に入れました。


数分待ちます。

SQL User作成 & パスワードを生成




CA Cirtをコピー。


完了。
Organization > Access Management

Service Accounts作成



Create


Create

API Key作成

Create


Copy & Done


AWS側

AWSサービスと接続する事を想定しますが、今回AWS側でリソースとして作成するのはAPI KeyをSecrets Managerに保存する部分だけです。






次→次→保存


cdktf

$ npm install --global cdktf-cli@latest

$ mkdir cdktfCockrochDB && cd cdktfCockrochDB && cdktf init --template=typescript --providers=hashicorp/aws
Welcome to CDK for Terraform!

By default, cdktf allows you to manage the state of your stacks using Terraform Cloud for free.
cdktf will request an API token for app.terraform.io using your browser.

If login is successful, cdktf will store the token in plain text in
the following file for use by subsequent Terraform commands:
    /Users/hoge/.terraform.d/credentials.tfrc.json

Note: The local storage mode isn't recommended for storing the state of your stacks.

? Do you want to continue with Terraform Cloud remote state management? no
? Project Name cdktfCockrochDB
? Project Description A simple getting started project for cdktf.
? Do you want to start from an existing Terraform project? no
? Do you want to send crash reports to the CDKTF team? Refer to https://developer.hashicorp.com/ter
raform/cdktf/create-and-deploy/configuration-file#enable-crash-reporting-for-the-cli for more
information no

$ cdktf provider add "cockroachdb/cockroach"


反映されました。

cdktf.json
{
  "language": "typescript",
  "app": "npx ts-node main.ts",
  "projectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "sendCrashReports": "false",
  "terraformProviders": [
    "cockroachdb/cockroach@~> 1.3"
  ],
  "terraformModules": [],
  "context": {}
}

main.ts
import { Construct } from 'constructs';
import { App, TerraformStack } from 'cdktf';
import { TerraformVariable } from 'cdktf'
import * as cockrochDB from './.gen/providers/cockroach';

class MyStack extends TerraformStack {
  constructor(scope: Construct, id: string) {
    super(scope, id);
  //-------------------------------------------------------//
  // Deploy実行時に環境変数を渡す形にする。
  const apiKey = new TerraformVariable (this, 'CockrochDbApiKey', {type : 'string', sensitive : true}); 

  new cockrochDB.provider.CockroachProvider(this, 'cockroachProvider', { 
    apikey: apiKey.value,
  });

  const cluster = new cockrochDB.cluster.Cluster(this, 'cluster', {
    name: 'example',
    cloudProvider: 'AWS',
    serverless:{
      spendLimit: 0,
    },
    regions: [
      {
        name: 'us-east-1'
      }
    ]
  });

  new cockrochDB.sqlUser.SqlUser(this, 'sqlUser', {
    name: 'exampleUser',
    password: 'examplePassword', // 実際はベタ書きせずどこかに格納。
    clusterId: cluster.id 
  });
  
  new cockrochDB.database.Database(this, 'database', {
    name: 'example-database',
    clusterId: cluster.id 
  });
}
}

const app = new App();
new MyStack(app, 'cdktfCockrochDB');
app.synth();

cdktf synth

Generated Terraform code for the stacks: cdktfCockrochDB

deploy.sh
#!/bin/bash
region=ap-northeast-1  # Secretを作成したリージョンに適宜書き換えてください。
secrets=`aws secretsmanager get-secret-value --region ${region} --secret-id CockrochDbApiKey | jq '.SecretString'| tr -d '{}" \\' `
secret=(${secrets//,/ })
secretValue+=(`echo ${secret[0]} | awk '{print substr($0,index($0,":")+1)}'`)
TF_VAR_CockrochDbApiKey=`echo ${secretValue}` cdktf deploy

$ bash deploy.sh


無事作成されました。

depstoy.sh
#!/bin/bash
region=ap-northeast-1  # Secretを作成したリージョンに適宜書き換えてください。
secrets=`aws secretsmanager get-secret-value --region ${region} --secret-id CockrochDbApiKey | jq '.SecretString'| tr -d '{}" \\' `
secret=(${secrets//,/ })
secretValue+=(`echo ${secret[0]} | awk '{print substr($0,index($0,":")+1)}'`)
TF_VAR_CockrochDbApiKey=`echo ${secretValue}` cdktf destroy
$ bash destroy.sh

他のリソースなど詳しい所は↓を参照ください。
https://github.com/cockroachdb/terraform-provider-cockroach


以上でした

有難うございました。

Discussion