Zenn
🚀

AWS CDKについて入門し、JAWS-UG CDK支部に参加して感じたCDKのメリット

2025/04/06に公開

こんにちは。大学生エンジニアの豆太郎です。クラウドサービス(とくにAWS)のスケールの大きさに惹かれて、いくつかのアプリを個人で開発したり、最近はAWSのコミュニティ「JAWS」に参加したりして、AWSの勉強を頑張っています。

今回は、「AWS CDK」の学習を始めたので、AWS CDKの解説や具体的に取り組んだこと、感想などを紹介したいと思います。

この記事は以下の人に読んでいただきたい記事となっております。

  • まだAWS CDKを触ったことがないが、AWS CDKについて理解を深めたい人
  • AWS CDKを初めて触った人が思う感想やメリットを知りたい人
  • インフラをコードで管理する方法を探している人

AWS CDKとは?

AWS CDK (Cloud Development Kit) とは、TypeScriptやPythonなどの一般的なプログラミング言語を使って、AWSのインフラストラクチャをコードとして定義・管理するためのオープンソースフレームワークです。

従来のAWSリソース管理方法と比較すると:

  1. マネジメントコンソール: GUIでポチポチと手動設定
  2. AWS CLI: コマンドラインから各リソースを設定
  3. CloudFormation: JSONやYAMLでインフラをコードとして定義
  4. AWS CDK: プログラミング言語でインフラをコードとして定義

AWS CDKの最大の特徴は、アプリケーションを構成するすべてのスタックをプログラミング言語で一元管理することで、インフラ構築時のミスを減らし、開発効率を向上させることができる点です。また、プログラミング言語の機能(変数、条件分岐、ループ、関数など)を活用できるため、CloudFormationよりも簡潔で読みやすいコードを書くことができます。

具体的にVPCと、そのVPC内にあるEC2インスタンスを立ち上げるコードは以下のように記述できます。

import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from "aws-cdk-lib/aws-ec2";

export class CdkWorkshopStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    //VPCの設定
    const vpc = new ec2.Vpc(this, "BlogVpc", {
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
    });

    
    //EC2インスタンスの設定。引数にインスタンスの詳細な設定を追記する。
    const webServer1 = new ec2.Instance(this, "WordpressServer1", {
      vpc,
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.SMALL), //T3のインスタンスタイプを指定
      // AmazonLinuxImage インスタンスを生成し、AMI を設定
      machineImage: new ec2.AmazonLinuxImage({
        generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      }),
    });
  }
}

引用:TypeScript の基礎から始める AWS CDK 開発入門 EC2 インスタンスのデプロイ より

上記のコードでは、VPCとEC2インスタンスをTypeScriptで定義しています。プログラミング言語の特性を活かして、クラスやコンストラクタ、変数などを使うことで、より少ないコードで効率良くスタックを管理できます。

AWS CDKがデプロイされる仕組み

AWS CDKの内部動作を理解することは重要です。CDKでは以下のようなワークフローでデプロイが行われます:

  1. CDKコードの作成(TypeScript/Python/Java等)
  2. cdk synth コマンドでCloudFormationテンプレートに変換
  3. cdk deploy コマンドでCloudFormationスタックとしてデプロイ

つまり、AWS CDKは最終的にCloudFormationテンプレートを生成し、それを使ってリソースをデプロイします。CloudFormationは、JSONやYAML形式で各AWSリソースを記述し、それらを自動で構築するサービスです。

CloudFormationテンプレートの例:

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "AWS CloudFormation template to create resources required to run tasks on an ECS cluster.",
  "Mappings": {
    "VpcCidrs": {
      "vpc": {"cidr" : "10.0.0.0/16"},
      "pubsubnet1": {"cidr" : "10.0.0.0/24"},
      "pubsubnet2": {"cidr" :"10.0.1.0/24"}
    }
  },
  "Parameters": {
    "EcsAmiId": {
      "Type": "String",
      "Description": "ECS EC2 AMI id",
      "Default": ""
    },
    "EcsInstanceType": {
      "Type": "String",
      "Description": "ECS EC2 instance type",
      "Default": ""
    },
    "SpotPrice": {
      "Type": "Number",
      "Description": "If greater than 0, then a EC2 Spot instance will be requested",
      "Default": "0"
    }
    // 以下省略
  }
}

CloudFormationテンプレートには主に以下の要素が含まれます:

  • リソース定義: EC2、VPC、RDS等のAWSリソース
  • パラメータ: ポート番号、インスタンスタイプなどの設定値
  • 依存関係: リソース間の関連性(EC2に関連付けるVPC等)
  • 出力値: スタック作成後に参照できる値
  • マッピング: 条件に応じた値の定義
  • メタデータ: テンプレートに関する追加情報

cdk deploy コマンドを実行すると、CDKコードがCloudFormationテンプレートに変換され、そのテンプレートを使って各リソースが自動でデプロイされます。

詳細はAWS CDK開発者ガイドAWS CloudFormationユーザーガイドで確認できます。

私が取り組んだAWS CDKの教材について

AWS CDKを勉強するにあたってAWSが公式に発表しているCDKのハンズオン教材に取り組みました。

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

具体的には以下のような高可用なアーキテクチャの実装ができます。

ここではwordpressをマルチAZのEC2上に立ち上げて、ALBで各EC2に分散的なアクセスを行うインフラ設計を行います。

この教材はAWSCDKを使った高可用なアーキテクチャの構築をハンズオン形式で行うことができて、またCDKを触ったことないけど、手っ取り早くCDKを体感してみたいという人におすすめです。

勉強するにあたって詰まったところ

上記で紹介した記事で、WordpressをAWS CDKでEC2上に自動デプロイする中で起こったエラーについて紹介します。

Wordpressの立ち上げ時に起こった内部エラーは、手動で解決する必要があること

AWS CDKを使ってWordpressサイトを構築する際に、以下のコマンドでデプロイを実行しました:

cdk deploy

EC2インスタンスやRDSが正常に立ち上がった後、Wordpressのセットアップ画面でRDSへの接続情報を入力して「送信」をクリックしたところ、次のエラーが発生しました:

「wp-config.php ファイルがすでに存在しています」

wp-config.phpファイルは、データベース接続情報などが記載されており、通常はセットアップ時に生成されます。このエラーは、何らかの理由ですでにwp-config.phpが作成されていることを示しています。

この問題を解決するため、EC2インスタンスにSSH接続してwp-config.phpを確認・削除する必要がありました。EC2インスタンスにアクセスするためにSSHキーを設定しました:

const instance = new ec2.Instance(this, "Instance", {
  vpc,
  instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.SMALL),
  machineImage: new ec2.AmazonLinuxImage({
    generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
  }),
  vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC },

  keyName: 'wordpress-key', // SSHアクセス用のキーペア名を追加
});

設定後に再デプロイを行い、EC2上のWordpressを再度セットアップしようとしましたが、同じエラーが発生しました。しかし、ブラウザを何度か更新していると、最終的にセットアップが完了しました。

この問題の原因として考えられるのは:

  1. Wordpressの不安定な動作
  2. EC2インスタンスとRDS間の接続問題
  3. マルチAZ構成でのロードバランサーによるEC2インスタンス切り替え(異なるインスタンスにアクセスした可能性)

この経験から、AWS CDKは強力なツールですが、全てを自動化できるわけではなく、時にはインスタンスの中身を確認したり、手動でトラブルシューティングする必要があることを学びました。

以下が完成したWordpressブログです。

cdk destroyが、自動でスタックを削除をしてくれてめちゃ便利!

AWS CDKの大きなメリットの一つが、cdk destroyコマンドによるリソースの一括削除機能です:

cdk destroy

このコマンドを実行すると、cdk deployで作成したCloudFormationスタックとそれに関連するすべてのAWSリソースが自動的に削除されます。これにより、手動でリソースを削除する際に発生しがちな「消し忘れ」によるコスト増大を防ぐことができます。

実際に私は今月(2025年3月)、手動で設定したFirewallを3日間消し忘れて、約4,000円(25ドル)の予期せぬ請求を受けて思わず困惑しました。AWS CDKではスタックを一括管理することで、このような消し忘れを防ぎ、コストを抑えることができます。

学生の私にとって、AWSの請求額は常に悩みの種です。自動でスタックを管理してくれるAWS CDKは非常にありがたく、今後の学習や個人開発に積極的に活用していきたいと思いました。最近は、実際にCDを使用して開発しており、学習後に一括削除することを徹底することで、学習外の出費を抑えることができています!

JAWS-UG CDK支部で発表、懇談会に参加して感じたこと

4月1日に開催された「JAWS-UG CDK支部 #20 マネコン支部!? VS CDK支部」に登壇者として参加し、「AWS CDKに入門してみた」というタイトルで発表しました。AWS workshopのCDK開発入門に取り組んだ経験とCDKのメリットについて話しました。

発表資料:

発表では、AWS CDKの主なメリットとして以下の点を挙げました:

  1. 入力ミスの削減:マネジメントコンソールでの手動操作と比べ、コードで管理することでミスを減らせる。コード記述の手間は以下のリソースで補える:

  2. 開発スピードの向上:コンストラクタを活用することで、マルチAZ構成などの複雑な環境も効率的に記述できる

  3. コスト管理の改善cdk destroyコマンドで一括削除が可能なため、リソースの消し忘れによる無駄な出費を防げる

懇談会では、IT企業に勤める社会人エンジニアの方々から貴重な意見を聞くことができました:

  • 開発に慣れている人はAWSサービスの勉強をする際に、CDKを使ってサービスを立ち上げたほうがむしろ学習が早いかもしれない。 これは、AWSCDKがクラスやオブジェクト指向などのプログラミング言語を使っていて、そのようなコードに慣れている人はコードの理解が捗り、AWS上で何が行われているのかが視覚的に理解しやすいという点があるからです。実際に、座談会に参加されていた人のなかにも、マネージメントコンソールからよりもCDKを使ってAWSサービスの学習をされていた方がおられました。僕もマネージメントコンソールよりも、コードを実際に書く方がAWSのインフラ設計の全体像が分かりやすいような気がしていたので、この話を聞いて今後もCDKを使って開発・勉強しようと思いました。
  • ベテランのインフラエンジニアの方よりも、開発や若い人の方がCDKをキャッチアップできる。 この理由としては、ベテランエンジニアの人はBashやZshなどの上からコードを読んでいくシェルスクリプトに慣れていてCDKのモダンな言語の学習が遅れるからです。具体的には、CDKで使われているTypeScriptやPythonなどのオブジェクト指向型の言語を使って、プログラムを上下に行ったり来たりする読み方に慣れておらずに学習する時にハードルを感じるとのこと。その分、若い人や開発の人は、CDKにモダンなプログラミング言語に慣れている分、学習スピードが早いそうです。

上記のことから、若い人や開発をメインでしている人が、インフラの領域に挑戦するのに、CDKはうってつけのものだと思いました。

まとめ

AWS CDKについて学んだことをまとめると:

  • モダンなプログラミング言語(TypeScript、Python等)を使用してAWSリソースを管理できる
  • コードによる管理で保守性が向上し、バージョン管理も容易になる
  • プログラミング言語の機能(変数、ループ、クラス等)を活用して開発効率を高められる
  • リソースの一括削除機能により、消し忘れによるコスト増大を防げる
  • 開発経験のあるエンジニアほど学習効率が高い傾向がある

JAWS-UG CDK支部での他の方の発表を聞いて、以下のようなまだ触れていない実践的な課題も見えてきました:

  • 既存の本番環境をCDKに移行する方法
  • CDKのテスト実装と信頼性の担保
  • 実際の運用における課題と対策

上記のように実際に現場のアプリの運用に触れてみないと分からないことに、CDKの良さや悪さが隠れているような気がしました。

まだ私自身チュートリアルを行ったのみで困難に直面しておらず、CDKのいいとこどりをしたような発表になったことに気づけたため、今後は個人開発での運用経験やインターンシップなどを通じて、CDKの奥深さを再度発信していきたいと思いました。

参考リンク

Discussion

ログインするとコメントできます