🌟

AWS初心者がAWS CDKに挑戦してみた

に公開

仕事でAWSを触ることになったので勉強したことのメモを残していこうと思います
今回はタイトルの通りAWS CDKを使って、ALB、EC2、RDSの環境を作成してみました
また、EC2にはwordpressをインストールするようにしています

構成図

構成図としては以下になります
EC2*2、RDS(マルチAZ)をプライベートサブネットに配置し、ALBをパブリックサブネットにおいた形になります
また、NATGatewayを作成していないので、EC2がインターネットにはでれません
そのため、wordpressのインストールにあたってインストーラーをS3から取得するようにしています

構成

本記事で作成したコード
https://github.com/Peta933/wordpress-server

├─ 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 から読み込んだ環境ごとの設定値をパラメータとして渡す役割を担っています。
https://github.com/Peta933/wordpress-server/blob/main/bin/wordpress-server.ts

lib/stack/wordpress-server-stack.tsでは、スタックの定義を行っています。
まず、export interface WordpressServerStackProps extends cdk.StackProps を定義することで、スタックが受け取る引数(Props)を型安全に指定しています。
※Typescript初めて触ったので、bin側での定義を忘れたり、binに書いてないのをinterfaceで定義したりとなんどかハマったポイントです
https://github.com/Peta933/wordpress-server/blob/main/lib/stack/wordpress-server-stack.ts#L11-L31

スタックの内部では、bin での呼び出しと同様に、各コンストラクトを import してインスタンス化し、ネットワーク構成やデータベース設定などの必要な値を引数として渡しています
https://github.com/Peta933/wordpress-server/blob/main/lib/stack/wordpress-server-stack.ts#L33-L90

各コンストラクト(lib/construct/)では、具体的な AWS リソースの定義を行っています。
例えば lib/construct/networking.tsでは、作成したVPCインスタンスを他のコンストラクトからも参照できるように、public readonly vpc: ec2.IVpc;としてクラスのプロパティを公開し、コンストラクタ内でthis.vpc = vpc;と代入しています。
https://github.com/Peta933/wordpress-server/blob/main/lib/construct/networking.ts#L14-L15
https://github.com/Peta933/wordpress-server/blob/main/lib/construct/networking.ts#L59

感想

初めてのAWS CDK+typescriptだったのでシンプルな構成にも関わらず作成するのにめちゃくちゃ時間かかりました
CDKについても人に説明できるほど理解できていないため、今後も要勉強です
また、コードですが基本的には自分で書くようにしていたものの、なんだかんだでGeminiやChatgptに頼ってしまったのでまだまだだなと感じてます、、、

改善点

勉強のため簡単な構成にしましたが、実際にはAutoScaling、HTTPSへの対応、EFS等の共有ストレージにする等改善点が色々あります
今後も勉強したことを記事にして知識を深めていこうと思いました

Discussion