<?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>スケーリング - CayTech Lab</title>
	<atom:link href="https://caymezon.com/tag/%e3%82%b9%e3%82%b1%e3%83%bc%e3%83%aa%e3%83%b3%e3%82%b0/feed/" rel="self" type="application/rss+xml" />
	<link>https://caymezon.com</link>
	<description></description>
	<lastBuildDate>Thu, 30 Apr 2026 10:14:30 +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>スケーリング - 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>CDK + Auto Scaling Group で Webアプリをオートスケーリング構成にする【CPU負荷でスケールアウト体験】</title>
		<link>https://caymezon.com/aws-handson-cdk-asg-webapp/</link>
					<comments>https://caymezon.com/aws-handson-cdk-asg-webapp/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 10:14:30 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[ALB]]></category>
		<category><![CDATA[ASG]]></category>
		<category><![CDATA[Auto Scaling Group]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[CDK]]></category>
		<category><![CDATA[CDK Pipelines]]></category>
		<category><![CDATA[CI/CD]]></category>
		<category><![CDATA[CodeBuild]]></category>
		<category><![CDATA[CodeDeploy]]></category>
		<category><![CDATA[CodePipeline]]></category>
		<category><![CDATA[GitOps]]></category>
		<category><![CDATA[IaC]]></category>
		<category><![CDATA[Launch Template]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[RDS]]></category>
		<category><![CDATA[Session Manager]]></category>
		<category><![CDATA[Spring Boot]]></category>
		<category><![CDATA[SSM]]></category>
		<category><![CDATA[WAR]]></category>
		<category><![CDATA[スケーリング]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[自動デプロイ]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20409</guid>

					<description><![CDATA[<p>目次 はじめにキーワード解説cdk-webapp-pipeline との比較ファイル構成と役割使用するAWSサービス前提条件作業順序① プロジェクトのセットアップ② GitHub との接続を作成する（CodeConnec [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-cdk-asg-webapp/">CDK + Auto Scaling Group で Webアプリをオートスケーリング構成にする【CPU負荷でスケールアウト体験】</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">cdk-webapp-pipeline との比較</a></li><li><a href="#toc4" tabindex="0">ファイル構成と役割</a></li><li><a href="#toc5" tabindex="0">使用するAWSサービス</a></li><li><a href="#toc6" tabindex="0">前提条件</a></li><li><a href="#toc7" tabindex="0">作業順序</a></li><li><a href="#toc8" tabindex="0">① プロジェクトのセットアップ</a></li><li><a href="#toc9" tabindex="0">② GitHub との接続を作成する（CodeConnections）</a><ol><li><a href="#toc10" tabindex="0">接続を作成する</a></li><li><a href="#toc11" tabindex="0">GitHub App をインストールする</a></li><li><a href="#toc12" tabindex="0">接続 ARN を確認する</a></li></ol></li><li><a href="#toc13" tabindex="0">③ cdk.json の設定</a></li><li><a href="#toc14" tabindex="0">④ コードを GitHub にプッシュする（重要！）</a></li><li><a href="#toc15" tabindex="0">⑤ パイプラインスタックのデプロイ（初回のみ）</a></li><li><a href="#toc16" tabindex="0">⑥ パイプラインの実行状況を確認する</a><ol><li><a href="#toc17" tabindex="0">CloudFormation スタックの命名規則</a></li><li><a href="#toc18" tabindex="0">CloudFormation Outputs の確認</a></li></ol></li><li><a href="#toc19" tabindex="0">⑦ アプリへアクセスする</a><ol><li><a href="#toc20" tabindex="0">ASG インスタンスを確認する</a></li></ol></li><li><a href="#toc21" tabindex="0">⑧ Auto Scaling を体験する</a><ol><li><a href="#toc22" tabindex="0">現在の ASG 状態を確認する</a></li><li><a href="#toc23" tabindex="0">SSM Session Manager でインスタンスに接続する</a></li><li><a href="#toc24" tabindex="0">CPU 負荷をかける（スケールアウトをトリガーする）</a></li><li><a href="#toc25" tabindex="0">スケールアウトを監視する</a></li><li><a href="#toc26" tabindex="0">スケールアウト後の CodeDeploy 自動デプロイを確認する</a></li><li><a href="#toc27" tabindex="0">スケールインを確認する</a></li></ol></li><li><a href="#toc28" tabindex="0">⑨ CI/CD を体験する（アプリ変更を push で自動反映）</a><ol><li><a href="#toc29" tabindex="0">アプリの HTML を変更する</a></li><li><a href="#toc30" tabindex="0">コミット＆プッシュ</a></li><li><a href="#toc31" tabindex="0">パイプラインの自動起動を確認する</a></li></ol></li><li><a href="#toc32" tabindex="0">⑩ リソース削除</a><ol><li><a href="#toc33" tabindex="0">1. インフラスタックを削除する</a></li><li><a href="#toc34" tabindex="0">2. パイプラインスタックを削除する</a></li><li><a href="#toc35" tabindex="0">3. SSM パラメータを削除する</a></li><li><a href="#toc36" tabindex="0">4. 仮想環境の終了</a></li><li><a href="#toc37" tabindex="0">5. GitHub との接続を削除する（オプション）</a></li><li><a href="#toc38" tabindex="0">削除確認</a></li><li><a href="#toc39" tabindex="0">削除されるリソース一覧</a></li></ol></li><li><a href="#toc40" tabindex="0">Auto Scaling のポイント解説</a><ol><li><a href="#toc41" tabindex="0">ASG ライフサイクルフックで新インスタンスへ自動デプロイ</a></li><li><a href="#toc42" tabindex="0">cdk-webapp-pipeline → cdk-asg-webapp の変化</a></li></ol></li><li><a href="#toc43" tabindex="0">トラブルシューティング</a></li><li><a href="#toc44" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>「EC2 が 1台では負荷が集中したときに対応できない」「障害で EC2 が落ちたら手動で復旧しなければならない」——これを解決するのが <strong>Auto Scaling Group（ASG）</strong> です。</p>
<p>この記事では、<a href="https://caymezon.com/aws-handson-cdk-webapp-pipeline/">CDK Pipelines + CodeDeploy ハンズオン</a>で構築した <strong>単一 EC2 構成</strong>を、<strong>Auto Scaling Group + Launch Template</strong> にアップグレードします。CPU 負荷をかけて実際にスケールアウトを体験し、新しいインスタンスへ <strong>CodeDeploy が自動で WAR をデプロイ</strong>する様子を確認します。</p>
<pre><code class="language-plaintext">GitHub リポジトリ
  ↓ push（自動トリガー）
CodePipeline (my-cdk5-pipeline)
  ├── Source:        GitHub (CodeConnections 経由)
  ├── Build(Synth):  CodeBuild — cdk synth
  ├── Mutate:        パイプライン自己更新（セルフミューテーション）
  ├── InfraDeploy:   CloudFormation — VPC / ASG / RDS / ALB
  └── BuildAndDeployApp: ← post step
        CodeBuild: mvn package → webapp.war 生成
        CodeDeploy: ASG の全 Tomcat に一括デプロイ
                ↓
       [ALB: my-cdk5-alb]
                ↓
       ┌─────────────────────────────┐
       │  Auto Scaling Group (ASG)   │
       │  my-cdk5-asg                │
       │  ・最小 1台 / 最大 3台      │
       │  ・CPU 60% 超でスケールアウト│
       │  ├── EC2: Tomcat + WAR      │
       │  └── EC2: Tomcat + WAR（追加分）│
       └─────────────────────────────┘
                ↓
       [RDS: my-cdk5-rds-mysql]  ← MySQL 8.0</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li><code>git push</code> するだけで ASG の全インスタンスへ WAR が自動デプロイされる</li>
<li>CPU に負荷をかけてスケールアウトを体験する</li>
<li>スケールアウト後の新インスタンスへ CodeDeploy が<strong>自動で WAR をデプロイ</strong>する（ライフサイクルフック）</li>
<li>キーペア不要で <strong>SSM Session Manager</strong> からブラウザ経由でインスタンスに接続する</li>
</ul>
<hr>
<blockquote>
<p><strong>この記事は <a href="https://caymezon.com/aws-handson-cdk-webapp-pipeline/">CDK Pipelines + CodeDeploy ハンズオン（cdk-webapp-pipeline）</a> の発展記事です。</strong><br />CodeDeploy・CDK Pipelines の基本を体験済みの方向けです。コード詳細は <a href="https://github.com/caymezon/aws-handson/tree/main/cdk-asg-webapp">GitHub</a> を参照してください。</p>
</blockquote>
<hr>
<p><!-- ![CodePipelineとASGが動作している画面](images/pipeline-asg-complete.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>Auto Scaling Group（ASG）</strong></td>
<td>EC2 インスタンスのグループを自動管理するサービス。負荷に応じてインスタンス数を増減させ、障害時は自動で置き換える</td>
</tr>
<tr>
<td><strong>Launch Template</strong></td>
<td>ASG が新しいインスタンスを起動する際に使う設定テンプレート（AMI・インスタンスタイプ・UserData 等）</td>
</tr>
<tr>
<td><strong>ターゲット追跡ポリシー</strong></td>
<td>メトリクス（CPU 使用率 60%）を目標値として維持するよう自動スケーリングするポリシー</td>
</tr>
<tr>
<td><strong>ASG ライフサイクルフック</strong></td>
<td>スケールアウト時に新しいインスタンスへ CodeDeploy が最新 WAR を自動デプロイする仕組み</td>
</tr>
<tr>
<td><strong>SSM Session Manager</strong></td>
<td>キーペアなしで EC2 インスタンスにブラウザからセキュアに接続できるサービス</td>
</tr>
<tr>
<td><strong>stress-ng</strong></td>
<td>CPU・メモリ等に人工的な負荷をかけるツール。スケーリングのトリガーとして使用する</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">cdk-webapp-pipeline との比較</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>cdk-webapp-pipeline</th>
<th>cdk-asg-webapp</th>
</tr>
</thead>
<tbody>
<tr>
<td>EC2 管理方法</td>
<td>単一 Instance リソース</td>
<td><strong>Auto Scaling Group + Launch Template</strong></td>
</tr>
<tr>
<td>EC2 台数</td>
<td>固定 1台</td>
<td><strong>最小 1台〜最大 3台（自動増減）</strong></td>
</tr>
<tr>
<td>スケーリング</td>
<td>なし</td>
<td><strong>CPU 60% 超でスケールアウト</strong></td>
</tr>
<tr>
<td>自己回復</td>
<td>なし（手動対応）</td>
<td><strong>ALB ヘルスチェックで異常インスタンスを自動置換</strong></td>
</tr>
<tr>
<td>接続方法</td>
<td>SSH（キーペア必要）</td>
<td><strong>SSM Session Manager（キーペア不要）</strong></td>
</tr>
<tr>
<td>CodeDeploy ターゲット</td>
<td>名前タグで EC2 を指定</td>
<td><strong>ASG を直接指定</strong></td>
</tr>
<tr>
<td>スケールアウト時</td>
<td>新 EC2 に WAR なし</td>
<td><strong>ライフサイクルフックで自動デプロイ</strong></td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc4">ファイル構成と役割</span></h2>
<pre><code class="language-plaintext">cdk-asg-webapp/
├── app.py                     ← CDK アプリ エントリポイント
├── cdk.json                   ← CDK 設定（key_name/my_ip なし・asg_* 追加）
├── appspec.yml                ← CodeDeploy: WAR 配置手順とライフサイクルフック
├── scripts/
│   ├── stop_tomcat.sh
│   ├── cleanup.sh
│   └── start_tomcat.sh
├── app/                       ← Spring Boot Webアプリ（Java）
├── pipeline/
│   └── pipeline_stack.py      ← CodePipeline + post step（ASG 対応）
├── stages/
│   └── deploy_stage.py        ← Stage（WebappStack を内包）
├── stacks/
│   └── webapp_stack.py        ← インフラスタック（ASGName を CfnOutput で公開）
└── components/
    └── webapp_construct.py    ← ASG ベースの L3 Construct</code></pre>
<table>
<thead>
<tr>
<th>ファイル</th>
<th>cdk-webapp-pipeline との主な違い</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>webapp_construct.py</code></td>
<td><code>ec2.Instance</code> → <code>autoscaling.AutoScalingGroup</code> + <code>ec2.LaunchTemplate</code></td>
</tr>
<tr>
<td><code>webapp_stack.py</code></td>
<td><code>InstanceId</code> 出力を廃止 → <code>ASGName</code> を CfnOutput で公開</td>
</tr>
<tr>
<td><code>pipeline_stack.py</code></td>
<td><code>INSTANCE_ID</code> → <code>ASG_NAME</code>（インスタンス待機の方法が変わる）</td>
</tr>
</tbody>
</table>
<p>詳細なコードは <a href="https://github.com/caymezon/aws-handson/tree/main/cdk-asg-webapp">GitHub</a> を参照してください。</p>
<hr>
<h2><span id="toc5">使用する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>Auto Scaling Group + EC2</strong>（t2.micro）</td>
<td>APサーバ（Tomcat + Spring Boot）を自動スケール</td>
<td>インスタンス分の EC2 料金</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>CodePipeline</strong></td>
<td>CI/CD パイプライン管理</td>
<td>月1パイプラインまで無料枠あり</td>
</tr>
<tr>
<td><strong>CodeBuild</strong></td>
<td>cdk synth・Maven ビルドを実行するビルド環境</td>
<td>月100分まで無料枠あり</td>
</tr>
<tr>
<td><strong>CodeDeploy</strong></td>
<td>ASG の全インスタンスへの WAR デプロイ</td>
<td>EC2 へのデプロイは<strong>無料</strong></td>
</tr>
<tr>
<td><strong>S3</strong></td>
<td>パイプラインのアーティファクト・デプロイバンドル置き場</td>
<td>無料枠あり</td>
</tr>
<tr>
<td><strong>SSM</strong></td>
<td>Session Manager による EC2 接続・Parameter Store（DBパスワード）</td>
<td>Session Manager 無料・スタンダード層無料</td>
</tr>
<tr>
<td><strong>IAM</strong></td>
<td>各サービスの権限</td>
<td>無料</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>注意</strong>: ALBは無料枠がありません。スケールアウト中はEC2が複数台起動するため料金も増加します。ハンズオン後は必ずリソースを削除してください。</p>
</blockquote>
<hr>
<h2><span id="toc6">前提条件</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>Java 17</td>
<td><code>java -version</code></td>
</tr>
<tr>
<td>Maven</td>
<td><code>mvn -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>
<tr>
<td>Git</td>
<td><code>git --version</code></td>
</tr>
</tbody>
</table>
<p>AWS 認証確認:</p>
<pre><code class="language-cmd">aws sts get-caller-identity</code></pre>
<p>CDK Bootstrap 確認:</p>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name CDKToolkit ^
  --query "Stacks[0].StackStatus" ^
  --output text ^
  --region ap-northeast-1</code></pre>
<blockquote>
<p><strong>SSH キーペアは不要です</strong>。このハンズオンでは SSM Session Manager を使って EC2 に接続するため、キーペアの作成・設定は必要ありません。</p>
</blockquote>
<hr>
<h2><span id="toc7">作業順序</span></h2>
<pre><code class="language-plaintext">① プロジェクトのセットアップ（Python 仮想環境）
      ↓
② GitHub との接続を作成する（CodeConnections）
      ↓
③ cdk.json を設定する
      ↓
④ コードを全て GitHub にプッシュする（重要！）
      ↓
⑤ パイプラインスタックをデプロイする（初回のみ手動）
      ↓
⑥ パイプラインの実行状況を確認する
      ↓
⑦ アプリへアクセスする
      ↓
⑧ Auto Scaling を体験する（CPU 負荷 → スケールアウト → 自動デプロイ）
      ↓
⑨ CI/CD を体験する（アプリ変更を push で自動反映）
      ↓
⑩ リソース削除</code></pre>
<hr>
<h2><span id="toc8">① プロジェクトのセットアップ</span></h2>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\cdk-asg-webapp

python -m venv .venv

.venv\Scripts\activate

pip install -r requirements.txt</code></pre>
<p>プロンプトの先頭に <code>(.venv)</code> が表示されれば仮想環境が有効になっています。</p>
<blockquote>
<p><strong>重要</strong>: CDK コマンドはすべてこの仮想環境が有効な状態で実行する必要があります。<br />ターミナルを開き直した際は必ず最初に以下を実行してください。</p>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\cdk-asg-webapp
.venv\Scripts\activate</code></pre>
</blockquote>
<hr>
<h2><span id="toc9">② GitHub との接続を作成する（CodeConnections）</span></h2>
<blockquote>
<p><strong>cdk-webapp-pipeline を実施済みの場合</strong>: 同じリポジトリ <code>aws-learning-projects</code> を扱うため、<br />既存の接続（<code>my-github-connection</code>）をそのまま<strong>再利用</strong>できます。<br /><strong>② はスキップして、ARN の確認（②-4）から始めてください。</strong></p>
</blockquote>
<p>CodePipeline が GitHub リポジトリを監視するために、<strong>GitHub との接続（CodeConnections）</strong> を作成します。</p>
<blockquote>
<p><strong>重要</strong>: AWS コンソールと GitHub の操作は<strong>同じブラウザ</strong>で行ってください。</p>
</blockquote>
<h3><span id="toc10">接続を作成する</span></h3>
<ol>
<li>AWS コンソール検索（<code>Alt+S</code>）で <code>CodePipeline</code> と入力 → <strong>CodePipeline</strong> を開く</li>
<li>左サイドバー → <strong>「設定」</strong> → <strong>「接続」</strong></li>
<li>リージョンが <strong>東京（ap-northeast-1）</strong> になっていることを確認する</li>
<li>「<strong>接続を作成</strong>」をクリック</li>
<li>プロバイダー: <strong>GitHub</strong> を選択</li>
<li>接続名: <code>my-github-connection</code>（任意）</li>
<li>「<strong>GitHub に接続する</strong>」をクリック</li>
</ol>
<h3><span id="toc11">GitHub App をインストールする</span></h3>
<ol start="8">
<li>「<strong>Authorize</strong>」をクリック → AWS コンソールの「GitHub 接続設定」画面に自動で戻る</li>
<li>「<strong>新しいアプリをインストールする</strong>」をクリック</li>
<li><strong>「Only select repositories」</strong> を選択 → <code>aws-learning-projects</code> を追加</li>
<li>「<strong>Install & Authorize</strong>」をクリック（メール認証コードが求められる場合は入力）</li>
<li>AWS コンソールに自動でリダイレクトされる → 「<strong>接続</strong>」ボタンをクリック</li>
</ol>
<h3><span id="toc12">接続 ARN を確認する</span></h3>
<p>接続一覧から接続の ARN をコピーします。</p>
<pre><code class="language-plaintext">arn:aws:codeconnections:ap-northeast-1:123456789012:connection/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</code></pre>
<blockquote>
<p>ステータスが <strong>「利用可能」</strong> になっていることを確認してから次に進んでください。</p>
</blockquote>
<p><strong>控えておく情報</strong>: 接続 ARN（<code>arn:aws:codeconnections:...</code>）</p>
<hr>
<h2><span id="toc13">③ cdk.json の設定</span></h2>
<p><code>cdk.json</code> の <code>context</code> セクションを自分の環境に合わせて編集します。</p>
<pre><code class="language-json">{
  "context": {
    "employee_id": "my",
    "db_password": "Handson1234!",
    "tomcat_version": "10.1.28",
    "asg_min_capacity": 1,
    "asg_max_capacity": 3,
    "asg_desired_capacity": 1,
    "github_owner": "your-github-username",
    "github_repo": "aws-learning-projects",
    "github_branch": "main",
    "connection_arn": "arn:aws:codeconnections:ap-northeast-1:..."
  }
}</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-cdk5-xxx</code> という名前になる）</td>
</tr>
<tr>
<td><code>asg_min_capacity</code></td>
<td><code>1</code></td>
<td>ASG の最小インスタンス数（スケールインの下限）</td>
</tr>
<tr>
<td><code>asg_max_capacity</code></td>
<td><code>3</code></td>
<td>ASG の最大インスタンス数（スケールアウトの上限）</td>
</tr>
<tr>
<td><code>asg_desired_capacity</code></td>
<td><code>1</code></td>
<td>初期起動インスタンス数</td>
</tr>
<tr>
<td><code>github_owner</code></td>
<td>GitHub ユーザー名</td>
<td>リポジトリのオーナー名</td>
</tr>
<tr>
<td><code>connection_arn</code></td>
<td>②で確認した ARN</td>
<td>CodeConnections の接続 ARN</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong><code>key_name</code>・<code>my_ip</code> は不要です</strong>。SSH の代わりに SSM Session Manager を使うため、キーペアやSSH許可IPの設定は必要ありません。</p>
</blockquote>
<hr>
<h2><span id="toc14">④ コードを GitHub にプッシュする（重要！）</span></h2>
<blockquote>
<p><code>cdk deploy</code> の前に必ず<strong>プロジェクト全体</strong>を push してください。<br />パイプラインが <code>cdk synth</code>・Maven ビルドを実行する際、GitHub から取得したコードを使うためです。</p>
</blockquote>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects

git add cdk-asg-webapp/
git commit -m "feat: cdk-asg-webapp ハンズオンを追加"
git push origin main</code></pre>
<hr>
<h2><span id="toc15">⑤ パイプラインスタックのデプロイ（初回のみ）</span></h2>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\cdk-asg-webapp

.venv\Scripts\activate

cdk synth

cdk deploy my-AsgPipelineStack</code></pre>
<p>「Do you wish to deploy these changes?」に <code>y</code> を入力します。</p>
<blockquote>
<p><strong>所要時間</strong>: パイプラインスタック自体のデプロイは 3〜5 分。その後パイプラインが自動起動します。</p>
</blockquote>
<p>デプロイ完了後、CodePipeline が自動起動します:</p>
<table>
<thead>
<tr>
<th>ステージ</th>
<th>内容</th>
<th>所要時間</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Source</strong></td>
<td>GitHub から最新コードを取得</td>
<td>〜1分</td>
</tr>
<tr>
<td><strong>Build (Synth)</strong></td>
<td><code>cdk synth</code> でテンプレート生成</td>
<td>〜3分</td>
</tr>
<tr>
<td><strong>UpdatePipeline</strong></td>
<td>パイプライン自己更新（セルフミューテーション）</td>
<td>〜2分</td>
</tr>
<tr>
<td><strong>Deploy > InfraDeploy</strong></td>
<td>CloudFormation で VPC / ASG / RDS / ALB を構築</td>
<td>〜15分</td>
</tr>
<tr>
<td><strong>Deploy > BuildAndDeployApp</strong></td>
<td>Maven ビルド → CodeDeploy で WAR デプロイ</td>
<td>〜10分</td>
</tr>
</tbody>
</table>
<blockquote>
<p>RDS の起動に時間がかかるため、InfraDeploy は 10〜20 分かかることがあります。</p>
</blockquote>
<hr>
<h2><span id="toc16">⑥ パイプラインの実行状況を確認する</span></h2>
<ol>
<li>AWS コンソール → <strong>CodePipeline</strong> を開く</li>
<li><code>my-cdk5-pipeline</code> を選択</li>
<li>各ステージが <strong>「成功」</strong> になるまで待つ</li>
</ol>
<h3><span id="toc17">CloudFormation スタックの命名規則</span></h3>
<pre><code class="language-plaintext">{StageName}-{StackName}</code></pre>
<table>
<thead>
<tr>
<th>要素</th>
<th>このハンズオンでの値</th>
</tr>
</thead>
<tbody>
<tr>
<td>StageName</td>
<td><code>my-Deploy</code></td>
</tr>
<tr>
<td>StackName</td>
<td><code>WebappStack</code></td>
</tr>
<tr>
<td>結果</td>
<td><strong><code>my-Deploy-WebappStack</code></strong></td>
</tr>
</tbody>
</table>
<blockquote>
<p><code>my-AsgPipelineStack</code>（パイプライン）と <code>my-Deploy-WebappStack</code>（インフラ）の <strong>2つが別スタック</strong>として CloudFormation に表示されます。</p>
</blockquote>
<h3><span id="toc18">CloudFormation Outputs の確認</span></h3>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-Deploy-WebappStack ^
  --region ap-northeast-1 ^
  --query "Stacks[0].Outputs"</code></pre>
<p><strong>控えておく情報</strong>: <code>ALBEndpoint</code>、<code>RDSEndpoint</code></p>
<p><!-- ![CodePipelineの全ステージが成功している画面](images/pipeline-success.jpg) --></p>
<hr>
<h2><span id="toc19">⑦ アプリへアクセスする</span></h2>
<p><code>BuildAndDeployApp</code> ステージが完了したら、ALB 経由でアプリにアクセスします。</p>
<pre><code class="language-plaintext">http://&lt;ALBEndpoint&gt;/webapp/</code></pre>
<blockquote>
<p><code>http://&lt;ALBEndpoint&gt;/</code>（ルートパス）では Tomcat のデフォルト画面が表示されます。<code>/webapp/</code> が必要です。</p>
</blockquote>
<p>ALB の DNS 名を CLI で確認する場合:</p>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-Deploy-WebappStack ^
  --region ap-northeast-1 ^
  --query "Stacks[0].Outputs[?OutputKey=='ALBEndpoint'].OutputValue" ^
  --output text</code></pre>
<h3><span id="toc20">ASG インスタンスを確認する</span></h3>
<p>AWS コンソール → <strong>EC2</strong> → <strong>Auto Scaling グループ</strong> → <code>my-cdk5-asg</code></p>
<ul>
<li><strong>インスタンス</strong> タブを開く</li>
<li>1台の EC2 が <code>InService</code> になっていることを確認する</li>
</ul>
<p><!-- ![アプリ画面とASGインスタンス一覧が表示されている画面](images/webapp-asg-access.jpg) --></p>
<hr>
<h2><span id="toc21">⑧ Auto Scaling を体験する</span></h2>
<p>ASG のスケールアウト・スケールインを実際に体験します。CPU 使用率が <strong>60%</strong> を超えると自動でインスタンスが追加されます。</p>
<h3><span id="toc22">現在の ASG 状態を確認する</span></h3>
<pre><code class="language-cmd">aws autoscaling describe-auto-scaling-groups ^
  --auto-scaling-group-names my-cdk5-asg ^
  --region ap-northeast-1 ^
  --query "AutoScalingGroups[0].{Desired:DesiredCapacity,Min:MinSize,Max:MaxSize,Instances:Instances[*].{Id:InstanceId,State:LifecycleState}}"</code></pre>
<p>出力例（初期状態: 1台が <code>InService</code>）:</p>
<pre><code class="language-json">{
    "Desired": 1,
    "Min": 1,
    "Max": 3,
    "Instances": [{ "Id": "i-0abc123...", "State": "InService" }]
}</code></pre>
<h3><span id="toc23">SSM Session Manager でインスタンスに接続する</span></h3>
<blockquote>
<p>キーペアは不要です。AWS コンソールから直接ブラウザでターミナルを開けます。</p>
</blockquote>
<ol>
<li><strong>EC2</strong> → <strong>インスタンス</strong> → 対象インスタンスを選択</li>
<li>「<strong>接続</strong>」ボタンをクリック</li>
<li>「<strong>Session Manager</strong>」タブ → 「<strong>接続</strong>」をクリック</li>
</ol>
<p>ブラウザでターミナルが開きます。</p>
<p>CLI から接続する場合:</p>
<pre><code class="language-cmd">rem インスタンス ID を取得
aws autoscaling describe-auto-scaling-groups ^
  --auto-scaling-group-names my-cdk5-asg ^
  --region ap-northeast-1 ^
  --query "AutoScalingGroups[0].Instances[0].InstanceId" ^
  --output text

rem 接続（Session Manager Plugin が必要）
aws ssm start-session ^
  --target i-0abc123def456789 ^
  --region ap-northeast-1</code></pre>
<h3><span id="toc24">CPU 負荷をかける（スケールアウトをトリガーする）</span></h3>
<p>インスタンスに接続したターミナルで実行します:</p>
<pre><code class="language-bash">cd /tmp &amp;&amp; stress-ng --cpu 2 --timeout 300s &amp;
echo "CPU stress started (PID: $!)"</code></pre>
<h3><span id="toc25">スケールアウトを監視する</span></h3>
<ol>
<li>AWS コンソール → <strong>CloudWatch</strong> → <strong>メトリクス</strong> → <strong>EC2</strong> → <strong>Auto Scaling グループ別</strong></li>
<li><code>my-cdk5-asg</code> の <code>CPUUtilization</code> を確認</li>
<li>CPU が 60% を超えると、約 1〜3 分後にスケールアウトが始まる</li>
</ol>
<p>ASG のインスタンス数を 10秒ごとに確認:</p>
<pre><code class="language-cmd">:loop
aws autoscaling describe-auto-scaling-groups ^
  --auto-scaling-group-names my-cdk5-asg ^
  --region ap-northeast-1 ^
  --query "AutoScalingGroups[0].Instances[*].{Id:InstanceId,State:LifecycleState}" ^
  --output table
timeout /t 10
goto loop</code></pre>
<p>しばらく待つと 2台目のインスタンスが起動し <code>InService</code> になります。</p>
<h3><span id="toc26">スケールアウト後の CodeDeploy 自動デプロイを確認する</span></h3>
<p>新しいインスタンスが起動すると、<strong>CodeDeploy が自動的に最新の WAR をデプロイします</strong>。</p>
<p>AWS コンソール → <strong>CodeDeploy</strong> → <code>my-cdk5-deploy-app</code><br />→ デプロイグループ → デプロイ履歴</p>
<p>新しいデプロイが自動で実行されていることを確認します。パイプラインを手動実行しなくても、ライフサイクルフックにより新インスタンスへ最新 WAR が自動デプロイされます。</p>
<p><!-- ![ASGインスタンスが2台になり、CodeDeployデプロイが自動実行された画面](images/asg-scaleout-codedeploy.jpg) --></p>
<h3><span id="toc27">スケールインを確認する</span></h3>
<p>CPU 負荷が終了（300秒後）すると CPU 使用率が下がり、スケールインが始まります。</p>
<blockquote>
<p>ターゲット追跡ポリシーのデフォルトのスケールイン保護時間は <strong>300秒</strong>。<br />負荷終了後、約 5〜10 分でインスタンス数が 1台に戻ります。</p>
</blockquote>
<p>途中で手動停止する場合:</p>
<pre><code class="language-bash">pkill stress-ng</code></pre>
<hr>
<h2><span id="toc28">⑨ CI/CD を体験する（アプリ変更を push で自動反映）</span></h2>
<p>アプリのコードを変更して push するだけで、ASG の全インスタンスへ自動デプロイされることを確認します。</p>
<h3><span id="toc29">アプリの HTML を変更する</span></h3>
<p><code>app/src/main/resources/templates/index.html</code> を開き、以下の行を変更します:</p>
<p>変更前:</p>
<pre><code class="language-html">&lt;h1&gt;Spring Boot + RDS Item Manager&lt;/h1&gt;</code></pre>
<p>変更後:</p>
<pre><code class="language-html">&lt;h1&gt;Spring Boot + RDS Item Manager (ASG)&lt;/h1&gt;</code></pre>
<h3><span id="toc30">コミット＆プッシュ</span></h3>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects
git add cdk-asg-webapp/app/src/main/resources/templates/index.html
git commit -m "feat: update webapp UI for ASG"
git push</code></pre>
<h3><span id="toc31">パイプラインの自動起動を確認する</span></h3>
<ol>
<li>AWS コンソール → <strong>CodePipeline</strong> → <code>my-cdk5-pipeline</code></li>
<li>push 後、数十秒以内にパイプラインが<strong>自動起動</strong>することを確認</li>
<li><code>BuildAndDeployApp</code> ステージが完了したらブラウザで <code>/webapp/</code> を更新する</li>
</ol>
<p>「(ASG)」が付いた見出しが表示されれば、ASG 構成での CI/CD が正常に動作しています。</p>
<blockquote>
<p><strong>注意</strong>: <code>InfraDeploy</code> ステージはインフラに変更がない場合は「変更なし」でスキップされます。</p>
</blockquote>
<hr>
<h2><span id="toc32">⑩ リソース削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ず削除します。</strong></p>
<blockquote>
<p>ASG を含むスタックを削除すると、全インスタンスが自動終了されます。</p>
</blockquote>
<blockquote>
<p><strong>削除順序が重要です</strong>。インフラスタック（<code>my-Deploy-WebappStack</code>）を<strong>先に</strong>削除してから、パイプラインスタック（<code>my-AsgPipelineStack</code>）を削除します。</p>
</blockquote>
<h3><span id="toc33">1. インフラスタックを削除する</span></h3>
<pre><code class="language-cmd">aws cloudformation delete-stack ^
  --stack-name my-Deploy-WebappStack ^
  --region ap-northeast-1

aws cloudformation wait stack-delete-complete ^
  --stack-name my-Deploy-WebappStack ^
  --region ap-northeast-1

echo WebappStack 削除完了</code></pre>
<blockquote>
<p>RDS の削除に 10〜15 分かかります。<code>wait</code> コマンドが完了するまでそのまま待ってください。</p>
</blockquote>
<h3><span id="toc34">2. パイプラインスタックを削除する</span></h3>
<pre><code class="language-cmd">aws cloudformation delete-stack ^
  --stack-name my-AsgPipelineStack ^
  --region ap-northeast-1

aws cloudformation wait stack-delete-complete ^
  --stack-name my-AsgPipelineStack ^
  --region ap-northeast-1

echo AsgPipelineStack 削除完了</code></pre>
<h3><span id="toc35">3. SSM パラメータを削除する</span></h3>
<pre><code class="language-cmd">aws ssm delete-parameter ^
  --name "/my/cdk5/db-password" ^
  --region ap-northeast-1</code></pre>
<h3><span id="toc36">4. 仮想環境の終了</span></h3>
<pre><code class="language-cmd">deactivate</code></pre>
<h3><span id="toc37">5. GitHub との接続を削除する（オプション）</span></h3>
<p>次のハンズオンでも使う場合はそのままでよいです。</p>
<p><strong>CodePipeline → 設定 → 接続 → <code>my-github-connection</code> → 「削除」</strong></p>
<h3><span id="toc38">削除確認</span></h3>
<pre><code class="language-cmd">aws cloudformation list-stacks ^
  --region ap-northeast-1 ^
  --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE ^
  --query "StackSummaries[?contains(StackName, 'my-')].StackName"</code></pre>
<p>空のリスト <code>[]</code> が返れば削除完了です。</p>
<h3><span id="toc39">削除されるリソース一覧</span></h3>
<table>
<thead>
<tr>
<th>リソース</th>
<th>削除方法</th>
</tr>
</thead>
<tbody>
<tr>
<td>ALB・ASG・EC2（全インスタンス）・RDS・VPC・S3（アーティファクト）・CodeDeploy</td>
<td><code>delete-stack my-Deploy-WebappStack</code> で削除</td>
</tr>
<tr>
<td>CodePipeline・CodeBuild</td>
<td><code>delete-stack my-AsgPipelineStack</code> で削除</td>
</tr>
<tr>
<td>SSM パラメータ（DBパスワード）</td>
<td><code>aws ssm delete-parameter</code> で手動削除</td>
</tr>
<tr>
<td>GitHub との接続（CodeConnections）</td>
<td>CodePipeline コンソールから手動削除</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc40">Auto Scaling のポイント解説</span></h2>
<h3><span id="toc41">ASG ライフサイクルフックで新インスタンスへ自動デプロイ</span></h3>
<p>CDK で <code>codedeploy.ServerDeploymentGroup(auto_scaling_groups=[self.asg])</code> と指定すると、CodeDeploy が ASG にライフサイクルフックを自動設定します。</p>
<pre><code class="language-plaintext">スケールアウト発生
  ↓
ASG: 新しいインスタンスを Launch Template から起動
  ↓
EC2 UserData: Java・Tomcat・CodeDeploy エージェントをインストール
  ↓
ライフサイクルフック: CodeDeploy が最新 WAR を自動デプロイ
  ↓
ALB ターゲットグループに追加（InService）</code></pre>
<p>これにより、スケールアウト後の新インスタンスでも<strong>ユーザーは何もしなくて済みます</strong>。</p>
<h3><span id="toc42">cdk-webapp-pipeline → cdk-asg-webapp の変化</span></h3>
<pre><code class="language-plaintext">cdk-webapp-pipeline               cdk-asg-webapp
─────────────────────────         ─────────────────────────
EC2 Instance（固定 1台）           Auto Scaling Group（1〜3台）
  ↓                                 ↓
SSH（キーペア必要）                 SSM Session Manager（キーペア不要）
  ↓                                 ↓
CodeDeploy: 名前タグで指定          CodeDeploy: ASG を直接指定
  ↓                                 ↓
スケールアウト不可                  CPU 60% 超で自動スケールアウト
  ↓                                 ↓
新インスタンスに WAR なし          ライフサイクルフックで自動 WAR デプロイ</code></pre>
<hr>
<h2><span id="toc43">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>Source ステージが「失敗」</td>
<td>GitHub との接続が「保留中」</td>
<td>CodePipeline → 設定 → 接続 → 承認して「利用可能」にする</td>
</tr>
<tr>
<td>BuildAndDeployApp が失敗</td>
<td>Java ソースが GitHub に push されていない</td>
<td><code>git add cdk-asg-webapp/</code> で全ファイルを push してから再実行</td>
</tr>
<tr>
<td>CodeDeploy が失敗する</td>
<td>UserData が完了していない</td>
<td>ASG 起動後 2〜3 分待ってから再デプロイ</td>
</tr>
<tr>
<td>スケールアウトが起きない</td>
<td>CPU が 60% に達していない</td>
<td><code>stress-ng --cpu 0 --timeout 300s &amp;</code> でコア全体に負荷をかける</td>
</tr>
<tr>
<td>スケールインが起きない</td>
<td>スケールイン保護時間（300秒）が経過していない</td>
<td>CPU 負荷停止後 5〜10 分待つ</td>
</tr>
<tr>
<td><code>/webapp/</code> で 404</td>
<td>WAR デプロイ未完了</td>
<td><code>BuildAndDeployApp</code> ステージが完了するまで待つ</td>
</tr>
<tr>
<td>ALB ヘルスチェック失敗</td>
<td>Tomcat 起動中</td>
<td>SSM Session Manager で <code>sudo cat /opt/tomcat/logs/catalina.out</code> を確認</td>
</tr>
</tbody>
</table>
<p>CodeDeploy 失敗時のログ確認:</p>
<p><strong>AWS コンソール → CodeDeploy → <code>my-cdk5-deploy-app</code> → デプロイグループ → デプロイ履歴 → 失敗したデプロイ → 「ログの表示」</strong></p>
<hr>
<h2><span id="toc44">まとめ</span></h2>
<table>
<thead>
<tr>
<th>ステップ</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>①</td>
<td>Python 仮想環境のセットアップ</td>
</tr>
<tr>
<td>②</td>
<td>CodeConnections で GitHub との接続を作成・承認（cdk-webapp-pipeline 実施済みなら再利用）</td>
</tr>
<tr>
<td>③</td>
<td><code>cdk.json</code> を設定（<code>key_name</code>・<code>my_ip</code> 不要。<code>asg_min/max/desired_capacity</code> を確認）</td>
</tr>
<tr>
<td>④</td>
<td><strong><code>cdk-asg-webapp/</code> 全体</strong>を GitHub に push</td>
</tr>
<tr>
<td>⑤</td>
<td><code>cdk deploy my-AsgPipelineStack</code>（<strong>初回のみ手動</strong>）</td>
</tr>
<tr>
<td>⑥</td>
<td>CodePipeline が自動起動 → Synth → Mutate → InfraDeploy（15〜20 分）→ BuildAndDeployApp（10 分）</td>
</tr>
<tr>
<td>⑦</td>
<td><code>http://&lt;ALBEndpoint&gt;/webapp/</code> でアクセス確認・ASG インスタンス <code>InService</code> を確認</td>
</tr>
<tr>
<td>⑧</td>
<td><code>stress-ng</code> で CPU 負荷 → スケールアウト → CodeDeploy が新インスタンスへ自動デプロイ</td>
</tr>
<tr>
<td>⑨</td>
<td>HTML を変更して push → パイプライン自動起動 → 変更を確認（ASG 全インスタンスに反映）</td>
</tr>
<tr>
<td>⑩</td>
<td><code>delete-stack my-Deploy-WebappStack</code> → <code>delete-stack my-AsgPipelineStack</code> の順で削除</td>
</tr>
</tbody>
</table>
<p>ASG を導入することで「<strong>単一障害点の排除・自動スケーリング・スケールアウト時の自動デプロイ</strong>」を一度に体験できました。</p>
<p>コンソールで3層構成を視覚的に学びたい場合は <a href="https://caymezon.com/aws-handson-console-alb-ec2-rds/">AWSコンソール版ハンズオン</a>、CDK の基本は <a href="https://caymezon.com/aws-handson-cdk-alb-ec2-rds/">CDK版ハンズオン（cdk-alb-ec2-rds）</a>、カスタム Construct は <a href="https://caymezon.com/aws-handson-cdk-custom-constructs/">CDK カスタム Construct ハンズオン</a>、インフラ CI/CD は <a href="https://caymezon.com/aws-handson-cdk-pipelines/">CDK Pipelines ハンズオン</a>、アプリ CI/CD は <a href="https://caymezon.com/aws-handson-cdk-webapp-pipeline/">CDK + CodeDeploy ハンズオン</a> を参照してください。</p><p>The post <a href="https://caymezon.com/aws-handson-cdk-asg-webapp/">CDK + Auto Scaling Group で Webアプリをオートスケーリング構成にする【CPU負荷でスケールアウト体験】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-cdk-asg-webapp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
