今までAWSのインフラの管理にはterraformを使っていた

使い慣れていて基本的に問題は無いが、AWS上で新しくでた機能を使いたい場合など、terraformでは物足りない部分も多々あった

クラメソさんもterraformとCDKをいろいろな観点で比較検討している

新機能はいち早く使いたいという思いやCDK自体の使い心地を知りたいということで、今年GolangがCDKのサポートがされるようになったので使ってみる

golangを使ったCDKのインストールと初期化

まずはCDK自体をインストールする

# cdkをグローバル環境にインストールnpm install -g aws-cdk

インストールしたcdkでプロジェクトの初期化

# サンプル用のディレクトリ作成して、移動
mkdir hello-cdk-go
cd hello-cdk-go

# golangを指定して初期化
$(npm bin -g)/cdk init --language=go

そうすると下記のようなログが出力される

Applying project template app for go# Welcome to your CDK Go project!This is a blank project for Go development with CDK.**NOTICE**: Go support is still in Developer Preview. This implies that APIs maychange while we address early feedback from the community. We would love to hearabout your experience through GitHub issues.## Useful commands * `cdk deploy`      deploy this stack to your default AWS account/region * `cdk diff`        compare deployed stack with current state * `cdk synth`       emits the synthesized CloudFormation template * `go test`         run unit tests

deploy でデプロイ, diff で差分の確認, synth でCloudFormationのテンプレートの出力が行える

また初期化を行うと以下のようなファイルが自動生成されている

tree .                                                                                                                                 (git)-[master].├── README.md├── cdk.json├── go.mod├── hello-cdk-go.go└── hello-cdk-go_test.go

生成されるgoのコードは下記のようになる

package mainimport (  "github.com/aws/aws-cdk-go/awscdk"  "github.com/aws/aws-cdk-go/awscdk/awssns"  "github.com/aws/constructs-go/constructs/v3"  "github.com/aws/jsii-runtime-go")type HelloCdkGoStackProps struct {  awscdk.StackProps}func NewHelloCdkGoStack(scope constructs.Construct, id string, props *HelloCdkGoStackProps) awscdk.Stack {  var sprops awscdk.StackProps  if props != nil {    sprops = props.StackProps  }  stack := awscdk.NewStack(scope, &id, &sprops)  // The code that defines your stack goes here  // as an example, here's how you would define an AWS SNS topic:  awssns.NewTopic(stack, jsii.String("MyTopic"), &awssns.TopicProps{    DisplayName: jsii.String("MyCoolTopic"),  })  return stack}func main() {  app := awscdk.NewApp(nil)  NewHelloCdkGoStack(app, "HelloCdkGoStack", &HelloCdkGoStackProps{    awscdk.StackProps{      Env: env(),    },  })  app.Synth(nil)}// env determines the AWS environment (account+region) in which our stack is to// be deployed. For more information see: https://docs.aws.amazon.com/cdk/latest/guide/environments.htmlfunc env() *awscdk.Environment {  // If unspecified, 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.  //---------------------------------------------------------------------------  return nil  // Uncomment if you know exactly what account and region you want to deploy  // the stack to. This is the recommendation for production stacks.  //---------------------------------------------------------------------------  // return &awscdk.Environment{  //  Account: jsii.String("123456789012"),  //  Region:  jsii.String("us-east-1"),  // }  // Uncomment to specialize this stack for the AWS Account and Region that are  // implied by the current CLI configuration. This is recommended for dev  // stacks.  //---------------------------------------------------------------------------  // return &awscdk.Environment{  //  Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")),  //  Region:  jsii.String(os.Getenv("CDK_DEFAULT_REGION")),  // }}

環境などの設定を行い、SNS Topicを作成していることがわかる 設定可能な変数についてはstructの中身を確認すれば良いので、ドキュメントを確認する手間がなくなって便利そう

cdkの各コマンド(synth, diff, deploy, destroy)

cdk synth を実行すると cdk.out というディレクトリが生成され、CloudFormationのyamlファイルが標準出力に表示される

$(npm bin -g)/cdk synthResources:  MyTopic86869434:    Type: AWS::SNS::Topic    Properties:      DisplayName: MyCoolTopic    Metadata:      aws:cdk:path: HelloCdkGoStack/MyTopic/Resource  CDKMetadata:    Type: AWS::CDK::Metadata

cdk diff を実行すると差分を確認することが可能

$(npm bin -g)/cdk diffStack HelloCdkGoStackResources[+] AWS::SNS::Topic MyTopic MyTopic86869434 

cdk deploy を実行するとCloudFormationで実際にリソースが作成されます

$(npm bin -g)/cdk deploy^[HelloCdkGoStack: deploying...HelloCdkGoStack: creating CloudFormation changeset... ✅  HelloCdkGoStack

cdk destroy を実行すると作成したStackを削除します

$(npm bin -g)/cdk destroyAre you sure you want to delete: HelloCdkGoStack (y/n)? yHelloCdkGoStack: destroying...✅  HelloCdkGoStack: destroyed

まとめ

cdkのインストールからgolangを用いたテンプレートの実行まで行った

AWSのリソースの設定はSDKを通して利用可能なので、WEB上でドキュメントを都度管理するよりも便利かもしれない