Cloud9上にCDK+Goの実行環境を作ってみた

2023.01.25

こんにちは、soraです。

今回は、Cloud9上にCDK+Goの実行環境を作ったことについて書いていきます。

ちなみに、CDK+TypeScriptについてはAWS workshop studioにて無料公開されているワークショップをご参照ください。 CDKやTypeScriptの初心者でも、それぞれを基礎から学べます。

・AWSのWorkShop
TypeScriptの基礎から始めるAWS CDK開発 入門

・WorkShopを実際にやってみた方の記事
プログラミング経験があまりない人にもおすすめなAWS CDKのワークショップ「TypeScriptの基礎から始めるAWS CDK開発 入門」の紹介

AWS Cloud9とは

AWS Cloud9は、AWS上に統合開発環境を簡単に作ることができ、ブラウザ上でコードの記述や実行ができるサービスです。

実態としては、EC2サーバを起動してその上に統合開発環境を作ってくれます。

特にローカル環境を汚したくない方やWindowsPCを使っていてローカルで開発環境を作るのを手間に感じる方は、利用すると便利なサービスだと思います。

AWS CDKとは

CDK(Cloud Development Kit)とは、TypeScriptやPython、Goなどのプログラミング言語を使用して、CloudFormationテンプレートを作成できるツールキットです。

やってみた

それでは、実際にCloud9上に環境を作っていきます。

Cloud9の構築

Cloud9のページから[Create environment]を押して、セットアップ画面で入力・設定変更をします。


EC2インスタンスは、t3.smallを選択します。

[Create]を押して、少し待つとセットアップが完了します。
セットアップが完了したら、Cloud9 IDEの列の[OPEN]から環境に入れます。

CDK+Goの環境準備

Cloud9の場合、npmもaws-cliもデフォルトでインストールされています。

$ npm -v
8.19.3
$ aws --version
aws-cli/1.19.112 Python/2.7.18 Linux/4.14.301-224.520.amzn2.x86_64 botocore/1.20.112

新しいディレクトリを作成して移動します。

$ mkdir test-go && cd test-go

必要なgoファイルやmodファイルを生成します。

$ cdk init --language=go

コマンド実行して、ディレクトリ内に生成されたファイルは以下です。
※treeコマンドはデフォルトではインストールされていないため、使用する場合はインストールが必要です。

$ tree
.
├── cdk.json
├── go.mod
├── README.md
├── test-go.go
└── test-go_test.go

ビルドに必要なモジュールを追加して、go.sumファイルに情報を記載します。

$ go mod tidy

sumファイルが生成されていることが確認できます。

$ tree
.
├── cdk.json
├── go.mod
├── go.sum
├── README.md
├── test-go.go
└── test-go_test.go

CDKが利用するリソース群をCloudFormationスタックとしてデプロイします。
CDKを使う場合に、環境(アカウント/リージョン)ごとに1回行う必要があります。

$ cdk bootstrap

これで実行環境は完成です。

テスト

せっかくなので実際にCDKを使ってみます。
今回は空のS3バケットを作成してみます。

以下が使用するコードです。
デフォルトで記載されているコメントは削除し、追記した箇所にはコメントを追加しています。
test-go.go

package main

import (
	"github.com/aws/aws-cdk-go/awscdk/v2"
	//S3に必要なパッケージをインポート
	"github.com/aws/aws-cdk-go/awscdk/v2/awss3"
	"github.com/aws/constructs-go/constructs/v10"
	//CDKで言語のマッピングをするためのパッケージをインポート
	"github.com/aws/jsii-runtime-go"
)

type TestGoStackProps struct {
	awscdk.StackProps
}

func NewTestGoStack(scope constructs.Construct, id string, props *TestGoStackProps) awscdk.Stack {
	var sprops awscdk.StackProps
	if props != nil {
		sprops = props.StackProps
	}
	stack := awscdk.NewStack(scope, &id, &sprops)

	//S3バケットを作成
	awss3.NewBucket(stack, jsii.String("GoTestBucket"), &awss3.BucketProps{})

	return stack
}

func main() {
	defer jsii.Close()

	app := awscdk.NewApp(nil)

	NewTestGoStack(app, "TestGoStack", &TestGoStackProps{
		awscdk.StackProps{
			Env: env(),
		},
	})

	app.Synth(nil)
}

func env() *awscdk.Environment {
	return nil
}

先ほどのコードからCloudFormationテンプレートを生成して内容を確認します。

$ cdk synth

deployしたときのリソースの差分を確認します。
長いため一部省略していますが、Resourcesの部分でS3バケットが生成されることが確認できます。

$ cdk diff
Stack TestGoStack
……
Conditions
……
Resources
[+] AWS::S3::Bucket GoTestBucket GoTestBucket
Other Changes
……

CloudFormationテンプレートへの変換・スタックの作成を実施します。

$ cdk deploy

コマンド実行後に、CloudFormationテンプレート(TestGoStack)やS3が生成されていることが確認できます。
CDKToolKitはcdk bootstrapで生成されたもの、aws-cloud9はcloud9構築時に生成されたものです。

クリーンアップ

最後に、CloudFormationスタックの削除を実行します。

$ cdk destroy

以下のようにスタックが削除されていることがわかります。

ただし今回の場合では、テンプレートから作成したS3バケットは消えておりません。
これはRemovalPolicyがデフォルトでRetainとなっているためです。

こちらの詳細については、以下記事をご確認ください。
[AWS CDK(Cloud Development Kit)] スタック削除時にS3バケットも削除されるように設定する

最後に

今回は、Cloud9上にCDK+Goの実行環境を作って実行するまでの流れを紹介しました。

TerraformやCDKなどのIaCは、AWSで構築を行う際に基本的に使われるため、興味がある方はぜひやってみてはいかがでしょうか。