AWS初心者がAWS CDKに挑戦してみた
仕事でAWSを触ることになったので勉強したことのメモを残していこうと思います
今回はタイトルの通りAWS CDKを使って、ALB、EC2、RDSの環境を作成してみました
また、EC2にはwordpressをインストールするようにしています
構成図
構成図としては以下になります
EC2*2、RDS(マルチAZ)をプライベートサブネットに配置し、ALBをパブリックサブネットにおいた形になります
また、NATGatewayを作成していないので、EC2がインターネットにはでれません
そのため、wordpressのインストールにあたってインストーラーをS3から取得するようにしています

構成
本記事で作成したコード
├─ bin
│ └─ wordpress-server.ts
├─ lib
│ └─ stack
│ │ └─ wordpress-server-stack.ts
│ ├─ construct
│ │ ├─ alb.ts
│ │ ├─ ec2app.ts
│ │ ├─ networking.ts
│ │ ├─ rds.ts
│ │ └─ s3.ts
│ ├─ resources
│ ├─ assets
│ │ └─ ワードプレスのインストーラー
│ └─ user-data.sh
├─ config.ts
bin/(App)
CDK実行時のエントリポイント
lib/stackで定義したスタックを呼び出す
lib/stack
CloudFormationの1スタックに相当する単位
デプロイ時には定義したスタック単位でデプロイします
lib/construct
lib/stackで使用するAWSリソースを定義
-
ec2app.ts: WordPress を動かす EC2 インスタンスを定義。 また、起動時に
user-data.shを実行。 - networking.ts: VPC、サブネット、および SSM や S3 へのプライベート接続を可能にする VPC エンドポイントを構築。
- rds.ts: Multi-AZ 構成の MySQL データベースインスタンスを作成。 また、EC2からの接続のみを許可するセキュリティグループを設定。
-
s3.ts: WordPress のソースを保存するバケットを作成。 また、
assetsディレクトリをデプロイ時にバケットへ自動同期する設定。
lib/resources/assets
Wordpressのインストーラーを置くフォルダ
S3からWordpressのインストーラーを取得するようにしたため作成
※EC2をプライベートサブネットに配置かつNATゲートウェイを作成しなかったため
コードの解説
bin/wordpress-server.ts は、CDK アプリケーションのエントリーポイントです。
ここでは、lib/stack/wordpress-server-stack.tsから WordpressServerStack クラスを import し、実際のスタックとしてインスタンス化しています。その際、config.ts から読み込んだ環境ごとの設定値をパラメータとして渡す役割を担っています。
lib/stack/wordpress-server-stack.tsでは、スタックの定義を行っています。
まず、export interface WordpressServerStackProps extends cdk.StackProps を定義することで、スタックが受け取る引数(Props)を型安全に指定しています。
※Typescript初めて触ったので、bin側での定義を忘れたり、binに書いてないのをinterfaceで定義したりとなんどかハマったポイントです
スタックの内部では、bin での呼び出しと同様に、各コンストラクトを import してインスタンス化し、ネットワーク構成やデータベース設定などの必要な値を引数として渡しています
各コンストラクト(lib/construct/)では、具体的な AWS リソースの定義を行っています。
例えば lib/construct/networking.tsでは、作成したVPCインスタンスを他のコンストラクトからも参照できるように、public readonly vpc: ec2.IVpc;としてクラスのプロパティを公開し、コンストラクタ内でthis.vpc = vpc;と代入しています。
感想
初めてのAWS CDK+typescriptだったのでシンプルな構成にも関わらず作成するのにめちゃくちゃ時間かかりました
CDKについても人に説明できるほど理解できていないため、今後も要勉強です
また、コードですが基本的には自分で書くようにしていたものの、なんだかんだでGeminiやChatgptに頼ってしまったのでまだまだだなと感じてます、、、
改善点
勉強のため簡単な構成にしましたが、実際にはAutoScaling、HTTPSへの対応、EFS等の共有ストレージにする等改善点が色々あります
今後も勉強したことを記事にして知識を深めていこうと思いました
Discussion