<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CDK - CayTech Lab</title>
	<atom:link href="https://caymezon.com/tag/cdk/feed/" rel="self" type="application/rss+xml" />
	<link>https://caymezon.com</link>
	<description></description>
	<lastBuildDate>Sat, 18 Apr 2026 08:14:06 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://caymezon.com/wp-content/uploads/2026/01/cropped-CayTechLab-32x32.jpg</url>
	<title>CDK - CayTech Lab</title>
	<link>https://caymezon.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<atom:link rel='hub' href='https://caymezon.com/?pushpress=hub'/>
	<item>
		<title>AWS CDK（Python）でALB + EC2(Tomcat) + RDS 3層構成を構築する手順【CloudFormation 460行 → CDK 200行】</title>
		<link>https://caymezon.com/aws-handson-cdk-alb-ec2-rds/</link>
					<comments>https://caymezon.com/aws-handson-cdk-alb-ec2-rds/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sat, 18 Apr 2026 08:14:06 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[3層構成]]></category>
		<category><![CDATA[ALB]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Bootstrap]]></category>
		<category><![CDATA[CDK]]></category>
		<category><![CDATA[cdk deploy]]></category>
		<category><![CDATA[cdk destroy]]></category>
		<category><![CDATA[CloudFormation]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[IaC]]></category>
		<category><![CDATA[L2 Construct]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Parameter Store]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[RDS]]></category>
		<category><![CDATA[SSM]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[VPC]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20369</guid>

					<description><![CDATA[<p>目次 はじめにキーワード解説CloudFormation vs CDK：どれだけ違うか使用するAWSサービス前提条件構築されるリソース作業順序【重要】⓪ 自分のIPアドレスを確認する① キーペアの作成② プロジェクトのセ [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-cdk-alb-ec2-rds/">AWS CDK（Python）でALB + EC2(Tomcat) + RDS 3層構成を構築する手順【CloudFormation 460行 → CDK 200行】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">キーワード解説</a></li><li><a href="#toc3" tabindex="0">CloudFormation vs CDK：どれだけ違うか</a></li><li><a href="#toc4" tabindex="0">使用するAWSサービス</a></li><li><a href="#toc5" tabindex="0">前提条件</a></li><li><a href="#toc6" tabindex="0">構築されるリソース</a></li><li><a href="#toc7" tabindex="0">作業順序</a></li><li><a href="#toc8" tabindex="0">【重要】⓪ 自分のIPアドレスを確認する</a></li><li><a href="#toc9" tabindex="0">① キーペアの作成</a></li><li><a href="#toc10" tabindex="0">② プロジェクトのセットアップ</a></li><li><a href="#toc11" tabindex="0">③ cdk.json の設定</a></li><li><a href="#toc12" tabindex="0">④ CDK Bootstrap（初回のみ）</a></li><li><a href="#toc13" tabindex="0">⑤ CDK Synth（テンプレート確認）</a></li><li><a href="#toc14" tabindex="0">⑥ デプロイ</a></li><li><a href="#toc15" tabindex="0">⑦ 動作確認</a><ol><li><a href="#toc16" tabindex="0">7-1. ALB のヘルスチェック確認</a></li><li><a href="#toc17" tabindex="0">7-2. ALB 経由でWebアクセス確認</a></li><li><a href="#toc18" tabindex="0">7-3. EC2 に SSH 接続する</a></li><li><a href="#toc19" tabindex="0">7-4. EC2 から RDS への接続確認</a></li><li><a href="#toc20" tabindex="0">7-5. SSH 接続を切断する</a></li><li><a href="#toc21" tabindex="0">7-6. UserData の実行ログ確認</a></li></ol></li><li><a href="#toc22" tabindex="0">⑧ CDK の差分確認（参考）</a></li><li><a href="#toc23" tabindex="0">⑨ リソース削除</a><ol><li><a href="#toc24" tabindex="0">削除されるリソース一覧</a></li><li><a href="#toc25" tabindex="0">キーペアの削除（手動）</a></li><li><a href="#toc26" tabindex="0">仮想環境の終了</a></li><li><a href="#toc27" tabindex="0">削除完了の確認</a></li><li><a href="#toc28" tabindex="0">CDK Bootstrap リソースの削除（任意）</a></li></ol></li><li><a href="#toc29" tabindex="0">CDK のポイント解説</a><ol><li><a href="#toc30" tabindex="0">L1 / L2 / L3 Construct の違い</a></li><li><a href="#toc31" tabindex="0">CDK Context 変数</a></li><li><a href="#toc32" tabindex="0">cdk synth で CloudFormation テンプレートを確認</a></li></ol></li><li><a href="#toc33" tabindex="0">トラブルシューティング</a></li><li><a href="#toc34" tabindex="0">コンソール版・CloudFormation版との比較</a></li><li><a href="#toc35" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>「CloudFormation の YAML 460行をもっとシンプルに書けないか」——それを実現するのが <strong>AWS CDK（Cloud Development Kit）</strong> です。</p>
<p>この記事では、<a href="https://caymezon.com/aws-handson-cloudformation-alb-ec2-rds/">CloudFormation版ハンズオン</a>で構築した <strong>ALB + EC2(Tomcat) + RDS の3層構成</strong>を、<strong>AWS CDK（Python）</strong> で再現します。YAML を Python コードで書き直すことで、<strong>460行 → 約200行</strong>に削減できることを体験します。</p>
<pre><code class="language-plaintext">インターネット
  ↓ HTTP(80)
[ALB: my-cdk-alb-alb]  ← インターネット向け / パブリックサブネット 2AZ
  ↓ HTTP(8080)  ← ALB SG → EC2 SG（SG-to-SG 制御）
[EC2: my-cdk-alb-ap-instance]  ← Tomcat / パブリックサブネット AZ-a
  ↓ MySQL(3306)  ← EC2 SG → RDS SG（SG-to-SG 制御）
[RDS: my-cdk-alb-rds-mysql]  ← MySQL 8.0 / プライベートサブネット AZ-a

[VPC: my-cdk-alb-vpc (10.0.0.0/16)]
  ├── パブリックサブネット (10.0.0.0/24) [AZ-a]  ← ALB + EC2
  ├── パブリックサブネット (10.0.1.0/24) [AZ-b]  ← ALB（2AZ 必須）
  ├── プライベートサブネット (10.0.2.0/24) [AZ-a]  ← RDS 配置
  └── プライベートサブネット (10.0.3.0/24) [AZ-b]  ← DBサブネットグループ用</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li>Python コードで AWS インフラを定義する CDK の世界観を理解</li>
<li><code>ec2.Vpc</code> 1つでVPC・IGW・ルートテーブルを自動生成する L2 Construct の威力を体験</li>
<li><code>cdk synth</code> で CloudFormation テンプレートを生成・確認</li>
<li><code>cdk diff</code> でデプロイ前の差分確認（CloudFormation の変更セット相当）</li>
<li><code>cdk deploy</code> / <code>cdk destroy</code> でワンコマンドデプロイ・削除</li>
</ul>
<p><strong>このハンズオンの特徴：</strong></p>
<ul>
<li>CloudFormation 版で460行必要だった YAML が Python コード約200行で記述できる</li>
<li><code>cdk destroy</code> 1本でALB・RDS・IAMなど全リソースを自動削除</li>
<li>コードの変更差分を <code>cdk diff</code> で即確認できる（CloudFormation の変更セットより簡単）</li>
</ul>
<hr>
<blockquote>
<p><strong>この記事は <a href="https://caymezon.com/aws-handson-cloudformation-alb-ec2-rds/">CloudFormation版ハンズオン</a> の発展記事です。</strong><br />同じ構成を CDK で再現し、IaC の進化を体験したい方向けです。CDK のコード詳細は <a href="https://github.com/caymezon/aws-handson/tree/main/cdk-alb-ec2-rds">GitHub</a> を参照してください。</p>
</blockquote>
<hr>
<p><!-- ![cdk deployコマンド実行後のOutputs確認画面](images/cdk-deploy-outputs.jpg) --></p>
<p><!-- <a rel="nofollow" href="//af.moshimo.com/af/c/click?a_id=1384942&p_id=170&pc_id=185&pl_id=4062&url=https%3A%2F%2Fwww.amazon.co.jp%2Fs%3Fk%3D%25E6%259C%25AC%2BAWS%2B%25E9%2596%258B%25E7%2599%25BA%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D1DE63UBHFOR4K%26sprefix%3D%25E6%259C%25AC%2Baws%2B%25E9%2596%258B%25E7%2599%25BA%252Caps%252C167%26ref%3Dnb_sb_noss" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 AWS 開発]</a><img decoding="async" src="//i.moshimo.com/af/i/impression?a_id=1384942&p_id=170&pc_id=185&pl_id=4062" width="1" height="1" style="border:none;" alt="" loading="lazy"> --></p>
<p><!-- <!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"AWSの基本・仕組み・重要用語が全部わかる教科書 (見るだけ図解)","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51DEDQXj6oL._SL500_.jpg","\/41F589smNwL._SL500_.jpg","\/41R6f9yyCWL._SL500_.jpg","\/41HqWQ9BvmL._SL500_.jpg","\/41p8p0ZU79L._SL500_.jpg","\/41qLC-fndBL._SL500_.jpg","\/41fcLv9VT5L._SL500_.jpg","\/51lRvCsvHqL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815607850","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4815607850","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%BB%E4%BB%95%E7%B5%84%E3%81%BF%E3%83%BB%E9%87%8D%E8%A6%81%E7%94%A8%E8%AA%9E%E3%81%8C%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8%20(%E8%A6%8B%E3%82%8B%E3%81%A0%E3%81%91%E5%9B%B3%E8%A7%A3)\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%BB%E4%BB%95%E7%B5%84%E3%81%BF%E3%83%BB%E9%87%8D%E8%A6%81%E7%94%A8%E8%AA%9E%E3%81%8C%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8%20(%E8%A6%8B%E3%82%8B%E3%81%A0%E3%81%91%E5%9B%B3%E8%A7%A3)","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"eaCUB","s":"s"});</script></p>
<div id="msmaflink-eaCUB">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --> --></p>
<h2><span id="toc2">キーワード解説</span></h2>
<table>
<thead>
<tr>
<th>用語</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>AWS CDK</strong></td>
<td>Python・TypeScript などのプログラミング言語で AWS インフラを定義する IaC フレームワーク</td>
</tr>
<tr>
<td><strong>CDK App</strong></td>
<td><code>app.py</code> がエントリポイント。<code>cdk synth</code> でここから CloudFormation テンプレートを生成</td>
</tr>
<tr>
<td><strong>CDK Stack</strong></td>
<td>1つの CloudFormation スタックに対応する単位。今回は <code>CdkAlbEc2RdsStack</code></td>
</tr>
<tr>
<td><strong>L2 Construct</strong></td>
<td>AWS がベストプラクティスを組み込んだ高レベルな抽象クラス（<code>ec2.Vpc</code> 等）。内部で複数の AWS リソースを自動生成</td>
</tr>
<tr>
<td><strong>CDK Context</strong></td>
<td><code>cdk.json</code> に書くデプロイ設定。<code>-c key=value</code> で上書き可能</td>
</tr>
<tr>
<td><strong>CDK Bootstrap</strong></td>
<td>CDK が AWS にデプロイするために必要な事前準備（S3 バケット等を作成）。<strong>同じアカウント・リージョンで初回のみ</strong></td>
</tr>
<tr>
<td><strong>cdk synth</strong></td>
<td>Python コードから CloudFormation テンプレートを生成（デプロイなし）</td>
</tr>
<tr>
<td><strong>cdk diff</strong></td>
<td>現在のデプロイ状態と新しいコードの差分を表示</td>
</tr>
<tr>
<td><strong>cdk deploy</strong></td>
<td>CloudFormation スタックをデプロイ</td>
</tr>
<tr>
<td><strong>cdk destroy</strong></td>
<td>CloudFormation スタックとその全リソースを削除</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">CloudFormation vs CDK：どれだけ違うか</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>CloudFormation（alb-ec2-rds）</th>
<th>CDK（このハンズオン）</th>
</tr>
</thead>
<tbody>
<tr>
<td>記述言語</td>
<td>YAML（宣言型）</td>
<td>Python（プログラミング言語）</td>
</tr>
<tr>
<td>コード量</td>
<td>約460行</td>
<td><strong>約200行</strong></td>
</tr>
<tr>
<td>VPC 定義</td>
<td>15+ リソースを手動定義</td>
<td><code>ec2.Vpc</code> 1つで IGW・ルートテーブル等を自動生成</td>
</tr>
<tr>
<td>SG-to-SG 制御</td>
<td><code>SourceSecurityGroupId: !GetAtt</code> で参照</td>
<td><code>add_ingress_rule(alb_sg, ...)</code> で直感的に記述</td>
</tr>
<tr>
<td>ALB + TG + リスナー</td>
<td>3リソースを別々に定義</td>
<td><code>add_listener → add_targets</code> でメソッドチェーン</td>
</tr>
<tr>
<td>変数・ループ</td>
<td><code>!Sub</code> / <code>!If</code> でのみ表現</td>
<td>Python の変数・f-string・for文が使える</td>
</tr>
<tr>
<td>デプロイコマンド</td>
<td><code>aws cloudformation deploy ...</code></td>
<td><code>cdk deploy</code></td>
</tr>
<tr>
<td>削除コマンド</td>
<td><code>aws cloudformation delete-stack ...</code></td>
<td><code>cdk destroy</code></td>
</tr>
<tr>
<td>差分確認</td>
<td>変更セット（手動作成）</td>
<td><code>cdk diff</code>（自動）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc4">使用するAWSサービス</span></h2>
<table>
<thead>
<tr>
<th>サービス</th>
<th>役割</th>
<th>料金</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>VPC</strong></td>
<td>カスタムネットワーク空間</td>
<td>無料</td>
</tr>
<tr>
<td><strong>EC2</strong>（t2.micro）</td>
<td>APサーバ（Tomcat）</td>
<td>月750時間まで無料枠あり</td>
</tr>
<tr>
<td><strong>RDS MySQL</strong>（db.t3.micro）</td>
<td>マネージドDBサーバ</td>
<td>月750時間まで無料枠あり</td>
</tr>
<tr>
<td><strong>ALB</strong></td>
<td>ロードバランサー</td>
<td>約$0.008/時間 + LCU料金（<strong>無料枠なし</strong>）</td>
</tr>
<tr>
<td><strong>SSM Parameter Store</strong></td>
<td>DBパスワードの安全な保管</td>
<td>スタンダード層は無料</td>
</tr>
<tr>
<td><strong>IAM</strong></td>
<td>EC2にSSM・Parameter Store権限を付与</td>
<td>無料</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>注意</strong>: ALBは無料枠がありません。ハンズオン後は必ず <code>cdk destroy</code> で削除してください。</p>
</blockquote>
<hr>
<h2><span id="toc5">前提条件</span></h2>
<table>
<thead>
<tr>
<th>ツール</th>
<th>確認コマンド</th>
</tr>
</thead>
<tbody>
<tr>
<td>AWS CLI v2</td>
<td><code>aws --version</code></td>
</tr>
<tr>
<td>Python 3.9 以上</td>
<td><code>python --version</code></td>
</tr>
<tr>
<td>Node.js 18 以上</td>
<td><code>node --version</code></td>
</tr>
<tr>
<td>CDK CLI</td>
<td><code>cdk --version</code></td>
</tr>
</tbody>
</table>
<p>AWS 認証確認:</p>
<pre><code class="language-cmd">aws sts get-caller-identity</code></pre>
<blockquote>
<p>Node.js と CDK CLI のインストール手順は <a href="https://github.com/caymezon/aws-handson/tree/main/docs/setup/09_nodejs-cdk.md">docs/setup/09_nodejs-cdk.md</a> を参照してください。</p>
</blockquote>
<hr>
<h2><span id="toc6">構築されるリソース</span></h2>
<p>CDK が <code>cdk deploy</code> 時に自動生成するリソース一覧です。</p>
<table>
<thead>
<tr>
<th>カテゴリ</th>
<th>リソース</th>
</tr>
</thead>
<tbody>
<tr>
<td>ネットワーク</td>
<td>VPC / IGW / パブリックサブネット×2 / プライベートサブネット×2 / ルートテーブル×2</td>
</tr>
<tr>
<td>セキュリティ</td>
<td>ALB SG / EC2 SG / RDS SG</td>
</tr>
<tr>
<td>IAM</td>
<td>EC2ロール / インスタンスプロファイル</td>
</tr>
<tr>
<td>パラメータ</td>
<td>SSM Parameter Store（DBパスワード）</td>
</tr>
<tr>
<td>データベース</td>
<td>RDS DBサブネットグループ / RDS MySQL 8.0</td>
</tr>
<tr>
<td>ロードバランサー</td>
<td>ターゲットグループ / ALB / リスナー</td>
</tr>
<tr>
<td>コンピュート</td>
<td>EC2インスタンス（Tomcat）</td>
</tr>
</tbody>
</table>
<blockquote>
<p>CloudFormation 版では約27リソースを YAML に個別定義しましたが、CDK では <code>ec2.Vpc</code> 1つがVPC・IGW・ルートテーブル等を自動生成するため、Python コードとして書くのは主要リソースのみです。</p>
</blockquote>
<hr>
<h2><span id="toc7">作業順序</span></h2>
<pre><code class="language-plaintext">⓪ 自分のIPアドレスを確認する
      ↓
① キーペアを作成する（AWS CLI で実施）
      ↓
② プロジェクトのセットアップ（Python 仮想環境）
      ↓
③ cdk.json を設定する
      ↓
④ CDK Bootstrap（初回のみ）
      ↓
⑤ CDK Synth（テンプレート確認）
      ↓
⑥ デプロイ（cdk deploy）
      ↓
⑦ 動作確認（ALBアクセス・SSH・RDS接続）
      ↓
⑧ CDK diff（参考）
      ↓
⑨ リソース削除（cdk destroy）</code></pre>
<hr>
<h2><span id="toc8">【重要】⓪ 自分のIPアドレスを確認する</span></h2>
<pre><code class="language-cmd">curl https://checkip.amazonaws.com</code></pre>
<p><strong>控えておく情報</strong>: 自分のIPアドレス（例: <code>203.0.113.1</code>）</p>
<blockquote>
<p>セキュリティグループで <code>203.0.113.1/32</code> の形式（末尾に <code>/32</code>）で使用します。</p>
</blockquote>
<hr>
<h2><span id="toc9">① キーペアの作成</span></h2>
<p>CDK では <code>cdk deploy</code> 時にキーペアのダウンロードができないため、<strong>事前に AWS CLI で作成</strong>します。</p>
<blockquote>
<p><code>%USERPROFILE%\.ssh\</code> が存在しない場合は先に <code>mkdir %USERPROFILE%\.ssh</code> を実行してください。</p>
</blockquote>
<pre><code class="language-cmd">aws ec2 create-key-pair ^
  --key-name my-cdk-alb-key ^
  --query KeyMaterial ^
  --output text ^
  --region ap-northeast-1 &gt; %USERPROFILE%\.ssh\my-cdk-alb-key.pem</code></pre>
<p><strong>控えておく情報</strong>: キーペア名 <code>my-cdk-alb-key</code></p>
<hr>
<h2><span id="toc10">② プロジェクトのセットアップ</span></h2>
<p>CDK の Python プロジェクトを実行するために、Python 仮想環境（venv）を作成してパッケージをインストールします。</p>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\cdk-alb-ec2-rds

python -m venv .venv

.venv\Scripts\activate

pip install -r requirements.txt</code></pre>
<p>仮想環境が有効になると、プロンプトの先頭に <code>(.venv)</code> が表示されます。</p>
<blockquote>
<p><strong>重要</strong>: CDK のコマンド（synth / deploy / diff / destroy）はすべてこの仮想環境が有効な状態で実行する必要があります。<br />ターミナルを閉じると仮想環境の有効化が解除されるため、<strong>ターミナルを開き直した際は必ず最初に以下を実行してください</strong>。</p>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\cdk-alb-ec2-rds
.venv\Scripts\activate</code></pre>
<p>プロンプトに <code>(.venv)</code> が付いていることを確認してから CDK コマンドを実行してください。</p>
</blockquote>
<hr>
<h2><span id="toc11">③ cdk.json の設定</span></h2>
<p><code>cdk.json</code> の <code>context</code> セクションを自分の環境に合わせて編集します。</p>
<pre><code class="language-json">{
  "context": {
    "employee_id": "my",
    "my_ip": "203.0.113.1/32",
    "db_password": "Handson1234!",
    "key_name": "my-cdk-alb-key",
    "tomcat_version": "10.1.28"
  }
}</code></pre>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>employee_id</code></td>
<td><code>my</code></td>
<td>リソース名のプレフィックス（<code>my-cdk-alb-xxx</code> という名前になる）</td>
</tr>
<tr>
<td><code>my_ip</code></td>
<td>⓪で確認したIP <code>/32</code></td>
<td>EC2へのSSHを許可するIP</td>
</tr>
<tr>
<td><code>db_password</code></td>
<td><code>Handson1234!</code></td>
<td>RDS MySQL のパスワード</td>
</tr>
<tr>
<td><code>key_name</code></td>
<td><code>my-cdk-alb-key</code></td>
<td>①で作成したキーペア名</td>
</tr>
<tr>
<td><code>tomcat_version</code></td>
<td><code>10.1.28</code></td>
<td>Tomcat バージョン</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong><code>cdk.json</code> はバージョン管理に含めます</strong>（<code>cdk.context.json</code> は <code>.gitignore</code> 対象）。</p>
</blockquote>
<blockquote>
<p>CDK の詳細なコード（<code>stacks/alb_ec2_rds_stack.py</code> など）は <a href="https://github.com/caymezon/aws-handson/tree/main/cdk-alb-ec2-rds">GitHub</a> を参照してください。</p>
</blockquote>
<hr>
<h2><span id="toc12">④ CDK Bootstrap（初回のみ）</span></h2>
<p>CDK が AWS 環境にデプロイするために必要なリソース（S3 バケット等）を事前にセットアップします。<br /><strong>同じアカウント・リージョンで一度だけ実行すれば以降は不要</strong>です。</p>
<blockquote>
<p><code>cdk bootstrap</code> は <code>app.py</code> を実行しないため、仮想環境の有効・無効に関わらず実行できます。② で有効にした仮想環境はそのままで進めてください。</p>
</blockquote>
<pre><code class="language-cmd">rem アカウントIDを確認
aws sts get-caller-identity --query Account --output text

rem Bootstrap を実行（アカウントIDを置き換えて実行）
cdk bootstrap aws://123456789012/ap-northeast-1</code></pre>
<p>正常完了すると「CDKToolkit」という CloudFormation スタックが作成されます。</p>
<table>
<thead>
<tr>
<th>ステータス</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CREATE_COMPLETE</code></td>
<td>Bootstrap 完了</td>
</tr>
<tr>
<td><code>ALREADY_EXISTS</code></td>
<td>既に Bootstrap 済み（スキップ可）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc13">⑤ CDK Synth（テンプレート確認）</span></h2>
<p>デプロイ前に CDK が生成する CloudFormation テンプレートを確認します。<strong>この段階では AWS へのデプロイは行われません。</strong></p>
<pre><code class="language-cmd">cdk synth</code></pre>
<p><code>cdk.out/</code> ディレクトリに CloudFormation テンプレート（JSON）が生成されます。</p>
<p>CloudFormation 版との比較ポイント:</p>
<ul>
<li>CDK が自動生成したVPC・ルートテーブル等のリソースが含まれていることを確認</li>
<li>Python コード（約200行）から生成されたテンプレートの行数を確認（はるかに多い）</li>
</ul>
<blockquote>
<p><strong>なぜテンプレートは増えるのか</strong>: CDK の Python コードは「人間が書く量」を減らすための抽象化です。実際に AWS に渡される CloudFormation テンプレートは CDK が自動生成するため、行数は多くなります。</p>
</blockquote>
<pre><code class="language-cmd">rem 生成されたテンプレートをテキストエディタで確認
notepad cdk.out\CdkAlbEc2RdsStack.template.json</code></pre>
<hr>
<h2><span id="toc14">⑥ デプロイ</span></h2>
<pre><code class="language-cmd">cdk deploy</code></pre>
<p>実行中に「Do you wish to deploy these changes?」と表示されたら <code>y</code> を入力します。</p>
<blockquote>
<p><strong>所要時間</strong>: RDS の作成に 15〜20 分かかります。</p>
</blockquote>
<p>デプロイ完了後、Outputs が表示されます:</p>
<pre><code class="language-plaintext">Outputs:
CdkAlbEc2RdsStack.ALBEndpoint = http://my-cdk-alb-alb-xxxx.ap-northeast-1.elb.amazonaws.com
CdkAlbEc2RdsStack.EC2PublicIP = x.x.x.x
CdkAlbEc2RdsStack.RDSEndpoint = my-cdk-alb-rds-mysql.xxxx.ap-northeast-1.rds.amazonaws.com
CdkAlbEc2RdsStack.SSHCommand = ssh -i %USERPROFILE%\.ssh\my-cdk-alb-key.pem ec2-user@x.x.x.x
CdkAlbEc2RdsStack.MySQLConnectCommand = mysql -h my-cdk-alb-rds-mysql.xxxx... -u admin -pHandson1234! sampledb</code></pre>
<p><strong>控えておく情報</strong>: <code>ALBEndpoint</code>、<code>EC2PublicIP</code>、<code>RDSEndpoint</code></p>
<p><!-- ![cdk deploy完了後のOutputs確認画面](images/cdk-deploy-outputs.jpg) --></p>
<hr>
<h2><span id="toc15">⑦ 動作確認</span></h2>
<h3><span id="toc16">7-1. ALB のヘルスチェック確認</span></h3>
<p><strong>EC2 → ターゲットグループ → <code>my-cdk-alb-tg</code> → 「ターゲット」タブ</strong></p>
<p>EC2 のステータスが <strong>「healthy」</strong> になるまで待ちます（EC2 起動後 5〜10 分）。</p>
<table>
<thead>
<tr>
<th>ステータス</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>initial</code></td>
<td>初期ヘルスチェック中（待つ）</td>
</tr>
<tr>
<td><code>healthy</code></td>
<td>正常（トラフィック転送される）</td>
</tr>
<tr>
<td><code>unhealthy</code></td>
<td>異常（Tomcat が起動していない可能性）</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Tomcat の起動はEC2が「実行中」になってからさらに 3〜5 分かかります。</p>
</blockquote>
<p>ターゲットグループの ARN を CLI で確認する場合:</p>
<pre><code class="language-cmd">aws elbv2 describe-target-groups ^
  --names my-cdk-alb-tg ^
  --query TargetGroups[0].TargetGroupArn ^
  --output text ^
  --region ap-northeast-1</code></pre>
<h3><span id="toc17">7-2. ALB 経由でWebアクセス確認</span></h3>
<p>Outputs の <code>ALBEndpoint</code> の URL をブラウザで開きます。</p>
<pre><code class="language-plaintext">http://（ALBEndpoint の DNS 名）</code></pre>
<p>以下が表示されれば正常です:</p>
<pre><code class="language-plaintext">AP Server - my-cdk ALB + EC2 + RDS
Deployed via AWS CDK (Python). Connects to RDS MySQL in the private subnet.</code></pre>
<blockquote>
<p>EC2 のパブリック IP に直接アクセスしても表示されません（ポート 8080 は ALB SG からのみ許可しているため）。</p>
</blockquote>
<p><!-- ![ALB経由でTomcat画面が表示されている様子](images/alb-healthy-access.jpg) --></p>
<h3><span id="toc18">7-3. EC2 に SSH 接続する</span></h3>
<p>Outputs の <code>SSHCommand</code> を実行します（パスは実際のパスに修正します）。</p>
<pre><code class="language-cmd">ssh -i %USERPROFILE%\.ssh\my-cdk-alb-key.pem ec2-user@（EC2PublicIP）</code></pre>
<h3><span id="toc19">7-4. EC2 から RDS への接続確認</span></h3>
<p>EC2 に SSH 接続後（以下は EC2 上での操作）:</p>
<pre><code class="language-bash">sudo dnf install -y mariadb105

# SSM Parameter Store からパスワードを取得
DB_PASSWORD=$(aws ssm get-parameter \
  --name /my/cdk-alb/db-password \
  --query Parameter.Value \
  --output text \
  --region ap-northeast-1)

# RDS に接続（Outputs の RDSEndpoint を使用）
mysql -h &lt;RDSEndpoint&gt; -u admin -p${DB_PASSWORD} sampledb</code></pre>
<pre><code class="language-sql">-- テーブル作成
CREATE TABLE items (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- データ挿入
INSERT INTO items (name) VALUES ('Apple'), ('Banana');

-- データ確認
SELECT * FROM items;

-- 後片付け
DROP TABLE items;

EXIT;</code></pre>
<p><!-- ![EC2からRDS MySQLへの接続成功画面](images/rds-mysql-connect.jpg) --></p>
<h3><span id="toc20">7-5. SSH 接続を切断する</span></h3>
<pre><code class="language-bash">exit</code></pre>
<h3><span id="toc21">7-6. UserData の実行ログ確認</span></h3>
<p>EC2 に SSH 接続後（以下は EC2 上での操作）:</p>
<pre><code class="language-bash">sudo cat /var/log/user-data.log</code></pre>
<p>エラーなく最後まで実行されていれば正常です。</p>
<hr>
<h2><span id="toc22">⑧ CDK の差分確認（参考）</span></h2>
<p>コードを変更した後、デプロイ前に差分を確認できます。これが CDK の強力な機能の1つです。</p>
<pre><code class="language-cmd">cdk diff</code></pre>
<p>CloudFormation の変更セット相当の情報が自動で表示されます。</p>
<pre><code class="language-plaintext">Stack CdkAlbEc2RdsStack
Resources
[~] AWS::EC2::Instance EC2Instance
 └─ [~] UserData
     └─ [~] .Fn::Base64
         └─ ...</code></pre>
<hr>
<h2><span id="toc23">⑨ リソース削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ず削除します。</strong></p>
<pre><code class="language-cmd">cdk destroy</code></pre>
<p>「Are you sure you want to delete?」に <code>y</code> を入力します。</p>
<blockquote>
<p><strong>所要時間</strong>: RDS の削除に 10〜15 分かかります。</p>
</blockquote>
<h3><span id="toc24">削除されるリソース一覧</span></h3>
<table>
<thead>
<tr>
<th>リソース</th>
<th>削除タイミング</th>
</tr>
</thead>
<tbody>
<tr>
<td>ALB・リスナー・ターゲットグループ</td>
<td>cdk destroy 実行直後</td>
</tr>
<tr>
<td>EC2 インスタンス</td>
<td>cdk destroy 実行直後</td>
</tr>
<tr>
<td>RDS インスタンス</td>
<td>10〜15 分（削除ポリシー: DESTROY）</td>
</tr>
<tr>
<td>VPC・サブネット・SG</td>
<td>RDS 削除後</td>
</tr>
<tr>
<td>SSM Parameter Store</td>
<td>スタック削除と同時</td>
</tr>
<tr>
<td>IAM ロール・インスタンスプロファイル</td>
<td>スタック削除と同時</td>
</tr>
</tbody>
</table>
<h3><span id="toc25">キーペアの削除（手動）</span></h3>
<p>CDK が管理していないリソースは手動で削除します:</p>
<pre><code class="language-cmd">aws ec2 delete-key-pair ^
  --key-name my-cdk-alb-key ^
  --region ap-northeast-1

del %USERPROFILE%\.ssh\my-cdk-alb-key.pem</code></pre>
<h3><span id="toc26">仮想環境の終了</span></h3>
<p>ハンズオンが終わったらプロンプトの <code>(.venv)</code> を外します。</p>
<pre><code class="language-cmd">deactivate</code></pre>
<p><code>(.venv)</code> が消えて通常のプロンプトに戻れば完了です。</p>
<blockquote>
<p><strong><code>(.venv)</code> が付いている状態とは</strong>: このプロジェクト専用の Python 環境（venv）が有効な状態です。<code>deactivate</code> しなくてもターミナルを閉じれば自動的に解除されます。次回 CDK コマンドを使う際は再度 <code>.venv\Scripts\activate</code> が必要です。</p>
</blockquote>
<h3><span id="toc27">削除完了の確認</span></h3>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name CdkAlbEc2RdsStack ^
  --region ap-northeast-1</code></pre>
<p>「Stack with id CdkAlbEc2RdsStack does not exist」エラーが出れば削除完了です。</p>
<h3><span id="toc28">CDK Bootstrap リソースの削除（任意）</span></h3>
<p>CDK を今後も使う場合は残したままでよいです。<br />削除する場合は AWS コンソールで <code>CDKToolkit</code> スタックを手動削除します。</p>
<hr>
<h2><span id="toc29">CDK のポイント解説</span></h2>
<h3><span id="toc30">L1 / L2 / L3 Construct の違い</span></h3>
<table>
<thead>
<tr>
<th>レベル</th>
<th>名前</th>
<th>説明</th>
<th>例</th>
</tr>
</thead>
<tbody>
<tr>
<td>L1</td>
<td>Cfn Construct</td>
<td>CloudFormation リソースと 1:1 対応。<code>Cfn</code> プレフィックス</td>
<td><code>ec2.CfnVPC</code></td>
</tr>
<tr>
<td>L2</td>
<td>Default Construct</td>
<td>AWS のベストプラクティスを組み込んだ高レベル抽象</td>
<td><code>ec2.Vpc</code></td>
</tr>
<tr>
<td>L3</td>
<td>Pattern</td>
<td>複数サービスを組み合わせた再利用可能なパターン</td>
<td><code>ecs_patterns.ApplicationLoadBalancedFargateService</code></td>
</tr>
</tbody>
</table>
<p>このハンズオンでは主に <strong>L2 Construct</strong> を使用しています。<code>ec2.Vpc</code> 1つを書くだけで、CloudFormation では15+ リソースが必要だったVPC・IGW・ルートテーブル・サブネット設定を自動生成します。</p>
<h3><span id="toc31">CDK Context 変数</span></h3>
<p><code>cdk.json</code> の <code>context</code> に設定した値は <code>self.node.try_get_context(&quot;key&quot;)</code> で取得できます。<br />デプロイ時に <code>-c key=value</code> で上書きも可能です:</p>
<pre><code class="language-cmd">cdk deploy -c my_ip=1.2.3.4/32 -c db_password=MyPass123!</code></pre>
<h3><span id="toc32">cdk synth で CloudFormation テンプレートを確認</span></h3>
<pre><code class="language-cmd">rem cdk.out/ に生成されたテンプレートをテキストエディタで確認
notepad cdk.out\CdkAlbEc2RdsStack.template.json</code></pre>
<p>CDK コードの詳細（<code>stacks/alb_ec2_rds_stack.py</code> 全文）は <a href="https://github.com/caymezon/aws-handson/tree/main/cdk-alb-ec2-rds">GitHub</a> を参照してください。</p>
<hr>
<h2><span id="toc33">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>cdk deploy</code> で認証エラー</td>
<td>AWS 認証情報が未設定</td>
<td><code>aws sts get-caller-identity</code> で確認</td>
</tr>
<tr>
<td><code>cdk bootstrap</code> が必要と言われる</td>
<td>Bootstrap 未実施</td>
<td>④の手順を実施</td>
</tr>
<tr>
<td><code>ModuleNotFoundError: aws_cdk</code></td>
<td>仮想環境が無効</td>
<td><code>.venv\Scripts\activate</code> を実行してから再度 CDK コマンドを実行</td>
</tr>
<tr>
<td>ALB にアクセスすると 502</td>
<td>Tomcat 起動前</td>
<td>3〜5 分待ってリトライ</td>
</tr>
<tr>
<td>SSH できない</td>
<td>my_ip が違う、またはキー名が違う</td>
<td><code>cdk.json</code> の <code>my_ip</code> と <code>key_name</code> を確認</td>
</tr>
<tr>
<td>RDS に接続できない</td>
<td>SG 設定の問題</td>
<td>EC2 SG から RDS SG への 3306 ルールを確認</td>
</tr>
<tr>
<td><code>cdk destroy</code> が途中で止まる</td>
<td>RDS の削除待ち</td>
<td>10〜15 分待つ（自動的に続行される）</td>
</tr>
<tr>
<td><code>No match for argument: mysql</code></td>
<td>AL2023 では mysql パッケージが存在しない</td>
<td><code>sudo dnf install -y mariadb105</code> を使う</td>
</tr>
</tbody>
</table>
<p>デプロイ失敗時のログ確認:</p>
<pre><code class="language-cmd">aws cloudformation describe-stack-events ^
  --stack-name CdkAlbEc2RdsStack ^
  --region ap-northeast-1 ^
  --query "StackEvents[?ResourceStatus=='CREATE_FAILED'].[ResourceType,ResourceStatusReason]" ^
  --output table</code></pre>
<hr>
<h2><span id="toc34">コンソール版・CloudFormation版との比較</span></h2>
<table>
<thead>
<tr>
<th>作業</th>
<th>コンソール（手動）</th>
<th>CloudFormation</th>
<th><strong>CDK（今回）</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>VPC + サブネット4つ + IGW + RT</td>
<td>約20〜30分</td>
<td>template.yaml に定義済み</td>
<td><strong><code>ec2.Vpc</code> 1行で自動生成</strong></td>
</tr>
<tr>
<td>SG 3つ（ALB/EC2/RDS）の作成</td>
<td>3画面で個別設定</td>
<td>template.yaml に定義済み</td>
<td><strong>Python コードで直感的に記述</strong></td>
</tr>
<tr>
<td>ALB + TG + Listener の作成</td>
<td>3つの画面で設定</td>
<td>template.yaml に定義済み</td>
<td><strong>メソッドチェーンで接続</strong></td>
</tr>
<tr>
<td>コード量</td>
<td>—</td>
<td>約460行（YAML）</td>
<td><strong>約200行（Python）</strong></td>
</tr>
<tr>
<td>全体のデプロイ</td>
<td><strong>約40〜50分</strong></td>
<td>コマンド1本（RDS待ち15〜20分）</td>
<td><code>cdk deploy</code> 1本（同等）</td>
</tr>
<tr>
<td>削除</td>
<td><strong>13ステップ手動</strong></td>
<td><code>delete-stack</code> 1本</td>
<td><code>cdk destroy</code> 1本</td>
</tr>
<tr>
<td>差分確認</td>
<td>—</td>
<td>変更セット（手動作成）</td>
<td><code>cdk diff</code>（自動・即時）</td>
</tr>
<tr>
<td>バージョン管理</td>
<td>不可</td>
<td>Gitで管理可能</td>
<td>Gitで管理可能</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc35">まとめ</span></h2>
<table>
<thead>
<tr>
<th>ステップ</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>①②</td>
<td>キーペア作成 + Python 仮想環境のセットアップ</td>
</tr>
<tr>
<td>③</td>
<td><code>cdk.json</code> に自分の環境（IP・パスワード・キー名）を設定</td>
</tr>
<tr>
<td>④</td>
<td><code>cdk bootstrap</code>（初回のみ。以降は不要）</td>
</tr>
<tr>
<td>⑤</td>
<td><code>cdk synth</code> で CloudFormation テンプレートを確認（デプロイなし）</td>
</tr>
<tr>
<td>⑥</td>
<td><code>cdk deploy</code> でデプロイ（RDS 待ち 15〜20 分）</td>
</tr>
<tr>
<td>⑦</td>
<td>ALB DNS 名でアクセス → EC2 → Parameter Store → RDS への接続テスト</td>
</tr>
<tr>
<td>⑨</td>
<td><code>cdk destroy</code> で全リソースを一括削除</td>
</tr>
</tbody>
</table>
<p>CDK の最大の魅力は <strong>プログラミング言語でインフラを書ける</strong>点です。CloudFormation の460行の YAML が Python 約200行に削減されただけでなく、<code>cdk diff</code> による差分確認や L2 Construct による抽象化など、開発者体験が大きく向上します。</p>
<p>コンソールで3層構成の概念を視覚的に学びたい場合は <a href="https://caymezon.com/aws-handson-console-alb-ec2-rds/">AWSコンソール版ハンズオン</a>、まずCloudFormationで同じ構成を試したい場合は <a href="https://caymezon.com/aws-handson-cloudformation-alb-ec2-rds/">CloudFormation版ハンズオン</a> を参照してください。</p><p>The post <a href="https://caymezon.com/aws-handson-cdk-alb-ec2-rds/">AWS CDK（Python）でALB + EC2(Tomcat) + RDS 3層構成を構築する手順【CloudFormation 460行 → CDK 200行】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-cdk-alb-ec2-rds/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
