はじめに
この記事では、私が初めてAWS CDKに取り組んだ際の学習プロセスと、実践を通じて得た知見を共有します。
「何から始めればいいかわからない」「どう学習を進めればいいか迷っている」という方の参考になれば幸いです。
想定読者
- AWSの基本的なサービス(Lambda、S3など)を触ったことがある方
- Infrastructure as Codeに興味がある方
- CDKでの開発を始めようと考えている方
CDKとは - なぜCDKを選んだのか
Infrastructure as Codeの必要性
手動でのAWSリソース構築には限界があります。再現性やバージョン管理、チーム開発を考えると、コードでインフラを管理した方が断然楽だと感じました。
CDKの特徴
- プログラミング言語(TypeScript、Python等)で書ける
- 型安全性があるので、間違いに気づきやすい
- 普段使ってるライブラリやツールがそのまま使える
私がCDKを選んだ理由
- TypeScriptでの開発経験を活かせる
- VSCodeの補完が効くので開発しやすそう
- if文やforループが普通に書けるので、複雑な処理も書きやすい
- 今後プロジェクトで使う機会が増えそうだったから
学習の進め方
ステップ1: 基礎概念の理解(1週間程度)
まずは基本的な用語から理解していきました。CloudFormationを知ってたので、概念自体はすんなり入ってきた感じです。
重要な用語
- App: CDKアプリケーション全体のこと
- Stack: デプロイの単位。CloudFormationスタックと同じイメージ
- Construct: 再利用可能なコンポーネント。L1、L2、L3の3つのレベルがある
推奨学習リソース
- AWS公式ドキュメント「CDK Workshop」
- AWS CDK API Reference
- 公式GitHubのサンプルコード
- Udemy
この段階でやったこと
とにかく公式ドキュメントを読んで、気になった用語はメモしてました。完璧に理解しようとせず、「こういうものがあるんだな」くらいの感覚で進めたのが良かったと思います。
ステップ2: 小さく始める(2週間程度)
いきなり複雑なものを作ろうとすると確実に挫折するので、まずは本当にシンプルなリソースから始めました。
最初に作ったもの
- S3バケット単体
- Lambda関数単体
- Lambda + API Gatewayの簡単な構成
// 最初に書いたシンプルなStack例
import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
export class MyFirstStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true,
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
}
}
ステップ3: 実践的な構成に挑戦(1ヶ月程度)
基礎が固まってきたら、もう少し実用的な構成を作ってみました。
取り組んだこと
- Lambda + API Gateway + DynamoDBの構成
- CloudFront + S3によるWebサイト配信
- 複数のStackに分割する設計
つまずいたポイント
-
IAMロールとポリシーの設定
- 最小権限の原則をどう実装するか
- Lambda実行ロールの適切な権限設定
-
リソース間の依存関係
- Stack間でリソースを参照する方法
-
cdk.CfnOutputの使い方
-
命名規則の重要性
- 後から変更が難しいリソース名
- 環境別の命名戦略
// Stack間でリソースを共有する例
export class NetworkStack extends cdk.Stack {
public readonly vpc: ec2.Vpc;
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
this.vpc = new ec2.Vpc(this, 'VPC');
}
}
export class ApplicationStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, networkStack: NetworkStack, props?: cdk.StackProps) {
super(scope, id, props);
// networkStack.vpcを利用
}
}
効果的な学習方法
ドキュメントの読み方
最初から完璧に理解しようとすると疲れます。流し読みして、必要になったら深く読む、くらいのスタンスで良いと思います。Construct Libraryのリファレンスは開発中に何度も見ることになるので、ブックマークしておくと便利です。
試行錯誤のサイクル
- 「こう書けば動くはず」と仮説を立てる
- コードを書く
- デプロイして確認
- エラーが出たら原因を調べる
- 修正してまたデプロイ
アウトプットの重要性
- 学んだことをメモに残す
- チーム内で知見を共有する
つまずきやすいポイントと対策
IAM権限周り
問題: どの権限を与えればいいかわからない
対策:
- 最初は広めの権限で動作確認
- CloudTrailで実際に使用された権限を確認
- 段階的に最小権限に絞り込む
デプロイエラー
問題: エラーメッセージが分かりにくい
対策:
- CloudFormationのイベントログを確認
-
cdk diffで変更内容を事前確認 -
cdk synthで生成されるテンプレートを確認
リソースの削除
問題: Stackが削除できない
対策:
-
removalPolicyを適切に設定 - S3バケットなど、中身があると削除できないリソースに注意
- 開発環境では
DESTROY、本番環境ではRETAINを使い分け
環境の切り替え
問題: 開発環境と本番環境の管理
対策:
- 環境変数やスタックをまとめたファイルを活用
- Stackのpropsで環境を渡す
- 環境別の設定ファイルを用意
// 環境別の設定例
const envConfig = {
dev: { instanceType: 't3.micro' },
prod: { instanceType: 't3.large' },
};
const env = app.node.tryGetContext('env') || 'dev';
const config = envConfig[env];
これから始める方へのアドバイス
最初にやるといいこと
- AWS公式のCDK Workshopを一通りやってみる
- TypeScript(または好きな言語)で小さいリソースを作る
- デプロイと削除を繰り返して、操作に慣れる
- 複雑なシステムを見る時は、最初はファイル構成とクラス名だけ眺めて全体像を把握する
やらない方がいいこと
- 最初から複雑な構成を作ろうとする
- ドキュメントを読まずにコピペで進める
役立つリソース
- AWS CDK Examples(GitHub)
- CDK Patterns(cdkpatterns.com)
- AWS公式ブログのCDK関連記事
まとめ
得られたこと
- インフラ構築の再現性と効率化
- チーム開発でのコード管理
- TypeScriptの型安全性による開発体験の向上
今後の展開
- より高度なConstructの作成
- CI/CDパイプラインとの統合
- 複雑なスタック
正直、まだまだ分からないことだらけです。でも、一歩ずつ進めていけば確実にできるようになります。
自分もまだまだ未熟ですが、この記事がこれからCDKを始める方の参考になれば嬉しいです。