<?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/feed/" rel="self" type="application/rss+xml" />
	<link>https://caymezon.com</link>
	<description></description>
	<lastBuildDate>Sat, 04 Apr 2026 07:34: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>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コンソールでVPC設計からAP+DB 2層構成を構築する手順【踏み台SSH / CloudFormation版との比較付き】</title>
		<link>https://caymezon.com/aws-handson-console-ec2-2tier/</link>
					<comments>https://caymezon.com/aws-handson-console-ec2-2tier/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sat, 04 Apr 2026 07:34:06 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[2層構成]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWSコンソール]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[SG参照]]></category>
		<category><![CDATA[UserData]]></category>
		<category><![CDATA[VPC]]></category>
		<category><![CDATA[セキュリティグループ]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[パブリックサブネット]]></category>
		<category><![CDATA[プライベートサブネット]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[踏み台]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20325</guid>

					<description><![CDATA[<p>はじめに 「APサーバはインターネットに公開しつつ、DBサーバはインターネットから完全に隔離したい」——これが実際のAWSシステム設計でよく使われる AP+DB 2層構成 です。 この記事では、AWSコンソール（GUI） [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-console-ec2-2tier/">AWSコンソールでVPC設計からAP+DB 2層構成を構築する手順【踏み台SSH / CloudFormation版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>「APサーバはインターネットに公開しつつ、DBサーバはインターネットから完全に隔離したい」——これが実際のAWSシステム設計でよく使われる <strong>AP+DB 2層構成</strong> です。</p>
<p>この記事では、<strong>AWSコンソール（GUI）のみ</strong>を使って、カスタムVPCを設計し、パブリックサブネット（APサーバ）とプライベートサブネット（DBサーバ）に分離した2層アーキテクチャをゼロから手動構築するハンズオンを紹介します。</p>
<pre><code class="language-plaintext">インターネット
  ↓ HTTP(80) / SSH(22)  ← 自分のIPのみ
[インターネットゲートウェイ（my-igw）]
  ↓
[VPC: my-vpc（10.0.0.0/16）]
  │
  ├─ [パブリックサブネット: 10.0.1.0/24]
  │    └── APサーバEC2（my-ap-instance）
  │          ├── Apache（ポート80）   ← インターネットから直接アクセス可
  │          └── my-ap-sg
  │                ↓ SSH(22) / MySQL(3306) ← APサーバSGのみ許可（SG参照）
  └─ [プライベートサブネット: 10.0.2.0/24]
       └── DBサーバEC2（my-db-instance）
             ├── MariaDB（ポート3306）
             ├── パブリックIPなし       ← インターネットから隔離
             └── my-db-sg</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li>カスタムVPC・サブネット・インターネットゲートウェイ・ルートテーブルを一から設計・構築</li>
<li>パブリックサブネット（APサーバ）とプライベートサブネット（DBサーバ）の分離</li>
<li>DBサーバにパブリックIPを付与せずインターネットから隔離する設計</li>
<li>APサーバを踏み台（Bastion）としてDBサーバにSSH接続する方法</li>
<li>S3 VPC Gateway Endpointでプライベートサブネットからパッケージをインストールする方法</li>
</ul>
<p><strong>このハンズオンのポイント：</strong></p>
<p>Phase 1-3（MySQL）まではデフォルトVPCを使っていましたが、今回は<strong>カスタムVPCを一から設計</strong>します。実際のAWS本番環境に近いネットワーク設計を体験できます。</p>
<hr>
<blockquote>
<p><strong>この記事は <a href="https://caymezon.com/aws-handson-cloudformation-ec2-2tier/">CloudFormation版ハンズオン</a> の比較記事です。</strong><br />コンソール操作でVPCリソースの依存関係・設定手順を視覚的に学び、CloudFormationとの違いを比較したい方向けです。</p>
</blockquote>
<hr>
<p><!-- ![ハンズオン完成後の構成確認画面](images/ec2-2tier-top.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>VPC（Virtual Private Cloud）</strong></td>
<td>AWS上に作るプライベートなネットワーク空間。今回は <code>10.0.0.0/16</code> のCIDRで作成する</td>
</tr>
<tr>
<td><strong>パブリックサブネット</strong></td>
<td>インターネットゲートウェイへのルートを持つサブネット。APサーバを配置する</td>
</tr>
<tr>
<td><strong>プライベートサブネット</strong></td>
<td>インターネットへの経路を持たないサブネット。DBサーバを配置し外部から隔離する</td>
</tr>
<tr>
<td><strong>インターネットゲートウェイ（IGW）</strong></td>
<td>VPCとインターネットを接続する出入り口</td>
</tr>
<tr>
<td><strong>ルートテーブル</strong></td>
<td>サブネット内のEC2がパケットを送るときの「経路表」</td>
</tr>
<tr>
<td><strong>S3 VPC Gateway Endpoint</strong></td>
<td>プライベートサブネットからS3（パッケージリポジトリ）にアクセスするための無料エンドポイント</td>
</tr>
<tr>
<td><strong>踏み台（Bastion）</strong></td>
<td>プライベートサブネットのEC2にアクセスするための中継サーバ。今回はAPサーバが踏み台を兼ねる</td>
</tr>
<tr>
<td><strong>SG参照（SG-to-SG）</strong></td>
<td>セキュリティグループのルールで、アクセス元として別のSGを指定する設定</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">前フェーズとの違い</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>Phase 1-3（MySQL）</th>
<th>Phase 1-4（2層構成・今回）</th>
</tr>
</thead>
<tbody>
<tr>
<td>ネットワーク</td>
<td>デフォルトVPC</td>
<td><strong>カスタムVPC</strong></td>
</tr>
<tr>
<td>サブネット</td>
<td>デフォルトサブネット（パブリック）</td>
<td><strong>パブリック + プライベート</strong></td>
</tr>
<tr>
<td>DBのパブリックIP</td>
<td>あり</td>
<td><strong>なし（インターネット隔離）</strong></td>
</tr>
<tr>
<td>DBへのSSH</td>
<td>直接SSH可能</td>
<td><strong>APサーバ経由の踏み台接続</strong></td>
</tr>
<tr>
<td>リソース数</td>
<td>4〜5個</td>
<td><strong>12個以上（VPC関連が多数）</strong></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 × 2台</strong></td>
<td>APサーバ（Apache） + DBサーバ（MariaDB）（各t2.micro）</td>
<td>月750時間まで無料枠あり（2台で消費が倍）</td>
</tr>
<tr>
<td><strong>セキュリティグループ × 2</strong></td>
<td>APサーバSG / DBサーバSGのアクセス制御</td>
<td>無料</td>
</tr>
<tr>
<td><strong>S3 VPC Gateway Endpoint</strong></td>
<td>プライベートサブネットからS3へのアクセス</td>
<td><strong>無料</strong></td>
</tr>
<tr>
<td><strong>IAM</strong></td>
<td>EC2へのSession Manager接続権限</td>
<td>無料</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>注意</strong>: EC2を2台同時に稼働させるため、無料枠の消費が2倍になります。ハンズオン後は必ず2台とも削除してください。</p>
</blockquote>
<hr>
<h2><span id="toc5">構築するリソース一覧</span></h2>
<table>
<thead>
<tr>
<th>カテゴリ</th>
<th>リソース</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td>ネットワーク</td>
<td>VPC（<code>my-vpc</code>）</td>
<td>独自のネットワーク空間（10.0.0.0/16）</td>
</tr>
<tr>
<td>ネットワーク</td>
<td>インターネットゲートウェイ（<code>my-igw</code>）</td>
<td>VPCとインターネットを接続</td>
</tr>
<tr>
<td>ネットワーク</td>
<td>パブリックサブネット（<code>my-public-subnet</code>）</td>
<td>APサーバ用（インターネットアクセスあり）</td>
</tr>
<tr>
<td>ネットワーク</td>
<td>プライベートサブネット（<code>my-private-subnet</code>）</td>
<td>DBサーバ用（インターネットアクセスなし）</td>
</tr>
<tr>
<td>ネットワーク</td>
<td>パブリックルートテーブル（<code>my-public-rt</code>）</td>
<td>インターネットへの経路（→IGW）</td>
</tr>
<tr>
<td>ネットワーク</td>
<td>プライベートルートテーブル（<code>my-private-rt</code>）</td>
<td>VPC内のみ（インターネット経路なし）</td>
</tr>
<tr>
<td>ネットワーク</td>
<td>S3 VPC Gateway Endpoint</td>
<td>プライベートサブネットからS3へのアクセス（無料）</td>
</tr>
<tr>
<td>セキュリティ</td>
<td>APサーバSG（<code>my-ap-sg</code>）</td>
<td>SSH(22)・HTTP(80)を自分のIPから許可</td>
</tr>
<tr>
<td>セキュリティ</td>
<td>DBサーバSG（<code>my-db-sg</code>）</td>
<td>SSH(22)・MySQL(3306)をAPサーバSGのみ許可</td>
</tr>
<tr>
<td>認証</td>
<td>キーペア（<code>my-ec2-2tier-key</code>）</td>
<td>SSH接続の認証鍵</td>
</tr>
<tr>
<td>認証</td>
<td>IAMロール（<code>my-ec2-2tier-role</code>）</td>
<td>EC2にSession Manager権限を付与</td>
</tr>
<tr>
<td>コンピュート</td>
<td>APサーバEC2（<code>my-ap-instance</code>）</td>
<td>Apacheを実行するWebサーバ（パブリックサブネット）</td>
</tr>
<tr>
<td>コンピュート</td>
<td>DBサーバEC2（<code>my-db-instance</code>）</td>
<td>MariaDBを実行するDBサーバ（プライベートサブネット）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc6">全体の作業順序</span></h2>
<p>ネットワーク系リソースはEC2より先に作成する必要があります。</p>
<pre><code class="language-plaintext">⓪ 自分のIPアドレスを確認する
      ↓
① キーペアを作成する
      ↓
② IAMロールを作成する
      ↓
③ VPCを作成する
      ↓
④ インターネットゲートウェイを作成・アタッチする
      ↓
⑤ サブネットを作成する（パブリック・プライベート）
      ↓
⑥ ルートテーブルを設定する（S3 VPC Endpoint作成を含む）
      ↓
⑦ セキュリティグループを作成する（APサーバSG → DBサーバSGの順）
      ↓
⑧ APサーバEC2を起動する（パブリックサブネット）
      ↓
⑨ DBサーバEC2を起動する（プライベートサブネット）
      ↓
⑩ 動作確認
      ↓
⑪ リソースを削除する</code></pre>
<hr>
<h2><span id="toc7">【重要】⓪ 自分のIPアドレスを確認する</span></h2>
<pre><code class="language-cmd">curl https://checkip.amazonaws.com</code></pre>
<p>またはルーター管理画面（<code>http://192.168.0.1</code> など）の「WAN IPアドレス」で確認します。</p>
<p><strong>控えておく情報</strong>: 自分のIPアドレス（例: <code>203.0.113.1</code>）</p>
<hr>
<h2><span id="toc8">① キーペアの作成</span></h2>
<p>APサーバとDBサーバの両方で使用します。1つのキーペアを共用します。</p>
<p><strong>AWSコンソール → EC2 → キーペア → 「キーペアを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-ec2-2tier-key</code></td>
</tr>
<tr>
<td>キーペアのタイプ</td>
<td><strong>RSA</strong></td>
</tr>
<tr>
<td>プライベートキーファイル形式</td>
<td><strong>.pem</strong></td>
</tr>
</tbody>
</table>
<pre><code class="language-plaintext">C:\Users\ユーザー名\.ssh\my-ec2-2tier-key.pem</code></pre>
<hr>
<h2><span id="toc9">② IAMロールの作成</span></h2>
<p><strong>AWSコンソール → IAM → ロール → 「ロールを作成」</strong></p>
<table>
<thead>
<tr>
<th>ステップ</th>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>信頼されたエンティティタイプ</td>
<td><strong>AWSのサービス</strong></td>
</tr>
<tr>
<td>1</td>
<td>ユースケース</td>
<td><strong>EC2</strong></td>
</tr>
<tr>
<td>2</td>
<td>許可ポリシー</td>
<td><code>AmazonSSMManagedInstanceCore</code></td>
</tr>
<tr>
<td>3</td>
<td>ロール名</td>
<td><code>my-ec2-2tier-role</code></td>
</tr>
</tbody>
</table>
<p>「ロールを作成」をクリック。</p>
<hr>
<h2><span id="toc10">③ VPCの作成</span></h2>
<p><strong>AWSコンソール → VPC → 仮想プライベートクラウド → 「お使いのVPC」→ 「VPCを作成」</strong></p>
<blockquote>
<p><strong>VPCとは</strong>: AWS上に作るプライベートなネットワーク空間。この中にEC2などを置きます。CIDR（サイダー）でIPアドレスの範囲を指定します。<code>10.0.0.0/16</code> は <code>10.0.0.0 〜 10.0.255.255</code> の65536個のIPアドレスを表します。</p>
</blockquote>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>作成するリソース</td>
<td><strong>VPCのみ</strong></td>
</tr>
<tr>
<td>名前タグ</td>
<td><code>my-vpc</code></td>
</tr>
<tr>
<td>IPv4 CIDR</td>
<td><code>10.0.0.0/16</code></td>
</tr>
<tr>
<td>IPv6 CIDR ブロック</td>
<td><strong>なし</strong></td>
</tr>
<tr>
<td>テナンシー</td>
<td>デフォルト</td>
</tr>
</tbody>
</table>
<p>「VPCを作成」をクリック。</p>
<p><strong>控えておく情報</strong>: 作成された VPC ID（<code>vpc-xxxxxxxxxx</code>）</p>
<p><!-- ![VPC作成画面](images/vpc-create.jpg) --></p>
<hr>
<h2><span id="toc11">④ インターネットゲートウェイの作成・アタッチ</span></h2>
<blockquote>
<p><strong>インターネットゲートウェイ（IGW）とは</strong>: VPCとインターネットを接続する出入り口です。これをVPCにアタッチすることで、VPC内のEC2がインターネットと通信できるようになります。</p>
</blockquote>
<h3><span id="toc12">4-1. インターネットゲートウェイを作成する</span></h3>
<p><strong>AWSコンソール → VPC → インターネットゲートウェイ → 「インターネットゲートウェイの作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前タグ</td>
<td><code>my-igw</code></td>
</tr>
</tbody>
</table>
<p>「インターネットゲートウェイの作成」をクリック。</p>
<h3><span id="toc13">4-2. VPCにアタッチする</span></h3>
<p>作成直後の画面から「アクション」→「VPCにアタッチ」をクリック。</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>使用可能なVPC</td>
<td><code>my-vpc</code> を選択</td>
</tr>
</tbody>
</table>
<p>「インターネットゲートウェイのアタッチ」をクリック。</p>
<p>ステータスが <strong>「Attached」</strong> になることを確認します。</p>
<hr>
<h2><span id="toc14">⑤ サブネットの作成</span></h2>
<blockquote>
<p><strong>サブネットとは</strong>: VPC内をさらに分割したネットワークです。パブリックサブネットはインターネットと通信でき、プライベートサブネットはVPC内部とのみ通信します。</p>
</blockquote>
<p><strong>AWSコンソール → VPC → サブネット → 「サブネットを作成」</strong></p>
<p>VPC ID で <code>my-vpc</code> を選択します。</p>
<h3><span id="toc15">5-1. パブリックサブネット</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>サブネット名</td>
<td><code>my-public-subnet</code></td>
</tr>
<tr>
<td>アベイラビリティーゾーン</td>
<td><code>ap-northeast-1a</code></td>
</tr>
<tr>
<td>IPv4 CIDR</td>
<td><code>10.0.1.0/24</code></td>
</tr>
</tbody>
</table>
<h3><span id="toc16">5-2. プライベートサブネット</span></h3>
<p>「新しいサブネットを追加」をクリックして2つ目のサブネットを設定します。</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>サブネット名</td>
<td><code>my-private-subnet</code></td>
</tr>
<tr>
<td>アベイラビリティーゾーン</td>
<td><code>ap-northeast-1a</code></td>
</tr>
<tr>
<td>IPv4 CIDR</td>
<td><code>10.0.2.0/24</code></td>
</tr>
</tbody>
</table>
<p>「サブネットを作成」をクリック。</p>
<h3><span id="toc17">5-3. パブリックサブネットのパブリックIP自動割り当てを有効化</span></h3>
<p><strong>サブネット一覧 → <code>my-public-subnet</code> を選択 → 「アクション」→「サブネットの設定を編集」</strong></p>
<p>「パブリック IPv4 アドレスの自動割り当てを有効化」にチェックを入れる → 「保存」。</p>
<blockquote>
<p>APサーバEC2を起動したときに自動でパブリックIPが割り当てられるようになります。プライベートサブネットはこの設定をしません（DBサーバにパブリックIPを付与しない）。</p>
</blockquote>
<p><!-- ![サブネット作成画面](images/subnet-create.jpg) --></p>
<hr>
<h2><span id="toc18">⑥ ルートテーブルの設定</span></h2>
<blockquote>
<p><strong>ルートテーブルとは</strong>: サブネット内のEC2がパケットを送るときの「経路表」です。パブリックサブネットはインターネット向けのルート（→IGW）を持ち、プライベートサブネットは持ちません。</p>
</blockquote>
<h3><span id="toc19">6-1. パブリックルートテーブルを作成する</span></h3>
<p><strong>AWSコンソール → VPC → ルートテーブル → 「ルートテーブルを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-public-rt</code></td>
</tr>
<tr>
<td>VPC</td>
<td><code>my-vpc</code></td>
</tr>
</tbody>
</table>
<p>「ルートテーブルを作成」をクリック。</p>
<p><strong>インターネット向けルートを追加します:</strong></p>
<p><code>my-public-rt</code> を選択 → 「ルート」タブ → 「ルートを編集」→「ルートを追加」</p>
<table>
<thead>
<tr>
<th>送信先</th>
<th>ターゲット</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0.0.0.0/0</code></td>
<td><code>my-igw</code>（インターネットゲートウェイを選択）</td>
</tr>
</tbody>
</table>
<p>「変更を保存」をクリック。</p>
<blockquote>
<p><strong><code>0.0.0.0/0</code> とは</strong>: 「それ以外のすべての宛先」を意味します。VPC内向けのルートはデフォルトで存在するため、インターネット向けのルートだけ追加すれば OKです。</p>
</blockquote>
<p><strong>パブリックサブネットを関連付けます:</strong></p>
<p><code>my-public-rt</code> の「サブネットの関連付け」タブ → 「サブネットの関連付けを編集」→ <code>my-public-subnet</code> にチェック → 「関連付けを保存」。</p>
<h3><span id="toc20">6-2. プライベートルートテーブルを作成する</span></h3>
<p><strong>VPC → ルートテーブル → 「ルートテーブルを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-private-rt</code></td>
</tr>
<tr>
<td>VPC</td>
<td><code>my-vpc</code></td>
</tr>
</tbody>
</table>
<p>「ルートテーブルを作成」をクリック。</p>
<blockquote>
<p><strong>インターネット向けルートは追加しません</strong>。プライベートサブネットからインターネットへの経路を意図的に持たせないことで、DBサーバをインターネットから完全に隔離します。</p>
</blockquote>
<p><strong>プライベートサブネットを関連付けます:</strong></p>
<p><code>my-private-rt</code> の「サブネットの関連付け」タブ → 「サブネットの関連付けを編集」→ <code>my-private-subnet</code> にチェック → 「関連付けを保存」。</p>
<h3><span id="toc21">6-3. S3 VPC Gateway Endpointを作成する（重要）</span></h3>
<blockquote>
<p><strong>なぜ必要か</strong>: プライベートサブネットはインターネットに出られないため、EC2起動時の <code>dnf install</code> でパッケージをダウンロードできません。Amazon Linux 2023のパッケージリポジトリはS3上にあるため、S3だけインターネットを経由せずアクセスできるGateway Endpointを作成することで解決します。<strong>Gateway Endpointは無料</strong>です。</p>
</blockquote>
<p><strong>AWSコンソール → VPC → エンドポイント → 「エンドポイントを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前タグ</td>
<td><code>my-s3-endpoint</code></td>
</tr>
<tr>
<td>サービスカテゴリ</td>
<td><strong>AWSのサービス</strong></td>
</tr>
<tr>
<td>サービス</td>
<td>検索欄に <code>s3</code> と入力 → <code>com.amazonaws.ap-northeast-1.s3</code> の <strong>タイプ: Gateway</strong> を選択</td>
</tr>
<tr>
<td>VPC</td>
<td><code>my-vpc</code></td>
</tr>
<tr>
<td>ルートテーブル</td>
<td><strong><code>my-private-rt</code></strong> にチェックを入れる</td>
</tr>
</tbody>
</table>
<p>「エンドポイントを作成」をクリック。</p>
<p><strong>確認</strong>: <code>my-private-rt</code> の「ルート」タブを開くと、S3向けのルートが自動追加されていることを確認します。</p>
<p><!-- ![S3 VPC Endpoint作成画面](images/s3-endpoint-create.jpg) --></p>
<hr>
<h2><span id="toc22">⑦ セキュリティグループの作成</span></h2>
<blockquote>
<p><strong>注意</strong>: APサーバSGを先に作成します。DBサーバSGがAPサーバSGをSG参照するためです。</p>
</blockquote>
<h3><span id="toc23">7-1. APサーバSGの作成</span></h3>
<p><strong>EC2 → セキュリティグループ → 「セキュリティグループを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>セキュリティグループ名</td>
<td><code>my-ap-sg</code></td>
</tr>
<tr>
<td>説明</td>
<td><code>AP server SG (public subnet)</code></td>
</tr>
<tr>
<td>VPC</td>
<td><strong><code>my-vpc</code></strong>（デフォルトVPCではなく今回作成したVPCを選択）</td>
</tr>
</tbody>
</table>
<p><strong>インバウンドルール:</strong></p>
<table>
<thead>
<tr>
<th>タイプ</th>
<th>ポート</th>
<th>ソース</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>SSH</td>
<td>22</td>
<td><code>203.0.113.1/32</code>（自分のIP）</td>
<td>SSH from my IP</td>
</tr>
<tr>
<td>HTTP</td>
<td>80</td>
<td><code>203.0.113.1/32</code>（自分のIP）</td>
<td>HTTP from my IP</td>
</tr>
</tbody>
</table>
<p><strong>アウトバウンドルール</strong>: 「すべてのトラフィック / 0.0.0.0/0」があることを確認します。</p>
<p>「セキュリティグループを作成」をクリック。</p>
<h3><span id="toc24">7-2. DBサーバSGの作成</span></h3>
<p><strong>EC2 → セキュリティグループ → 「セキュリティグループを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>セキュリティグループ名</td>
<td><code>my-db-sg</code></td>
</tr>
<tr>
<td>説明</td>
<td><code>DB server SG (private subnet)</code></td>
</tr>
<tr>
<td>VPC</td>
<td><strong><code>my-vpc</code></strong></td>
</tr>
</tbody>
</table>
<p><strong>インバウンドルール（「ルールを追加」で2つ追加します）:</strong></p>
<p><strong>ルール1: SSH（APサーバ経由の踏み台接続）</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイプ</td>
<td>SSH</td>
</tr>
<tr>
<td>ソースタイプ</td>
<td>カスタム</td>
</tr>
<tr>
<td>ソース</td>
<td><code>my-ap-sg</code> を検索して選択</td>
</tr>
<tr>
<td>説明</td>
<td><code>SSH from AP server only (bastion)</code></td>
</tr>
</tbody>
</table>
<p><strong>ルール2: MySQL（APサーバからのDB接続）</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイプ</td>
<td>MySQL/Aurora</td>
</tr>
<tr>
<td>ソースタイプ</td>
<td>カスタム</td>
</tr>
<tr>
<td>ソース</td>
<td><code>my-ap-sg</code> を検索して選択</td>
</tr>
<tr>
<td>説明</td>
<td><code>MySQL from AP server only</code></td>
</tr>
</tbody>
</table>
<p><strong>アウトバウンドルール</strong>: 「すべてのトラフィック / 0.0.0.0/0」があることを確認します。</p>
<p>「セキュリティグループを作成」をクリック。</p>
<p><!-- ![DBサーバSG作成画面](images/db-sg-create.jpg) --></p>
<hr>
<h2><span id="toc25">⑧ APサーバEC2の起動（パブリックサブネット）</span></h2>
<p><strong>EC2 → インスタンス → 「インスタンスを起動」</strong></p>
<h3><span id="toc26">8-1. 基本設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-ap-instance</code></td>
</tr>
<tr>
<td>AMI</td>
<td><strong>Amazon Linux 2023 AMI</strong>（デフォルトで選択済み）</td>
</tr>
<tr>
<td>インスタンスタイプ</td>
<td><strong>t2.micro</strong>（無料枠対象）</td>
</tr>
<tr>
<td>キーペア</td>
<td><code>my-ec2-2tier-key</code></td>
</tr>
</tbody>
</table>
<h3><span id="toc27">8-2. ネットワーク設定</span></h3>
<p>「ネットワーク設定」→「編集」をクリックして以下を設定します。</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>VPC</td>
<td><strong><code>my-vpc</code></strong></td>
</tr>
<tr>
<td>サブネット</td>
<td><strong><code>my-public-subnet</code></strong></td>
</tr>
<tr>
<td>パブリック IP の自動割り当て</td>
<td><strong>有効</strong></td>
</tr>
<tr>
<td>セキュリティグループ</td>
<td><strong>既存のセキュリティグループを選択</strong> → <code>my-ap-sg</code></td>
</tr>
</tbody>
</table>
<h3><span id="toc28">8-3. IAMロール・UserDataの設定</span></h3>
<p>「高度な詳細」を開きます。</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>IAM インスタンスプロファイル</td>
<td><code>my-ec2-2tier-role</code></td>
</tr>
</tbody>
</table>
<p>「ユーザーデータ」に以下を貼り付けます。</p>
<pre><code class="language-bash">#!/bin/bash
dnf update -y
dnf install -y httpd
systemctl start httpd
systemctl enable httpd
cat &gt; /var/www/html/index.html &lt;&lt; 'HTMLEOF'
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;&lt;meta charset="UTF-8"&gt;&lt;title&gt;AP Server - Phase 1-4&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;AP Server (Public Subnet)&lt;/h1&gt;
&lt;p&gt;This AP server is in the PUBLIC subnet and can reach the DB server in the PRIVATE subnet.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
HTMLEOF</code></pre>
<p>「インスタンスを起動」をクリック。</p>
<p><strong>控えておく情報</strong>: APサーバのパブリックIPアドレス</p>
<p><!-- ![APサーバEC2起動後の画面](images/ap-ec2-running.jpg) --></p>
<hr>
<h2><span id="toc29">⑨ DBサーバEC2の起動（プライベートサブネット）</span></h2>
<p><strong>EC2 → インスタンス → 「インスタンスを起動」</strong></p>
<h3><span id="toc30">9-1. 基本設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-db-instance</code></td>
</tr>
<tr>
<td>AMI</td>
<td><strong>Amazon Linux 2023 AMI</strong></td>
</tr>
<tr>
<td>インスタンスタイプ</td>
<td><strong>t2.micro</strong></td>
</tr>
<tr>
<td>キーペア</td>
<td><code>my-ec2-2tier-key</code></td>
</tr>
</tbody>
</table>
<h3><span id="toc31">9-2. ネットワーク設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>VPC</td>
<td><strong><code>my-vpc</code></strong></td>
</tr>
<tr>
<td>サブネット</td>
<td><strong><code>my-private-subnet</code></strong></td>
</tr>
<tr>
<td>パブリック IP の自動割り当て</td>
<td><strong>無効</strong>（プライベートサブネットのため）</td>
</tr>
<tr>
<td>セキュリティグループ</td>
<td><strong>既存のセキュリティグループを選択</strong> → <code>my-db-sg</code></td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>パブリックIPを付与しない</strong>: DBサーバはインターネットから直接アクセスされる必要がありません。プライベートサブネットに置き、パブリックIPを持たせないことで、インターネットから完全に隔離します。</p>
</blockquote>
<h3><span id="toc32">9-3. IAMロール・UserDataの設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>IAM インスタンスプロファイル</td>
<td><code>my-ec2-2tier-role</code></td>
</tr>
</tbody>
</table>
<p>「ユーザーデータ」に以下を貼り付けます。</p>
<pre><code class="language-bash">#!/bin/bash
dnf update -y
dnf install -y mariadb105-server mariadb105
systemctl start mariadb
systemctl enable mariadb
sudo mysql -u root &lt;&lt; 'SQLEOF'
SET PASSWORD FOR root@localhost = PASSWORD('Admin1234!');
CREATE USER IF NOT EXISTS 'handson'@'%' IDENTIFIED BY 'Handson1234!';
GRANT ALL PRIVILEGES ON *.* TO 'handson'@'%' WITH GRANT OPTION;
CREATE DATABASE IF NOT EXISTS sampledb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
FLUSH PRIVILEGES;
SQLEOF</code></pre>
<blockquote>
<p><strong>⑥-3でS3 VPC Endpointを作成済みの場合</strong>: <code>dnf install</code> はS3経由で正常に動作します。Endpointを作成せずにEC2を起動した場合はMariaDBがインストールされないため、踏み台SSH接続後に手動で <code>sudo dnf install -y mariadb105-server mariadb105</code> を実行してください。</p>
</blockquote>
<p>「インスタンスを起動」をクリック。</p>
<p><strong>控えておく情報</strong>: DBサーバのプライベートIPアドレス（パブリックIPはありません）</p>
<p>インスタンス詳細 → 「プライベート IPv4 アドレス」（例: <code>10.0.2.xxx</code>）を確認してメモします。</p>
<hr>
<h2><span id="toc33">⑩ 動作確認</span></h2>
<blockquote>
<p><strong>待機時間</strong>: EC2起動後、UserDataの完了まで数分かかります。APサーバは2〜3分、DBサーバは5〜8分待ちます。</p>
</blockquote>
<h3><span id="toc34">10-1. APサーバのWeb確認</span></h3>
<p>ブラウザで以下にアクセスします。</p>
<pre><code class="language-plaintext">http://（APサーバのパブリックIP）</code></pre>
<p><code>AP Server (Public Subnet)</code> が表示されれば成功です。</p>
<p><!-- ![APサーバWebページ確認](images/ap-web-browser.jpg) --></p>
<h3><span id="toc35">10-2. APサーバへのSSH接続</span></h3>
<pre><code class="language-cmd">ssh -i C:\Users\ユーザー名\.ssh\my-ec2-2tier-key.pem ec2-user@（APパブリックIP）</code></pre>
<h3><span id="toc36">10-3. キーペアをAPサーバにコピーする（踏み台SSH準備）</span></h3>
<p>APサーバを踏み台としてDBサーバにSSH接続するために、ローカルPCからAPサーバにキーペアをコピーします。</p>
<p><strong>ローカルPCの別ターミナルで実行します:</strong></p>
<pre><code class="language-cmd">scp -i C:\Users\ユーザー名\.ssh\my-ec2-2tier-key.pem ^
  C:\Users\ユーザー名\.ssh\my-ec2-2tier-key.pem ^
  ec2-user@（APパブリックIP）:~/.ssh/</code></pre>
<p>APサーバ上でキーペアのパーミッションを設定します。</p>
<pre><code class="language-bash">chmod 400 ~/.ssh/my-ec2-2tier-key.pem</code></pre>
<h3><span id="toc37">10-4. APサーバ経由でDBサーバにSSH接続（踏み台接続）</span></h3>
<p><strong>APサーバのSSHセッションから実行します:</strong></p>
<pre><code class="language-bash">ssh -i ~/.ssh/my-ec2-2tier-key.pem ec2-user@（DBプライベートIP）</code></pre>
<p><code>[ec2-user@ip-10-0-2-xxx ~]$</code> のプロンプトが表示されれば踏み台接続成功です。</p>
<pre><code class="language-bash">sudo systemctl status mariadb

# MariaDBに接続
mysql -u root -pAdmin1234!</code></pre>
<p>MariaDBのプロンプトで確認します。</p>
<pre><code class="language-sql">SHOW DATABASES;
EXIT;</code></pre>
<p>DBサーバから切断します。</p>
<pre><code class="language-bash">exit</code></pre>
<h3><span id="toc38">10-5. APサーバからMySQLに接続（AP→DB通信確認）</span></h3>
<p>APサーバのSSHセッションで実行します。</p>
<pre><code class="language-bash"># mysqlクライアントのインストール
sudo dnf install -y mariadb105

# DBサーバのプライベートIPにMySQL接続
mysql -h （DBプライベートIP） -u handson -pHandson1234! sampledb</code></pre>
<p>接続成功すれば <code>MariaDB [sampledb]&gt;</code> が表示されます。</p>
<pre><code class="language-sql">CREATE TABLE IF NOT EXISTS messages (id INT AUTO_INCREMENT PRIMARY KEY, text VARCHAR(100));
INSERT INTO messages (text) VALUES ('Hello from AP server!');
SELECT * FROM messages;
EXIT;</code></pre>
<p>APサーバから切断します。</p>
<pre><code class="language-bash">exit</code></pre>
<p><!-- ![踏み台SSHとMySQL接続確認](images/bastion-mysql-connect.jpg) --></p>
<hr>
<h2><span id="toc39">⑪ リソースの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ず削除してください。削除する順番が重要です。</strong></p>
<blockquote>
<p><strong>CloudFormation版と比較</strong>: コンソール版はリソースの依存関係を意識して手動で削除する必要があります。CloudFormation版は <code>delete-stack</code> 1本で全て自動削除できます。</p>
</blockquote>
<h3><span id="toc40">削除順序</span></h3>
<p><strong>1. EC2インスタンスを終了する（2台）</strong></p>
<p><strong>EC2 → インスタンス → <code>my-ap-instance</code> と <code>my-db-instance</code> を選択 → 「インスタンスを終了」</strong></p>
<p>「終了済み」になるまで待ちます（2〜5分）。</p>
<p><strong>2. セキュリティグループを削除する（DBサーバSG → APサーバSGの順）</strong></p>
<p>DBサーバSGがAPサーバSGを参照しているため、DBサーバSGを先に削除します。</p>
<p>① <strong><code>my-db-sg</code></strong> を選択 → 「アクション」→「セキュリティグループを削除」</p>
<p>② <strong><code>my-ap-sg</code></strong> を選択 → 「アクション」→「セキュリティグループを削除」</p>
<p><strong>3. S3 VPC Endpointを削除する</strong></p>
<p><strong>VPC → エンドポイント → <code>my-s3-endpoint</code> を選択 → 「アクション」→「エンドポイントを削除」</strong></p>
<p><strong>4. ルートテーブルの関連付けを解除・削除する</strong></p>
<p>① <code>my-public-rt</code> を選択 → 「サブネットの関連付け」タブ → 「サブネットの関連付けを編集」→ チェックを外す → 「保存」</p>
<p>② <code>my-private-rt</code> も同様に関連付けを解除する</p>
<p>③ <code>my-public-rt</code> を選択 → 「ルート」タブ → 「ルートを編集」→ <code>0.0.0.0/0</code> のルートを削除 → 「保存」</p>
<p>④ <code>my-public-rt</code> を選択 → 「アクション」→「ルートテーブルの削除」</p>
<p>⑤ <code>my-private-rt</code> も同様に削除する</p>
<p><strong>5. サブネットを削除する（2つ）</strong></p>
<p><strong>VPC → サブネット → <code>my-public-subnet</code> → 「アクション」→「サブネットを削除」</strong></p>
<p>同様に <code>my-private-subnet</code> も削除します。</p>
<p><strong>6. インターネットゲートウェイをデタッチ・削除する</strong></p>
<p><strong>VPC → インターネットゲートウェイ → <code>my-igw</code> → 「アクション」→「VPCからデタッチ」</strong></p>
<p>デタッチ完了後、「アクション」→「インターネットゲートウェイの削除」。</p>
<p><strong>7. VPCを削除する</strong></p>
<p><strong>VPC → お使いのVPC → <code>my-vpc</code> → 「アクション」→「VPCを削除」</strong></p>
<p><strong>8. IAMロールを削除する</strong></p>
<p><strong>IAM → ロール → <code>my-ec2-2tier-role</code> → 「削除」</strong></p>
<p><strong>9. キーペアを削除する（任意）</strong></p>
<p><strong>EC2 → キーペア → <code>my-ec2-2tier-key</code> → 「削除」</strong></p>
<pre><code class="language-plaintext">C:\Users\ユーザー名\.ssh\my-ec2-2tier-key.pem</code></pre>
<hr>
<h2><span id="toc41">CloudFormation版との比較</span></h2>
<table>
<thead>
<tr>
<th>作業</th>
<th>コンソール（手動）</th>
<th>CloudFormation</th>
</tr>
</thead>
<tbody>
<tr>
<td>VPC・IGW・サブネット・RTの設定</td>
<td>6画面・20ステップ以上</td>
<td>template.yaml に定義済み</td>
</tr>
<tr>
<td>S3 VPC Endpoint作成</td>
<td>画面でポチポチ</td>
<td>template.yaml に定義済み</td>
</tr>
<tr>
<td>EC2×2台の起動</td>
<td>2回インスタンス起動操作</td>
<td>コマンド1本（並列作成）</td>
</tr>
<tr>
<td>削除（依存関係あり）</td>
<td>8ステップ・手動管理</td>
<td><code>delete-stack</code> 1本</td>
</tr>
<tr>
<td>全体の所要時間</td>
<td>30〜40分</td>
<td>8〜12分</td>
</tr>
<tr>
<td>再現性</td>
<td>低い（手順漏れのリスク大）</td>
<td>高い</td>
</tr>
</tbody>
</table>
<p><strong>コンソール版で実感できたポイント:</strong></p>
<ul>
<li>VPC・IGW・サブネット・ルートテーブルの依存関係が視覚的に理解できる</li>
<li>プライベートサブネットにEC2を置くとパブリックIPが付かないことを実感できる</li>
<li>踏み台接続（APサーバ経由でDBサーバにSSH）の意味と手順が身につく</li>
<li>S3 VPC Endpointがなければ <code>dnf install</code> が失敗することを体験できる</li>
</ul>
<p><strong>CloudFormation版でも試してみる</strong>: <a href="https://caymezon.com/aws-handson-cloudformation-ec2-2tier/">CloudFormationでAP+DB 2層構成（VPC設計）を自動デプロイする手順</a></p>
<hr>
<h2><span id="toc42">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>APサーバのWebページが表示されない</td>
<td>UserDataが完了していない</td>
<td>2〜3分待ってリロード</td>
</tr>
<tr>
<td>DBサーバの <code>dnf install</code> が失敗する</td>
<td>S3 VPC Endpointが未作成</td>
<td>⑥-3の手順でEndpointを作成後、踏み台SSH接続して手動で <code>sudo dnf install -y mariadb105-server mariadb105</code> を実行</td>
</tr>
<tr>
<td>APサーバからDBサーバにSSH接続できない</td>
<td><code>my-db-sg</code> のSSHソースが <code>my-ap-sg</code> になっていない</td>
<td>DBサーバSGのインバウンドルールを確認</td>
</tr>
<tr>
<td>APサーバからMySQLに接続できない</td>
<td><code>my-db-sg</code> のMySQL(3306)ソースが <code>my-ap-sg</code> になっていない</td>
<td>DBサーバSGのインバウンドルールを確認</td>
</tr>
<tr>
<td>セキュリティグループが削除できない</td>
<td>EC2インスタンスがまだ「使用中」またはDBサーバSGを先に削除していない</td>
<td>EC2「終了済み」後に、DBサーバSG → APサーバSGの順で削除</td>
</tr>
<tr>
<td>VPCが削除できない</td>
<td>サブネット・IGW・RTが残っている</td>
<td>削除順序を守る（サブネット・RT・IGWを先に削除）</td>
</tr>
<tr>
<td>SGを作成するとき <code>my-vpc</code> のSGが選択できない</td>
<td>EC2起動時にVPCをデフォルトVPCにしている</td>
<td>ネットワーク設定でVPCを <code>my-vpc</code> に変更してから再選択</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc43">まとめ</span></h2>
<p>今回のハンズオンで体験できたこと：</p>
<table>
<thead>
<tr>
<th>確認項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>VPC設計</strong></td>
<td>カスタムVPC・パブリック/プライベートサブネット・IGW・ルートテーブルを一から構築</td>
</tr>
<tr>
<td><strong>ネットワーク分離</strong></td>
<td>DBサーバをプライベートサブネットに配置してインターネットから隔離</td>
</tr>
<tr>
<td><strong>S3 VPC Endpoint</strong></td>
<td>プライベートサブネットからインターネットなしでパッケージをインストール</td>
</tr>
<tr>
<td><strong>踏み台接続</strong></td>
<td>APサーバを中継してプライベートサブネットのDBサーバにSSH接続</td>
</tr>
<tr>
<td><strong>SG参照</strong></td>
<td>DBサーバSGのルールをIPアドレスではなくAPサーバSGで指定</td>
</tr>
<tr>
<td><strong>削除手順</strong></td>
<td>依存関係を意識して8ステップで全リソースを削除</td>
</tr>
</tbody>
</table>
<p>20ステップ以上の手動作業でリソースを一つひとつ作ると、CloudFormationが裏で何を自動化しているかが理解できます。ぜひ次は <a href="https://caymezon.com/aws-handson-cloudformation-ec2-2tier/">CloudFormation版</a> でコマンド1本の差を体感してみてください。</p>
<hr>
<h2><span id="toc44">関連記事</span></h2>
<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運用入門 改訂第2版 押さえておきたいAWSの基本と運用ノウハウ [AWS深掘りガイド]","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51AAOubymTL._SL500_.jpg","\/51VMG6YKHdL._SL500_.jpg","\/41EdPB8azAL._SL500_.jpg","\/41v2JFE-9jL._SL500_.jpg","\/41FEEqR-yDL._SL500_.jpg","\/41JfZAdnTPL._SL500_.jpg","\/41vGK0czQrL._SL500_.jpg","\/41-SnYtz2aL._SL500_.jpg","\/41sPrV5fi3L._SL500_.jpg","\/41p7JtvYJ1L._SL500_.jpg","\/4169GVNTs8L._SL500_.jpg","\/41BPI5HP3zL._SL500_.jpg","\/41QOyk60CYL._SL500_.jpg","\/41APjk6FphL._SL500_.jpg","\/41ezKUu7VRL._SL500_.jpg","\/41A1n3K+r5L._SL500_.jpg","\/41aY2T8lEOL._SL500_.jpg","\/419Ca1V6HZL._SL500_.jpg","\/41zQkYyLPzL._SL500_.jpg","\/41YpHcyxiTL._SL500_.jpg","\/41-tKN5mt6L._SL500_.jpg","\/419Mv6m55IL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815631085","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\/4815631085","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D\/","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"E8MM1","s":"s"});</script></p>
<div id="msmaflink-E8MM1">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --> --></p><p>The post <a href="https://caymezon.com/aws-handson-console-ec2-2tier/">AWSコンソールでVPC設計からAP+DB 2層構成を構築する手順【踏み台SSH / CloudFormation版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-console-ec2-2tier/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CloudFormationでAP+DB 2層構成（VPC設計）を自動デプロイする手順【踏み台SSH / コンソール版との比較付き】</title>
		<link>https://caymezon.com/aws-handson-cloudformation-ec2-2tier/</link>
					<comments>https://caymezon.com/aws-handson-cloudformation-ec2-2tier/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sat, 04 Apr 2026 07:33:58 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[2層構成]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWSCLI]]></category>
		<category><![CDATA[CloudFormation]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[IaC]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[SG参照]]></category>
		<category><![CDATA[VPC]]></category>
		<category><![CDATA[セキュリティグループ]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[パブリックサブネット]]></category>
		<category><![CDATA[プライベートサブネット]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[踏み台]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20323</guid>

					<description><![CDATA[<p>はじめに 「コンソールで20ステップかかったVPC設計をコードで再現したい」——それを実現するのが AWS CloudFormation です。 この記事では、template.yaml 1ファイルにVPC・サブネット・ [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-cloudformation-ec2-2tier/">CloudFormationでAP+DB 2層構成（VPC設計）を自動デプロイする手順【踏み台SSH / コンソール版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>「コンソールで20ステップかかったVPC設計をコードで再現したい」——それを実現するのが <strong>AWS CloudFormation</strong> です。</p>
<p>この記事では、<code>template.yaml</code> 1ファイルにVPC・サブネット・ルートテーブル・セキュリティグループ・EC2（2台）を定義し、<strong>コマンド1本でAP+DB 2層構成を一括構築するハンズオン</strong>を紹介します。コンソール版（<a href="https://caymezon.com/aws-handson-console-ec2-2tier/">AWSコンソール版ハンズオン</a>）と全く同じ構成を、CloudFormationで自動化します。</p>
<pre><code class="language-plaintext">ローカル環境（VSCode）
  └── template.yaml + AWS CLI
        ↓ スタック作成（コマンド1本）
AWS環境
  └── VPC（10.0.0.0/16）
        ├── インターネットゲートウェイ
        │
        ├── [パブリックサブネット 10.0.1.0/24]
        │     ├── パブリックルートテーブル（0.0.0.0/0 → IGW）
        │     └── APサーバEC2（Apache / パブリックIP あり）
        │
        └── [プライベートサブネット 10.0.2.0/24]
              ├── プライベートルートテーブル（VPC内のみ）
              ├── S3 VPC Gateway Endpoint（dnf用・無料）
              └── DBサーバEC2（MariaDB / パブリックIP なし）</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li>VPC・サブネット・IGW・ルートテーブルを <code>template.yaml</code> 1ファイルで定義する方法</li>
<li>S3 VPC Gateway Endpoint の <code>DependsOn</code> による起動順序制御</li>
<li><code>SubnetId</code> でEC2の配置サブネットを明示する方法</li>
<li><code>aws cloudformation create-stack</code> コマンド1本での17リソース一括デプロイ</li>
<li><code>delete-stack</code> による複雑な依存関係を持つVPCリソースの一括削除</li>
</ul>
<p><strong>このハンズオンの特徴：</strong></p>
<ul>
<li>コンソール版では20ステップ以上・30〜40分かかった作業が、コマンド1本（8〜12分）で完了</li>
<li><code>delete-stack</code> 1本でVPC・サブネット・IGW・RTの依存関係を自動解決して削除</li>
</ul>
<hr>
<p><!-- ![CloudFormationスタック作成完了画面](images/cfn-create-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">CloudFormation vs コンソール：どれだけ違うか</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>CloudFormation</th>
<th>コンソール（手動）</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>VPC・IGW・サブネット・RTの設定</strong></td>
<td>template.yaml に定義済み</td>
<td>6画面・20ステップ以上</td>
</tr>
<tr>
<td><strong>S3 VPC Endpoint作成</strong></td>
<td>template.yaml に定義済み</td>
<td>画面でポチポチ</td>
</tr>
<tr>
<td><strong>EC2×2台の起動</strong></td>
<td>コマンド1本（並列作成）</td>
<td>2回インスタンス起動操作</td>
</tr>
<tr>
<td><strong>全体のデプロイ</strong></td>
<td>コマンド1本（8〜12分）</td>
<td>20ステップ以上（30〜40分）</td>
</tr>
<tr>
<td><strong>削除（依存関係あり）</strong></td>
<td><code>delete-stack</code> 1本（自動解決）</td>
<td>8ステップ・手動管理</td>
</tr>
<tr>
<td><strong>再現性</strong></td>
<td>高い（同じ構成を何度でも再現可能）</td>
<td>低い（手順漏れのリスク大）</td>
</tr>
<tr>
<td><strong>バージョン管理</strong></td>
<td>Gitで管理可能</td>
<td>不可</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">キーワード解説</span></h2>
<table>
<thead>
<tr>
<th>用語</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>CloudFormation</strong></td>
<td>AWSが提供するIaC（Infrastructure as Code）サービス</td>
</tr>
<tr>
<td><strong>スタック</strong></td>
<td>CloudFormationが管理するリソースのまとまり。今回は17リソースを1スタックで管理</td>
</tr>
<tr>
<td><strong><code>DependsOn</code></strong></td>
<td>CloudFormationでリソースの作成順序を明示するプロパティ</td>
</tr>
<tr>
<td><strong><code>SubnetId</code></strong></td>
<td>EC2インスタンスを特定のサブネットに配置するプロパティ</td>
</tr>
<tr>
<td><strong>S3 VPC Gateway Endpoint</strong></td>
<td>プライベートサブネットからS3にアクセスするための無料エンドポイント</td>
</tr>
<tr>
<td><strong><code>!Select [0, !GetAZs &#39;&#39;]</code></strong></td>
<td>リージョン内の最初のAZを自動取得するCloudFormation関数</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc4">前提条件</span></h2>
<table>
<thead>
<tr>
<th>ツール</th>
<th>確認コマンド</th>
<th>最低バージョン目安</th>
</tr>
</thead>
<tbody>
<tr>
<td>AWS CLI v2</td>
<td><code>aws --version</code></td>
<td>2.x</td>
</tr>
<tr>
<td>Git</td>
<td><code>git --version</code></td>
<td>2.x</td>
</tr>
<tr>
<td>VSCode</td>
<td>-</td>
<td>-</td>
</tr>
</tbody>
</table>
<p>AWS認証確認:</p>
<pre><code class="language-cmd">aws sts get-caller-identity</code></pre>
<hr>
<h2><span id="toc5">template.yaml の全文</span></h2>
<p>以下が今回使用する <code>template.yaml</code> の全文です（17リソース）。プロジェクトフォルダ（<code>ec2-2tier-web/</code>）直下に配置します。</p>
<blockquote>
<p><strong>⚠️ コピー前に確認</strong>: <code>Default: &#39;123.456.78.901/32&#39;</code> の箇所は<strong>ダミーIPです</strong>。このまま使うとスタック作成は成功しますが、SSHもWebもアクセスできません。<code>--parameters</code> でIPを上書きするか（推奨）、Defaultを自分のIPに書き換えてから使ってください。</p>
</blockquote>
<pre><code class="language-yaml">AWSTemplateFormatVersion: '2010-09-09'
Description: 'EC2 2-tier Architecture (AP + DB) with VPC public/private subnet separation (Phase 1-4)'

Parameters:
  KeyName:
    Type: String
    Default: 'my-ec2-2tier-key'
    Description: Name of an existing EC2 KeyPair

  MyIP:
    Type: String
    Default: '123.456.78.901/32'
    Description: Your IP address to allow SSH and HTTP access (CIDR format e.g. 203.0.113.1/32)

Resources:

  # VPC and Network
  # ============================================================

  # VPC: isolated network space for this hands-on
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: 'my-vpc'

  # Internet Gateway: connects the VPC to the internet
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: 'my-igw'

  # Attach Internet Gateway to VPC
  IGWAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  # Public Subnet: AP server goes here (internet accessible)
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs '']
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: 'my-public-subnet'

  # Private Subnet: DB server goes here (no direct internet access)
  PrivateSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [0, !GetAZs '']
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value: 'my-private-subnet'

  # Public Route Table: routes internet traffic via Internet Gateway
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: 'my-public-rt'

  # Default route for public subnet: all traffic -&gt; Internet Gateway
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: IGWAttachment
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  # Associate public subnet with public route table
  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable

  # Private Route Table: no internet route (local traffic only)
  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: 'my-private-rt'

  # Associate private subnet with private route table
  PrivateSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet
      RouteTableId: !Ref PrivateRouteTable

  # S3 VPC Gateway Endpoint: allows private subnet to reach S3 (for dnf package downloads)
  # Gateway endpoints are FREE - no hourly charge
  S3VPCEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC
      ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3'
      VpcEndpointType: Gateway
      RouteTableIds:
        - !Ref PrivateRouteTable

  # ============================================================
  # IAM
  # ============================================================

  # IAM Role: allows EC2 to use Session Manager
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: 'my-ec2-2tier-role'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Tags:
        - Key: Name
          Value: 'my-ec2-2tier-role'

  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: 'my-ec2-2tier-profile'
      Roles:
        - !Ref EC2Role

  # ============================================================
  # Security Groups
  # ============================================================

  # AP Server Security Group: SSH and HTTP from MyIP
  APSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'my AP server SG (public subnet)'
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref MyIP
          Description: SSH from my IP
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: !Ref MyIP
          Description: HTTP from my IP
      Tags:
        - Key: Name
          Value: 'my-ap-sg'

  # DB Server Security Group: MySQL from AP SG only, SSH from AP SG (via bastion)
  DBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'my DB server SG (private subnet)'
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          SourceSecurityGroupId: !GetAtt APSecurityGroup.GroupId
          Description: SSH from AP server only (bastion access)
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          SourceSecurityGroupId: !GetAtt APSecurityGroup.GroupId
          Description: MySQL from AP server only (SG-to-SG control)
      Tags:
        - Key: Name
          Value: 'my-db-sg'

  # ============================================================
  # EC2 Instances
  # ============================================================

  # AP Server: Apache in public subnet
  APInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}'
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      SubnetId: !Ref PublicSubnet
      SecurityGroupIds:
        - !GetAtt APSecurityGroup.GroupId
      IamInstanceProfile: !Ref EC2InstanceProfile
      UserData:
        Fn::Base64: |
          #!/bin/bash
          dnf update -y
          dnf install -y httpd
          systemctl start httpd
          systemctl enable httpd
          cat &gt; /var/www/html/index.html &lt;&lt; 'HTMLEOF'
          &lt;!DOCTYPE html&gt;
          &lt;html&gt;
          &lt;head&gt;&lt;meta charset="UTF-8"&gt;&lt;title&gt;AP Server - Phase 1-4&lt;/title&gt;&lt;/head&gt;
          &lt;body&gt;
          &lt;h1&gt;AP Server (Public Subnet)&lt;/h1&gt;
          &lt;p&gt;This AP server is in the PUBLIC subnet and can reach the DB server in the PRIVATE subnet.&lt;/p&gt;
          &lt;/body&gt;
          &lt;/html&gt;
          HTMLEOF
      Tags:
        - Key: Name
          Value: 'my-ap-instance'

  # DB Server: MariaDB in private subnet (no public IP)
  DBInstance:
    Type: AWS::EC2::Instance
    DependsOn:
      - S3VPCEndpoint
      - PrivateSubnetRouteTableAssociation
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}'
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      SubnetId: !Ref PrivateSubnet
      SecurityGroupIds:
        - !GetAtt DBSecurityGroup.GroupId
      IamInstanceProfile: !Ref EC2InstanceProfile
      UserData:
        Fn::Base64: |
          #!/bin/bash
          dnf update -y
          dnf install -y mariadb105-server mariadb105
          systemctl start mariadb
          systemctl enable mariadb
          sudo mysql -u root &lt;&lt; 'SQLEOF'
          SET PASSWORD FOR root@localhost = PASSWORD('Admin1234!');
          CREATE USER IF NOT EXISTS 'handson'@'%' IDENTIFIED BY 'Handson1234!';
          GRANT ALL PRIVILEGES ON *.* TO 'handson'@'%' WITH GRANT OPTION;
          CREATE DATABASE IF NOT EXISTS sampledb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
          FLUSH PRIVILEGES;
          SQLEOF
      Tags:
        - Key: Name
          Value: 'my-db-instance'

Outputs:
  VPCId:
    Description: VPC ID
    Value: !Ref VPC

  APPublicIP:
    Description: AP server public IP (open in browser or SSH)
    Value: !GetAtt APInstance.PublicIp

  DBPrivateIP:
    Description: DB server private IP (connect via AP server bastion)
    Value: !GetAtt DBInstance.PrivateIp

  WebsiteURL:
    Description: AP server website URL
    Value: !Sub 'http://${APInstance.PublicIp}'

  APSSHCommand:
    Description: SSH command to AP server
    Value: !Sub 'ssh -i C:\Users\username\.ssh\${KeyName}.pem ec2-user@${APInstance.PublicIp}'

  DBSSHCommand:
    Description: SSH command to DB server (run this FROM the AP server)
    Value: !Sub 'ssh -i ~/.ssh/${KeyName}.pem ec2-user@${DBInstance.PrivateIp}'

  MySQLConnectCommand:
    Description: MySQL connect command (run this FROM the AP server)
    Value: !Sub 'mysql -h ${DBInstance.PrivateIp} -u handson -pHandson1234! sampledb'</code></pre>
<p><strong>template.yaml の重要ポイント:</strong></p>
<h3><span id="toc6">1. VpcId を指定した SecurityGroup</span></h3>
<p>カスタムVPCを使う場合は <code>VpcId</code> を明示します。<code>VpcId</code> を指定することで <code>!GetAtt APSecurityGroup.GroupId</code> が確実にSG IDを返します。</p>
<pre><code class="language-yaml">APSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    VpcId: !Ref VPC      # ← カスタムVPCを指定（必須）

DBSecurityGroup:
  SecurityGroupIngress:
    - SourceSecurityGroupId: !GetAtt APSecurityGroup.GroupId  # ← !Refではなく!GetAtt</code></pre>
<h3><span id="toc7">2. S3 VPC Gateway Endpoint（無料）</span></h3>
<p>プライベートサブネットのEC2は直接インターネットに出られませんが、Amazon Linux 2023のパッケージリポジトリはS3上にあります。S3 VPC Gateway EndpointをプライベートルートテーブルにアタッチするとS3経由で <code>dnf install</code> が動作します。</p>
<pre><code class="language-yaml">S3VPCEndpoint:
  Type: AWS::EC2::VPCEndpoint
  Properties:
    VpcEndpointType: Gateway     # Gatewayタイプは無料
    ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3'
    RouteTableIds:
      - !Ref PrivateRouteTable   # プライベートRTにS3ルートが追加される</code></pre>
<h3><span id="toc8">3. DBInstance の DependsOn</span></h3>
<p>DBサーバEC2のUserDataが <code>dnf install</code> を実行するとき、S3 VPC Endpointが有効になっている必要があります。</p>
<pre><code class="language-yaml">DBInstance:
  DependsOn:
    - S3VPCEndpoint
    - PrivateSubnetRouteTableAssociation</code></pre>
<h3><span id="toc9">4. SubnetId でサブネットを指定</span></h3>
<p>EC2インスタンスがどのサブネットに配置されるかを明示します。</p>
<pre><code class="language-yaml">APInstance:
  SubnetId: !Ref PublicSubnet   # パブリックサブネットに配置

DBInstance:
  SubnetId: !Ref PrivateSubnet  # プライベートサブネットに配置</code></pre>
<p><strong>構築されるリソース一覧（17個）:</strong></p>
<table>
<thead>
<tr>
<th>#</th>
<th>リソース</th>
<th>論理ID</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>VPC</td>
<td><code>VPC</code></td>
</tr>
<tr>
<td>2</td>
<td>インターネットゲートウェイ</td>
<td><code>InternetGateway</code></td>
</tr>
<tr>
<td>3</td>
<td>IGW-VPCアタッチ</td>
<td><code>IGWAttachment</code></td>
</tr>
<tr>
<td>4</td>
<td>パブリックサブネット</td>
<td><code>PublicSubnet</code></td>
</tr>
<tr>
<td>5</td>
<td>プライベートサブネット</td>
<td><code>PrivateSubnet</code></td>
</tr>
<tr>
<td>6</td>
<td>パブリックルートテーブル</td>
<td><code>PublicRouteTable</code></td>
</tr>
<tr>
<td>7</td>
<td>パブリックルート（→IGW）</td>
<td><code>PublicRoute</code></td>
</tr>
<tr>
<td>8</td>
<td>パブリックRT関連付け</td>
<td><code>PublicSubnetRouteTableAssociation</code></td>
</tr>
<tr>
<td>9</td>
<td>プライベートルートテーブル</td>
<td><code>PrivateRouteTable</code></td>
</tr>
<tr>
<td>10</td>
<td>プライベートRT関連付け</td>
<td><code>PrivateSubnetRouteTableAssociation</code></td>
</tr>
<tr>
<td>11</td>
<td>S3 VPC Gateway Endpoint</td>
<td><code>S3VPCEndpoint</code></td>
</tr>
<tr>
<td>12</td>
<td>IAMロール</td>
<td><code>EC2Role</code></td>
</tr>
<tr>
<td>13</td>
<td>インスタンスプロファイル</td>
<td><code>EC2InstanceProfile</code></td>
</tr>
<tr>
<td>14</td>
<td>APサーバSG</td>
<td><code>APSecurityGroup</code></td>
</tr>
<tr>
<td>15</td>
<td>DBサーバSG</td>
<td><code>DBSecurityGroup</code></td>
</tr>
<tr>
<td>16</td>
<td>APサーバEC2</td>
<td><code>APInstance</code></td>
</tr>
<tr>
<td>17</td>
<td>DBサーバEC2</td>
<td><code>DBInstance</code></td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc10">作業順序</span></h2>
<pre><code class="language-plaintext">⓪ 自分のIPアドレスを確認する
      ↓
① キーペアを作成する（コンソールで実施）
      ↓
② プロジェクトフォルダに移動する
      ↓
③ スタックを作成する（aws cloudformation create-stack）
      ↓
④ 作成完了・Outputsを確認する
      ↓
⑤ 動作確認（Web・踏み台SSH・MySQL接続）
      ↓
⑥ スタックを削除する（aws cloudformation delete-stack）</code></pre>
<hr>
<h2><span id="toc11">⓪ 自分の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>
<hr>
<h2><span id="toc12">① キーペアの作成（コンソールで実施）</span></h2>
<p>キーペアのみコンソールで作成します。</p>
<p><strong>AWSコンソール → EC2 → キーペア → 「キーペアを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-ec2-2tier-key</code></td>
</tr>
<tr>
<td>キーペアのタイプ</td>
<td><strong>RSA</strong></td>
</tr>
<tr>
<td>プライベートキーファイル形式</td>
<td><strong>.pem</strong></td>
</tr>
</tbody>
</table>
<pre><code class="language-plaintext">C:\Users\ユーザー名\.ssh\my-ec2-2tier-key.pem</code></pre>
<hr>
<h2><span id="toc13">② プロジェクトフォルダに移動する</span></h2>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\ec2-2tier-web</code></pre>
<pre><code class="language-cmd">dir template.yaml</code></pre>
<hr>
<h2><span id="toc14">③ スタックの作成</span></h2>
<p><code>203.0.113.1</code> は⓪で確認した自分のIPアドレスに置き換えてください。</p>
<pre><code class="language-cmd">aws cloudformation create-stack ^
  --stack-name my-ec2-2tier-stack ^
  --template-body file://template.yaml ^
  --region ap-northeast-1 ^
  --capabilities CAPABILITY_NAMED_IAM ^
  --parameters ^
    ParameterKey=KeyName,ParameterValue=my-ec2-2tier-key ^
    ParameterKey=MyIP,ParameterValue=203.0.113.1/32</code></pre>
<p><strong>各オプションの説明:</strong></p>
<table>
<thead>
<tr>
<th>オプション</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>--stack-name my-ec2-2tier-stack</code></td>
<td>スタック名（英字始まり）</td>
</tr>
<tr>
<td><code>--template-body file://template.yaml</code></td>
<td>使用するテンプレートファイル</td>
</tr>
<tr>
<td><code>--region ap-northeast-1</code></td>
<td>デプロイ先リージョン（東京）</td>
</tr>
<tr>
<td><code>--capabilities CAPABILITY_NAMED_IAM</code></td>
<td>名前付きIAMロール作成の明示的な許可</td>
</tr>
<tr>
<td><code>--parameters ...</code></td>
<td>テンプレートのParametersに渡す値</td>
</tr>
</tbody>
</table>
<p>成功するとStackIdが表示されます。</p>
<pre><code class="language-json">{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/my-ec2-2tier-stack/xxxxx"
}</code></pre>
<p><!-- ![スタック作成コマンドの実行結果](images/cfn-create-stack-cmd.jpg) --></p>
<hr>
<h2><span id="toc15">④ 作成完了・Outputsの確認</span></h2>
<p>スタック作成完了まで<strong>約8〜12分</strong>かかります（VPCリソース×10個 + EC2×2台 + MariaDBインストールの時間）。</p>
<h3><span id="toc16">作成状況の確認</span></h3>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-2tier-stack ^
  --query "Stacks[0].StackStatus" ^
  --output text</code></pre>
<table>
<thead>
<tr>
<th>ステータス</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CREATE_IN_PROGRESS</code></td>
<td>作成中（しばらく待つ）</td>
</tr>
<tr>
<td><code>CREATE_COMPLETE</code></td>
<td>作成完了</td>
</tr>
<tr>
<td><code>CREATE_FAILED</code></td>
<td>作成失敗（トラブルシューティングを参照）</td>
</tr>
<tr>
<td><code>ROLLBACK_COMPLETE</code></td>
<td>失敗してロールバック完了</td>
</tr>
</tbody>
</table>
<h3><span id="toc17">Outputs の確認</span></h3>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-2tier-stack ^
  --query "Stacks[0].Outputs" ^
  --output table</code></pre>
<p>以下のような出力が表示されます。</p>
<pre><code class="language-plaintext">--------------------------------------------------------------------------------------
|                                  DescribeStacks                                    |
+--------------------+---------------------------------------------------------------+
|  OutputKey         |  OutputValue                                                  |
+--------------------+---------------------------------------------------------------+
|  VPCId             |  vpc-xxxxxxxxxx                                              |
|  APPublicIP        |  x.x.x.x                                                    |
|  DBPrivateIP       |  10.0.2.xxx   ← APサーバからの接続に使用                    |
|  WebsiteURL        |  http://x.x.x.x                                             |
|  APSSHCommand      |  ssh -i ...pem ec2-user@x.x.x.x                            |
|  DBSSHCommand      |  ssh -i ~/.ssh/...pem ec2-user@10.0.2.xxx                  |
|  MySQLConnectCommand| mysql -h 10.0.2.xxx -u handson -pHandson1234! sampledb     |
+--------------------+---------------------------------------------------------------+</code></pre>
<p><strong>控えておく情報:</strong></p>
<ul>
<li><code>APPublicIP</code>: APサーバのパブリックIP</li>
<li><code>DBPrivateIP</code>: DBサーバのプライベートIP（<code>10.0.2.xxx</code> 形式）</li>
<li><code>APSSHCommand</code>: APサーバへのSSHコマンド</li>
<li><code>DBSSHCommand</code>: APサーバからDBサーバへのSSHコマンド</li>
<li><code>MySQLConnectCommand</code>: APサーバから実行するMySQL接続コマンド</li>
</ul>
<p><!-- ![Outputs確認コマンドの実行結果](images/cfn-outputs-table.jpg) --></p>
<hr>
<h2><span id="toc18">⑤ 動作確認</span></h2>
<h3><span id="toc19">5-1. APサーバのWeb確認</span></h3>
<p><code>WebsiteURL</code> をブラウザで開きます。<code>AP Server (Public Subnet)</code> が表示されれば成功です。</p>
<h3><span id="toc20">5-2. APサーバへのSSH接続</span></h3>
<p><code>APSSHCommand</code> を実行します（パスを実際のパスに修正します）。</p>
<pre><code class="language-cmd">ssh -i C:\Users\ユーザー名\.ssh\my-ec2-2tier-key.pem ec2-user@（APPublicIP）</code></pre>
<h3><span id="toc21">5-3. キーペアをAPサーバにコピーする（踏み台SSH準備）</span></h3>
<p><strong>ローカルPCの別ターミナルで実行します:</strong></p>
<pre><code class="language-cmd">scp -i C:\Users\ユーザー名\.ssh\my-ec2-2tier-key.pem ^
  C:\Users\ユーザー名\.ssh\my-ec2-2tier-key.pem ^
  ec2-user@（APPublicIP）:~/.ssh/</code></pre>
<p>APサーバのSSHセッションでパーミッションを設定します。</p>
<pre><code class="language-bash">chmod 400 ~/.ssh/my-ec2-2tier-key.pem</code></pre>
<h3><span id="toc22">5-4. APサーバ経由でDBサーバにSSH接続（踏み台接続）</span></h3>
<p><strong>APサーバのSSHセッションから実行します:</strong></p>
<pre><code class="language-bash">ssh -i ~/.ssh/my-ec2-2tier-key.pem ec2-user@（DBPrivateIP）</code></pre>
<p><code>[ec2-user@ip-10-0-2-xxx ~]$</code> が表示されれば踏み台接続成功です。</p>
<pre><code class="language-bash"># DBサーバ上でMariaDBの状態を確認
sudo systemctl status mariadb

# MariaDBに接続
mysql -u root -pAdmin1234! -e "SHOW DATABASES;"

exit</code></pre>
<h3><span id="toc23">5-5. APサーバからMySQLに接続（AP→DB通信確認）</span></h3>
<p>APサーバのSSHセッションに戻り、<code>MySQLConnectCommand</code> をそのまま実行します。</p>
<pre><code class="language-bash"># mysqlクライアントをインストール
sudo dnf install -y mariadb105

# OutputsのMySQLConnectCommandをそのまま使う
mysql -h （DBPrivateIP） -u handson -pHandson1234! sampledb</code></pre>
<pre><code class="language-sql">CREATE TABLE IF NOT EXISTS messages (id INT AUTO_INCREMENT PRIMARY KEY, text VARCHAR(100));
INSERT INTO messages (text) VALUES ('Hello from AP server!');
SELECT * FROM messages;
EXIT;</code></pre>
<pre><code class="language-bash">exit</code></pre>
<p><!-- ![踏み台SSHとMySQL接続確認](images/bastion-mysql-connect.jpg) --></p>
<hr>
<h2><span id="toc24">⑥ スタックの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ず削除してください。</strong></p>
<p>CloudFormationはVPC・サブネット・IGW・RT・SG・EC2の依存関係を自動解決して正しい順序で削除します。</p>
<pre><code class="language-cmd">aws cloudformation delete-stack ^
  --stack-name my-ec2-2tier-stack ^
  --region ap-northeast-1</code></pre>
<p>削除完了まで<strong>約8〜12分</strong>かかります。</p>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-2tier-stack ^
  --query "Stacks[0].StackStatus" ^
  --output text</code></pre>
<table>
<thead>
<tr>
<th>ステータス</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>DELETE_IN_PROGRESS</code></td>
<td>削除中（しばらく待つ）</td>
</tr>
<tr>
<td><code>DELETE_FAILED</code></td>
<td>削除失敗（トラブルシューティングを参照）</td>
</tr>
</tbody>
</table>
<p>削除完了の確認（以下のエラーが表示されれば削除完了）。</p>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-2tier-stack ^
  --region ap-northeast-1</code></pre>
<pre><code class="language-plaintext">An error occurred (ValidationError) when calling the DescribeStacks operation:
Stack with id my-ec2-2tier-stack does not exist</code></pre>
<p>キーペアは手動で削除します。</p>
<p><strong>EC2 → キーペア → <code>my-ec2-2tier-key</code> → 「削除」</strong></p>
<hr>
<h2><span id="toc25">コンソール版との比較</span></h2>
<p>コンソール版で20ステップ以上かかった作業が、CloudFormationでは <code>template.yaml</code> に定義されています。</p>
<table>
<thead>
<tr>
<th>CFnの記述</th>
<th>コンソールでやること</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>VPC</code></td>
<td>VPC → VPCを作成</td>
</tr>
<tr>
<td><code>InternetGateway</code> + <code>IGWAttachment</code></td>
<td>IGWを作成 → VPCにアタッチ（2ステップ）</td>
</tr>
<tr>
<td><code>PublicSubnet</code> + <code>PrivateSubnet</code></td>
<td>サブネットを2つ作成</td>
</tr>
<tr>
<td><code>PublicRouteTable</code> + <code>PublicRoute</code> + <code>PublicSubnetRouteTableAssociation</code></td>
<td>パブリックRTを作成・ルート追加・サブネット関連付け（3ステップ）</td>
</tr>
<tr>
<td><code>PrivateRouteTable</code> + <code>PrivateSubnetRouteTableAssociation</code></td>
<td>プライベートRTを作成・サブネット関連付け（2ステップ）</td>
</tr>
<tr>
<td><code>S3VPCEndpoint</code></td>
<td>VPCエンドポイントを作成</td>
</tr>
<tr>
<td><code>APSecurityGroup</code> + <code>DBSecurityGroup</code></td>
<td>SGを2つ作成（APサーバSG → DBサーバSGの順）</td>
</tr>
<tr>
<td><code>APInstance</code> + <code>DBInstance</code></td>
<td>EC2を2回起動（各5〜10分）</td>
</tr>
<tr>
<td><code>delete-stack</code></td>
<td>8ステップの手動削除（依存関係を手動管理）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc26">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CREATE_FAILED</code> になる</td>
<td>キーペアが存在しない</td>
<td>コンソールでキーペアを確認・作成</td>
</tr>
<tr>
<td><code>CREATE_FAILED</code> になる</td>
<td>同名のIAMロールが既に存在する</td>
<td>IAMコンソールでロールを削除してから再実行</td>
</tr>
<tr>
<td><code>stackName failed to satisfy regular expression</code></td>
<td>スタック名が数字始まり</td>
<td>CloudFormationのスタック名は<strong>英字で始まる</strong>必要がある</td>
</tr>
<tr>
<td><code>Unable to load paramfile</code> エラー</td>
<td>template.yaml に日本語が含まれている</td>
<td>template.yaml のコメントは<strong>英語のみ</strong>で記述する</td>
</tr>
<tr>
<td>DBサーバのMariaDBが起動していない</td>
<td>S3 VPC EndpointのRouteTableへの反映が遅延</td>
<td>DBサーバに踏み台接続して <code>sudo dnf install -y mariadb105-server</code> を手動実行</td>
</tr>
<tr>
<td>APサーバからDBにSSH接続できない</td>
<td>DBサーバSGのSSHソースが正しくない</td>
<td>CloudFormationのイベントログで <code>CREATE_FAILED</code> を確認</td>
</tr>
<tr>
<td><code>DELETE_FAILED</code> になる</td>
<td>VPC内のリソースが残っている</td>
<td>コンソールで <code>my-vpc</code> 内の残存リソースを確認して手動削除</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc27">まとめ</span></h2>
<p>今回のハンズオンで実現できたこと：</p>
<table>
<thead>
<tr>
<th>確認項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>VPCリソースのIaC化</strong></td>
<td>VPC・IGW・サブネット・RT 10リソースを <code>template.yaml</code> 1ファイルで定義</td>
</tr>
<tr>
<td><strong>S3 VPC Endpoint</strong></td>
<td><code>DependsOn</code> でDBサーバEC2の起動前にEndpointが有効になることを保証</td>
</tr>
<tr>
<td><strong>一括デプロイ</strong></td>
<td><code>create-stack</code> 1本で17リソースを8〜12分で構築</td>
</tr>
<tr>
<td><strong>依存関係の自動解決</strong></td>
<td><code>delete-stack</code> 1本でVPC内のリソースを正しい順序で自動削除</td>
</tr>
<tr>
<td><strong>Outputs活用</strong></td>
<td><code>DBPrivateIP</code>・<code>MySQLConnectCommand</code> が自動生成されるため手動でコマンドを組み立てる必要なし</td>
</tr>
</tbody>
</table>
<h3><span id="toc28">CloudFormationのメリットを実感できたポイント</span></h3>
<ul>
<li>コンソール版では20ステップ以上・30〜40分かかった作業がコマンド1本（8〜12分）で完了</li>
<li>VPC・サブネット・RT・SGの複雑な削除順序をCloudFormationが自動管理</li>
<li><code>template.yaml</code> をGitで管理することで、ネットワーク設計の変更履歴が残せる</li>
</ul>
<hr>
<h2><span id="toc29">コンソール版と比較してみる</span></h2>
<p>CloudFormationが裏で何をやっているか、同じ構成をAWSコンソールのみで構築する手順をまとめました。VPCリソースの作成・削除順序や依存関係を視覚的に確認できます。</p>
<p><a href="https://caymezon.com/aws-handson-console-ec2-2tier/">AWSコンソールでVPC設計からAP+DB 2層構成を構築する手順</a></p>
<hr>
<h2><span id="toc30">関連記事</span></h2>
<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運用入門 改訂第2版 押さえておきたいAWSの基本と運用ノウハウ [AWS深掘りガイド]","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51AAOubymTL._SL500_.jpg","\/51VMG6YKHdL._SL500_.jpg","\/41EdPB8azAL._SL500_.jpg","\/41v2JFE-9jL._SL500_.jpg","\/41FEEqR-yDL._SL500_.jpg","\/41JfZAdnTPL._SL500_.jpg","\/41vGK0czQrL._SL500_.jpg","\/41-SnYtz2aL._SL500_.jpg","\/41sPrV5fi3L._SL500_.jpg","\/41p7JtvYJ1L._SL500_.jpg","\/4169GVNTs8L._SL500_.jpg","\/41BPI5HP3zL._SL500_.jpg","\/41QOyk60CYL._SL500_.jpg","\/41APjk6FphL._SL500_.jpg","\/41ezKUu7VRL._SL500_.jpg","\/41A1n3K+r5L._SL500_.jpg","\/41aY2T8lEOL._SL500_.jpg","\/419Ca1V6HZL._SL500_.jpg","\/41zQkYyLPzL._SL500_.jpg","\/41YpHcyxiTL._SL500_.jpg","\/41-tKN5mt6L._SL500_.jpg","\/419Mv6m55IL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815631085","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\/4815631085","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D\/","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"E8MM1","s":"s"});</script></p>
<div id="msmaflink-E8MM1">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --> --></p><p>The post <a href="https://caymezon.com/aws-handson-cloudformation-ec2-2tier/">CloudFormationでAP+DB 2層構成（VPC設計）を自動デプロイする手順【踏み台SSH / コンソール版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-cloudformation-ec2-2tier/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>EC2サーバ構築ハンズオン：AWSコンソールでEC2 MySQLのDBサーバを構築する手順【SG参照 / CloudFormation版との比較付き】</title>
		<link>https://caymezon.com/aws-handson-console-ec2-mysql/</link>
					<comments>https://caymezon.com/aws-handson-console-ec2-mysql/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sun, 29 Mar 2026 07:32:39 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWSコンソール]]></category>
		<category><![CDATA[DBサーバー]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[ec2サーバ構築]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[SG参照]]></category>
		<category><![CDATA[UserData]]></category>
		<category><![CDATA[セキュリティグループ]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20319</guid>

					<description><![CDATA[<p>はじめに 「EC2サーバでデータベースを動かしたい」「EC2同士の通信をセキュアに制御したい」——そのステップがこのハンズオンです。 この記事では、AWSコンソール（GUI）のみを使って、MySQL互換のDBサーバー（M [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-console-ec2-mysql/">EC2サーバ構築ハンズオン：AWSコンソールでEC2 MySQLのDBサーバを構築する手順【SG参照 / CloudFormation版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>「EC2サーバでデータベースを動かしたい」「EC2同士の通信をセキュアに制御したい」——そのステップがこのハンズオンです。</p>
<p>この記事では、<strong>AWSコンソール（GUI）のみ</strong>を使って、MySQL互換のDBサーバー（MariaDB）が動作するEC2インスタンスをゼロから手動構築するハンズオンを紹介します。</p>
<pre><code class="language-plaintext">インターネット
  ↓ SSH(22)              ← 自分のIPのみ
  ↓ MySQL(3306)          ← 自分のIPのみ（初期テスト用）
my-ec2-mysql-db-sg（DBサーバSG）
  ↓ MySQL(3306)          ← my-ec2-mysql-client-sg に属するEC2のみ ★SG参照
EC2インスタンス（DBサーバ）       EC2インスタンス（クライアント）
  └── MariaDB 10.5              └── mysqlコマンド（接続テスト用）
        └── sampledb（DB）             ↑
                           my-ec2-mysql-client-sg（クライアントSG）
                             ↓ SSH(22) ← 自分のIPのみ
                           インターネット</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li>セキュリティグループの <strong>SG参照（SG-to-SG）</strong> による EC2間通信制御</li>
<li>EC2サーバへの MariaDB（MySQL互換）インストールと初期設定</li>
<li>2台のEC2（DBサーバ + クライアント）を使った実際のDB接続確認</li>
<li>IPアドレス指定 vs SG参照の違いを体感</li>
</ul>
<p><strong>このハンズオンのポイント：</strong></p>
<p>DBサーバのMySQLポート（3306）を「特定のIPアドレス」ではなく「特定のセキュリティグループに属するEC2」だけに開放します。これが <strong>SG参照（SG-to-SG）</strong> と呼ばれる設定方法で、IPが変わっても自動的に制御できる、本番環境でも使われるセキュアな設計です。</p>
<hr>
<blockquote>
<p><strong>この記事は <a href="https://caymezon.com/aws-handson-cloudformation-ec2-mysql/">CloudFormation版ハンズオン</a> の比較記事です。</strong><br />コンソール操作でSG参照の仕組みを視覚的に学び、CloudFormationとの違いを比較したい方向けです。</p>
</blockquote>
<hr>
<p><!-- ![ハンズオン完成後のMySQL接続確認画面](images/ec2-mysql-top.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>EC2（Elastic Compute Cloud）</strong></td>
<td>AWSの仮想サーバーサービス。今回は2台（DBサーバ・クライアント）を起動する</td>
</tr>
<tr>
<td><strong>MariaDB</strong></td>
<td>MySQLから派生したオープンソースのデータベース。コマンド・構文・接続方法がMySQLと完全互換</td>
</tr>
<tr>
<td><strong>セキュリティグループ（SG）</strong></td>
<td>EC2への通信を制御するファイアウォール。今回は2つのSGを作成する</td>
</tr>
<tr>
<td><strong>SG参照（SG-to-SG）</strong></td>
<td>アクセス元としてIPアドレスではなく別のセキュリティグループを指定する設定。そのSGに属するEC2全体を対象にできる</td>
</tr>
<tr>
<td><strong>プライベートIPアドレス</strong></td>
<td>AWSのVPC内でのみ使用できるIPアドレス。EC2間の通信にはプライベートIPを使う</td>
</tr>
<tr>
<td><strong>UserData</strong></td>
<td>EC2の初回起動時のみ自動実行されるシェルスクリプト。今回はMariaDBのインストール・初期設定に使う</td>
</tr>
<tr>
<td><strong>IAMロール</strong></td>
<td>EC2にAWSサービスを利用する権限を付与する仕組み</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">IPアドレス指定 vs SG参照</span></h2>
<p>今回のハンズオンで学ぶ「SG参照」がなぜ重要かを確認します。</p>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>IP指定（前回まで）</th>
<th>SG参照（今回）</th>
</tr>
</thead>
<tbody>
<tr>
<td>アクセス元の指定方法</td>
<td><code>123.456.78.901/32</code>（IPアドレス）</td>
<td><code>sg-xxxxx</code>（セキュリティグループID）</td>
</tr>
<tr>
<td>対象</td>
<td>指定したIPのみ</td>
<td>そのSGに属するEC2全体</td>
</tr>
<tr>
<td>IPが変わった場合</td>
<td>設定変更が必要</td>
<td>自動的に制御（変更不要）</td>
</tr>
<tr>
<td>EC2を増やした場合</td>
<td>追加EC2のIPも個別に設定が必要</td>
<td>SGに追加するだけで自動的に許可</td>
</tr>
<tr>
<td>用途</td>
<td>自分のPCからの接続、外部サービスからの接続</td>
<td>APサーバ→DBサーバなどEC2間通信の制御</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc4">前フェーズとの比較</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>Phase 1-1 Apache</th>
<th>Phase 1-2 Tomcat</th>
<th>Phase 1-3 MySQL（今回）</th>
</tr>
</thead>
<tbody>
<tr>
<td>役割</td>
<td>Webサーバー</td>
<td>APサーバー</td>
<td>DBサーバー</td>
</tr>
<tr>
<td>ポート</td>
<td>80</td>
<td>8080</td>
<td>3306</td>
</tr>
<tr>
<td>SGのアクセス元</td>
<td>自分のIP</td>
<td>自分のIP</td>
<td><strong>クライアントSG参照</strong></td>
</tr>
<tr>
<td>EC2台数</td>
<td>1台</td>
<td>1台</td>
<td><strong>2台</strong>（DB + クライアント）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc5">使用するAWSサービス</span></h2>
<table>
<thead>
<tr>
<th>サービス</th>
<th>役割</th>
<th>料金</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>EC2 × 2台</strong></td>
<td>DBサーバ + クライアント（各t2.micro）</td>
<td>月750時間まで無料枠あり（2台で消費が倍）</td>
</tr>
<tr>
<td><strong>セキュリティグループ × 2</strong></td>
<td>DBサーバSG / クライアントSGのアクセス制御</td>
<td>無料</td>
</tr>
<tr>
<td><strong>IAM</strong></td>
<td>EC2へのSession Manager接続権限</td>
<td>無料</td>
</tr>
<tr>
<td><strong>EBS × 2</strong></td>
<td>EC2にアタッチされるストレージ（各8GB）</td>
<td>月30GBまで無料枠あり</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>注意</strong>: EC2を2台同時に稼働させるため、無料枠の消費が2倍になります。ハンズオン後は必ず2台とも削除してください。</p>
</blockquote>
<hr>
<h2><span id="toc6">構築するリソース</span></h2>
<table>
<thead>
<tr>
<th>リソース</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td>キーペア</td>
<td>SSH接続の認証鍵（DBサーバ・クライアント両方で使用）</td>
</tr>
<tr>
<td>IAMロール</td>
<td>EC2にSession Manager接続の権限を付与</td>
</tr>
<tr>
<td>クライアントSG</td>
<td>クライアントEC2（APサーバ役）に適用するSG</td>
</tr>
<tr>
<td>DBサーバSG</td>
<td>DBサーバEC2に適用するSG（クライアントSGを参照）</td>
</tr>
<tr>
<td>DBサーバEC2</td>
<td>MariaDBが動作するDBサーバ本体</td>
</tr>
<tr>
<td>クライアントEC2</td>
<td>mysqlコマンドでDB接続テストを行うEC2（APサーバ役）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc7">全体の作業順序</span></h2>
<p>依存関係があるため、必ずこの順番で作成します。</p>
<pre><code class="language-plaintext">⓪ 自分のIPアドレスを確認する（重要）
      ↓
① キーペアを作成する
      ↓
② IAMロールを作成する
      ↓
③ クライアントSGを作成する（先に作成する必要がある）
      ↓
④ DBサーバSGを作成する（③のSGを参照する）
      ↓
⑤ DBサーバEC2を起動する
      ↓
⑥ クライアントEC2を起動する
      ↓
⑦ 動作確認（DBサーバ・クライアント）
      ↓
⑧ リソースを削除する</code></pre>
<hr>
<h2><span id="toc8">【重要】⓪ 自分のIPアドレスを確認する</span></h2>
<p>セキュリティグループで自分のIPだけを許可するために、<strong>正確なIPアドレス</strong>を事前に確認します。</p>
<h3><span id="toc9">方法A: ルーター管理画面で確認（推奨）</span></h3>
<ol>
<li>ブラウザで以下のURLにアクセスします（ルーターによって異なります）
<pre><code class="language-plaintext">http://192.168.0.1  または  http://192.168.1.1</code></pre>
</li>
<li>「ネットワークマップ」または「インターネット」項目を開く</li>
<li>**「インターネットIPアドレス」または「WAN IPアドレス」**の値を控えます</li>
</ol>
<h3><span id="toc10">方法B: コマンドで確認</span></h3>
<pre><code class="language-cmd">curl https://checkip.amazonaws.com</code></pre>
<p><strong>控えておく情報</strong>: 自分のIPアドレス（例: <code>203.0.113.1</code>）</p>
<hr>
<h2><span id="toc11">① キーペアの作成</span></h2>
<p>DBサーバとクライアントEC2の両方のSSH接続に使います。1つのキーペアを共用します。</p>
<p><strong>AWSコンソール → EC2 → ネットワーク＆セキュリティ → キーペア → 「キーペアを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-ec2-mysql-key</code></td>
</tr>
<tr>
<td>キーペアのタイプ</td>
<td><strong>RSA</strong></td>
</tr>
<tr>
<td>プライベートキーファイル形式</td>
<td><strong>.pem</strong></td>
</tr>
</tbody>
</table>
<p>「キーペアを作成」をクリックすると <code>my-ec2-mysql-key.pem</code> がダウンロードされます。</p>
<pre><code class="language-plaintext">C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pem</code></pre>
<blockquote>
<p><strong>注意</strong>: <code>.pem</code> ファイルは<strong>再ダウンロードできません</strong>。紛失した場合は新しいキーペアを作成する必要があります。</p>
</blockquote>
<hr>
<h2><span id="toc12">② IAMロールの作成</span></h2>
<p><strong>AWSコンソール → IAM → ロール → 「ロールを作成」</strong></p>
<table>
<thead>
<tr>
<th>ステップ</th>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>信頼されたエンティティタイプ</td>
<td><strong>AWSのサービス</strong></td>
</tr>
<tr>
<td>1</td>
<td>ユースケース</td>
<td><strong>EC2</strong></td>
</tr>
<tr>
<td>2</td>
<td>許可ポリシー</td>
<td><code>AmazonSSMManagedInstanceCore</code></td>
</tr>
<tr>
<td>3</td>
<td>ロール名</td>
<td><code>my-ec2-mysql-role</code></td>
</tr>
</tbody>
</table>
<p>「ロールを作成」をクリック。</p>
<hr>
<h2><span id="toc13">③ クライアントSGの作成</span></h2>
<blockquote>
<p><strong>なぜ先に作るか</strong>: DBサーバSGの設定でクライアントSGを「参照先」として指定する必要があるため、先に作成しておく必要があります。</p>
</blockquote>
<p><strong>AWSコンソール → EC2 → セキュリティグループ → 「セキュリティグループを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>セキュリティグループ名</td>
<td><code>my-ec2-mysql-client-sg</code></td>
</tr>
<tr>
<td>説明</td>
<td><code>MySQL client SG (AP server role)</code></td>
</tr>
<tr>
<td>VPC</td>
<td>デフォルトVPC（変更不要）</td>
</tr>
</tbody>
</table>
<p><strong>インバウンドルール（「ルールを追加」）:</strong></p>
<table>
<thead>
<tr>
<th>タイプ</th>
<th>プロトコル</th>
<th>ポート</th>
<th>ソース</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>SSH</td>
<td>TCP</td>
<td>22</td>
<td><code>203.0.113.1/32</code>（自分のIP）</td>
<td>SSH from my IP</td>
</tr>
</tbody>
</table>
<p><strong>アウトバウンドルールを確認します:</strong></p>
<p>SG作成画面の「アウトバウンドルール」欄に以下のルールが<strong>自動設定されていること</strong>を確認します。</p>
<table>
<thead>
<tr>
<th>タイプ</th>
<th>送信先</th>
</tr>
</thead>
<tbody>
<tr>
<td>すべてのトラフィック</td>
<td><code>0.0.0.0/0</code></td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>重要</strong>: このアウトバウンドルールがないとEC2がインターネットに出られず、<code>dnf install</code> でパッケージをダウンロードできなくなります。自動設定されていない場合は「ルールを追加」で追加してください。</p>
</blockquote>
<p>「セキュリティグループを作成」をクリック。</p>
<p><!-- ![クライアントSG作成画面](images/client-sg-create.jpg) --></p>
<hr>
<h2><span id="toc14">④ DBサーバSGの作成（SG参照の設定）</span></h2>
<p><strong>AWSコンソール → EC2 → セキュリティグループ → 「セキュリティグループを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>セキュリティグループ名</td>
<td><code>my-ec2-mysql-db-sg</code></td>
</tr>
<tr>
<td>説明</td>
<td><code>MySQL DB server SG</code></td>
</tr>
<tr>
<td>VPC</td>
<td>デフォルトVPC（変更不要）</td>
</tr>
</tbody>
</table>
<p><strong>インバウンドルール（「ルールを追加」で3ルール追加します）:</strong></p>
<p><strong>ルール1: SSH（管理用）</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイプ</td>
<td>SSH</td>
</tr>
<tr>
<td>ソースタイプ</td>
<td>カスタム</td>
</tr>
<tr>
<td>ソース</td>
<td><code>203.0.113.1/32</code>（自分のIP）</td>
</tr>
</tbody>
</table>
<p><strong>ルール2: MySQL（クライアントSGからの接続）← このハンズオンの核心</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイプ</td>
<td>MySQL/Aurora</td>
</tr>
<tr>
<td>ソースタイプ</td>
<td><strong>カスタム</strong></td>
</tr>
<tr>
<td>ソース</td>
<td>検索ボックスに <code>my-ec2-mysql-client-sg</code> と入力して選択</td>
</tr>
<tr>
<td>説明</td>
<td><code>MySQL from client SG only</code></td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>ここがSG参照</strong>: ソースとして「IPアドレス」ではなく「セキュリティグループ」を指定しています。<code>my-ec2-mysql-client-sg</code> に属するEC2からのMySQL接続のみを許可し、インターネットからは接続できません。</p>
</blockquote>
<p><strong>ルール3: MySQL（自分のIPからの接続）← 初期テスト・確認用</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイプ</td>
<td>MySQL/Aurora</td>
</tr>
<tr>
<td>ソースタイプ</td>
<td>カスタム</td>
</tr>
<tr>
<td>ソース</td>
<td><code>203.0.113.1/32</code>（自分のIP）</td>
</tr>
<tr>
<td>説明</td>
<td><code>MySQL from my IP (for initial testing)</code></td>
</tr>
</tbody>
</table>
<p><strong>アウトバウンドルールを確認します:</strong></p>
<p>「アウトバウンドルール」欄に「すべてのトラフィック / 0.0.0.0/0」が設定されていることを確認します（クライアントSGと同様）。</p>
<p>「セキュリティグループを作成」をクリック。</p>
<p><!-- ![DBサーバSG作成画面 - SG参照の設定](images/db-sg-create.jpg) --></p>
<hr>
<h2><span id="toc15">⑤ DBサーバEC2の起動</span></h2>
<p><strong>AWSコンソール → EC2 → インスタンス → 「インスタンスを起動」</strong></p>
<h3><span id="toc16">5-1. 基本設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-ec2-mysql-db-instance</code></td>
</tr>
<tr>
<td>アプリケーションおよびOSイメージ</td>
<td><strong>Amazon Linux 2023 AMI</strong>（デフォルトで選択済み）</td>
</tr>
<tr>
<td>インスタンスタイプ</td>
<td><strong>t2.micro</strong>（無料枠対象）</td>
</tr>
<tr>
<td>キーペア</td>
<td><code>my-ec2-mysql-key</code></td>
</tr>
</tbody>
</table>
<h3><span id="toc17">5-2. セキュリティグループの設定</span></h3>
<p>「ネットワーク設定」→「<strong>既存のセキュリティグループを選択する</strong>」→ <code>my-ec2-mysql-db-sg</code> を選択します。</p>
<blockquote>
<p><strong>注意</strong>: 「セキュリティグループを作成する」ではなく「<strong>既存のセキュリティグループを選択する</strong>」を選びます。④で作成済みの <code>my-ec2-mysql-db-sg</code> を指定します。</p>
</blockquote>
<h3><span id="toc18">5-3. IAMロールの設定</span></h3>
<p>「高度な詳細」→「IAM インスタンスプロファイル」→ <code>my-ec2-mysql-role</code> を選択します。</p>
<h3><span id="toc19">5-4. UserDataの設定（MariaDBの自動インストール）</span></h3>
<p>「高度な詳細」の一番下「ユーザーデータ」に以下を貼り付けます。</p>
<pre><code class="language-bash">#!/bin/bash
dnf update -y
dnf install -y mariadb105-server mariadb105

systemctl start mariadb
systemctl enable mariadb

sudo mysql -u root &lt;&lt; 'SQLEOF'
SET PASSWORD FOR root@localhost = PASSWORD('Admin1234!');
CREATE USER IF NOT EXISTS 'handson'@'%' IDENTIFIED BY 'Handson1234!';
GRANT ALL PRIVILEGES ON *.* TO 'handson'@'%' WITH GRANT OPTION;
CREATE DATABASE IF NOT EXISTS sampledb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
FLUSH PRIVILEGES;
SQLEOF</code></pre>
<p><strong>各コマンドの説明:</strong></p>
<table>
<thead>
<tr>
<th>コマンド</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>dnf install -y mariadb105-server mariadb105</code></td>
<td>MariaDB サーバーとクライアントをインストール</td>
</tr>
<tr>
<td><code>systemctl start mariadb</code></td>
<td>MariaDBを起動</td>
</tr>
<tr>
<td><code>systemctl enable mariadb</code></td>
<td>OS起動時にMariaDBが自動起動するよう設定</td>
</tr>
<tr>
<td><code>SET PASSWORD FOR root@localhost</code></td>
<td>rootパスワードを設定（<code>Admin1234!</code>）</td>
</tr>
<tr>
<td><code>CREATE USER &#39;handson&#39;@&#39;%&#39;</code></td>
<td>どのホストからでも接続できるユーザーを作成（<code>%</code>は任意のホスト）</td>
</tr>
<tr>
<td><code>GRANT ALL PRIVILEGES ON *.*</code></td>
<td>handsonユーザーに全権限を付与</td>
</tr>
<tr>
<td><code>CREATE DATABASE sampledb</code></td>
<td>動作確認用のデータベースを作成</td>
</tr>
<tr>
<td><code>FLUSH PRIVILEGES</code></td>
<td>権限設定を即時反映</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong><code>sudo mysql -u root</code> について</strong>: MariaDB インストール直後の root は unix_socket 認証（OSのrootユーザーとして接続）が有効になっています。<code>-p</code> でパスワードを指定すると <code>ERROR 1698 Access denied</code> になるため、初回設定は <code>sudo mysql -u root</code>（パスワードなし）で接続します。</p>
</blockquote>
<blockquote>
<p><strong>パスワードについて</strong>: このハンズオンでは学習用として <code>Admin1234!</code> / <code>Handson1234!</code> を使用しています。本番環境では必ず強力なパスワードに変更してください。</p>
</blockquote>
<h3><span id="toc20">5-5. インスタンスを起動する</span></h3>
<p>「インスタンスを起動」をクリック。<strong>起動後2〜3分待ちます</strong>。</p>
<p><strong>控えておく情報:</strong></p>
<ul>
<li>DBサーバのパブリックIPアドレス</li>
<li>DBサーバの<strong>プライベートIPアドレス</strong>（クライアントEC2からの接続に使用）</li>
</ul>
<p>インスタンス詳細 → 「プライベート IPv4 アドレス」を確認してメモします。</p>
<p><!-- ![DBサーバEC2起動後の画面](images/db-ec2-running.jpg) --></p>
<hr>
<h2><span id="toc21">⑥ クライアントEC2の起動</span></h2>
<p><strong>AWSコンソール → EC2 → インスタンス → 「インスタンスを起動」</strong></p>
<h3><span id="toc22">6-1. 基本設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-ec2-mysql-client-instance</code></td>
</tr>
<tr>
<td>アプリケーションおよびOSイメージ</td>
<td><strong>Amazon Linux 2023 AMI</strong></td>
</tr>
<tr>
<td>インスタンスタイプ</td>
<td><strong>t2.micro</strong></td>
</tr>
<tr>
<td>キーペア</td>
<td><code>my-ec2-mysql-key</code></td>
</tr>
</tbody>
</table>
<h3><span id="toc23">6-2. セキュリティグループの設定</span></h3>
<p>「ネットワーク設定」→「<strong>既存のセキュリティグループを選択する</strong>」→ <code>my-ec2-mysql-client-sg</code> を選択します。</p>
<h3><span id="toc24">6-3. IAMロールの設定</span></h3>
<p>「高度な詳細」→「IAM インスタンスプロファイル」→ <code>my-ec2-mysql-role</code> を選択します。</p>
<h3><span id="toc25">6-4. UserDataの設定（mysqlクライアントのインストール）</span></h3>
<pre><code class="language-bash">#!/bin/bash
dnf update -y
dnf install -y mariadb105</code></pre>
<blockquote>
<p>mysqlコマンド（クライアントツール）のみをインストールします。DBサーバ機能（<code>mariadb105-server</code>）はインストールしません。</p>
</blockquote>
<h3><span id="toc26">6-5. インスタンスを起動する</span></h3>
<p>「インスタンスを起動」をクリック。起動完了まで約2〜3分待ちます。</p>
<p><strong>控えておく情報:</strong> クライアントEC2のパブリックIPアドレス</p>
<p><!-- ![クライアントEC2起動後の画面](images/client-ec2-running.jpg) --></p>
<hr>
<h2><span id="toc27">⑦ 動作確認</span></h2>
<h3><span id="toc28">7-1. DBサーバの動作確認</span></h3>
<p>DBサーバにSSH接続します。</p>
<pre><code class="language-cmd">ssh -i C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pem ec2-user@（DBサーバのパブリックIP）</code></pre>
<p>接続後に以下を実行します。</p>
<pre><code class="language-bash">sudo systemctl status mariadb

# MariaDBのバージョン確認
mysql --version

# rootでログイン（パスワード: Admin1234!）
mysql -u root -pAdmin1234!</code></pre>
<p>MariaDBのプロンプト（<code>MariaDB [(none)]&gt;</code>）が表示されたら以下を実行します。</p>
<pre><code class="language-sql">-- ユーザー一覧を確認
SELECT User, Host FROM mysql.user;

-- データベース一覧を確認（sampledb が存在することを確認）
SHOW DATABASES;

-- sampledbに接続
USE sampledb;

-- テスト用のテーブルを作成
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- データを挿入
INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');

-- データを確認
SELECT * FROM users;

-- MariaDBから切断
EXIT;</code></pre>
<p>DBサーバから切断します。</p>
<pre><code class="language-bash">exit</code></pre>
<h3><span id="toc29">7-2. SG参照の確認：クライアントEC2からMySQL接続</span></h3>
<p>クライアントEC2に接続します。</p>
<pre><code class="language-cmd">ssh -i C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pem ec2-user@（クライアントのパブリックIP）</code></pre>
<p>クライアントEC2からDBサーバのプライベートIPに向けてMySQL接続します。</p>
<pre><code class="language-bash"># DBサーバのプライベートIPに接続（XXX.XXX.XXX.XXX はDBサーバのプライベートIP）
mysql -h XXX.XXX.XXX.XXX -u handson -pHandson1234! sampledb</code></pre>
<p>接続成功すると <code>MariaDB [sampledb]&gt;</code> が表示されます。</p>
<pre><code class="language-sql">-- DBサーバで作成したデータが見えることを確認
SELECT * FROM users;

EXIT;</code></pre>
<pre><code class="language-bash">exit</code></pre>
<blockquote>
<p><strong>プライベートIPを使う理由</strong>: EC2間の通信は同じVPC内なのでプライベートIPで通信できます。パブリックIPを使うとインターネットを経由してしまい、セキュリティ上も効率上も好ましくありません。</p>
</blockquote>
<p><!-- ![クライアントEC2からのMySQL接続確認](images/client-mysql-connect.jpg) --></p>
<h3><span id="toc30">7-3. SG参照の効果を確認する（任意・スキップ可）</span></h3>
<blockquote>
<p><strong>前提</strong>: ローカルPCに <code>mysql</code> クライアントがインストールされている場合のみ実施します。7-2でクライアントEC2からの接続が成功していれば、このハンズオンの学習目的（SG参照によるEC2間通信制御）は達成済みです。</p>
</blockquote>
<p>ローカルPCに <code>mysql</code> コマンドがある場合、ローカルターミナルで以下を実行します。</p>
<pre><code class="language-cmd">mysql -h （DBサーバのパブリックIP） -u handson -pHandson1234! sampledb</code></pre>
<blockquote>
<p><strong>補足</strong>: 今回のSGにはルール3（自分のIPからのMySQL許可）を追加しているため接続できます。ルール3を削除すると、インターネットからの接続は完全に遮断されます。本番環境では<strong>ルール3を削除</strong>し、クライアントSG参照のみにするのがベストプラクティスです。</p>
</blockquote>
<hr>
<h2><span id="toc31">⑧ リソースの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ず削除してください。削除する順番が重要です。</strong></p>
<h3><span id="toc32">1. EC2インスタンスを終了する（2台）</span></h3>
<p><strong>EC2 → インスタンス → <code>my-ec2-mysql-db-instance</code> と <code>my-ec2-mysql-client-instance</code> を両方選択 → 「インスタンスの状態」→「インスタンスを終了」</strong></p>
<p>状態が「終了済み」になるまで待ちます（2〜5分）。</p>
<h3><span id="toc33">2. セキュリティグループを削除する（2つ）</span></h3>
<blockquote>
<p><strong>注意</strong>: 先にDBサーバSGを削除します。クライアントSGはDBサーバSGから参照されているため、先にDBサーバSGを削除しないとエラーになります。</p>
</blockquote>
<p><strong>① DBサーバSGを先に削除します:</strong></p>
<p><strong>EC2 → セキュリティグループ → <code>my-ec2-mysql-db-sg</code> を選択 → 「アクション」→「セキュリティグループを削除」</strong></p>
<p><strong>② クライアントSGを削除します:</strong></p>
<p><strong>EC2 → セキュリティグループ → <code>my-ec2-mysql-client-sg</code> を選択 → 「アクション」→「セキュリティグループを削除」</strong></p>
<h3><span id="toc34">3. IAMロールを削除する</span></h3>
<p><strong>IAM → ロール → <code>my-ec2-mysql-role</code> を選択 → 「削除」→ ロール名を入力して確認</strong></p>
<h3><span id="toc35">4. キーペアを削除する（任意）</span></h3>
<p><strong>EC2 → キーペア → <code>my-ec2-mysql-key</code> を選択 → 「アクション」→「削除」</strong></p>
<p>ローカルの <code>.pem</code> ファイルも手動で削除します。</p>
<pre><code class="language-plaintext">C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pem</code></pre>
<hr>
<h2><span id="toc36">CloudFormation版との比較</span></h2>
<p>コンソール版を体験したら、次は同じ構成をCloudFormation（コード）で再現してみましょう。特にSGの依存関係管理が自動化される点を体験できます。</p>
<table>
<thead>
<tr>
<th>作業</th>
<th>コンソール（手動）</th>
<th>CloudFormation</th>
</tr>
</thead>
<tbody>
<tr>
<td>SG×2台の作成（依存関係あり）</td>
<td>順序を意識して個別に手動作成</td>
<td>template.yaml に定義済み（順序自動管理）</td>
</tr>
<tr>
<td>EC2×2台の起動</td>
<td>2回インスタンス起動操作</td>
<td>コマンド1本（並列作成）</td>
</tr>
<tr>
<td>SG削除（依存関係あり）</td>
<td>DBサーバSG → クライアントSGの順で手動管理</td>
<td><code>delete-stack</code> 1本（自動解決）</td>
</tr>
<tr>
<td>再現性</td>
<td>低い</td>
<td>高い</td>
</tr>
<tr>
<td>バージョン管理</td>
<td>不可</td>
<td>Gitで管理可能</td>
</tr>
</tbody>
</table>
<p><strong>コンソール版で実感できたポイント:</strong></p>
<ul>
<li>SGを削除する際にDBサーバSG → クライアントSGの順番が必要なことを体験できる</li>
<li>SG参照の設定でソースにIPではなくSGを指定する操作の意味が視覚的に理解できる</li>
<li>プライベートIPで通信している様子を直接確認できる</li>
</ul>
<p><strong>CloudFormation版でも試してみる</strong>: <a href="https://caymezon.com/aws-handson-cloudformation-ec2-mysql/">EC2サーバ構築をIaC化：CloudFormationでEC2 MySQLのDBサーバを自動デプロイする手順</a></p>
<hr>
<h2><span id="toc37">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>クライアントEC2からMySQLに接続できない</td>
<td>DBサーバSGのSG参照ルールが正しく設定されていない</td>
<td>SGのインバウンドルールでMySQL(3306)のソースが <code>my-ec2-mysql-client-sg</code> になっているか確認</td>
</tr>
<tr>
<td>クライアントEC2からMySQLに接続できない</td>
<td>クライアントEC2が <code>my-ec2-mysql-client-sg</code> に属していない</td>
<td>クライアントEC2のセキュリティグループを確認</td>
</tr>
<tr>
<td><code>ERROR 2003: Can&#39;t connect to MySQL server</code></td>
<td>プライベートIPではなくパブリックIPを指定している</td>
<td>DBサーバの<strong>プライベートIPアドレス</strong>を指定する</td>
</tr>
<tr>
<td>MariaDBに接続できない（DBサーバ内）</td>
<td>UserDataのインストールが完了していない</td>
<td><code>sudo cat /var/log/cloud-init-output.log</code> でインストール状況を確認</td>
</tr>
<tr>
<td><code>Access denied for user &#39;handson&#39;</code></td>
<td>パスワードが違うorユーザーが作成されていない</td>
<td>rootでログインして <code>SELECT User,Host FROM mysql.user;</code> で確認</td>
</tr>
<tr>
<td>SGが削除できない（依存関係エラー）</td>
<td>クライアントSGをDBサーバSGより先に削除しようとしている</td>
<td><strong>DBサーバSG（<code>my-ec2-mysql-db-sg</code>）を先に削除</strong>してからクライアントSGを削除する</td>
</tr>
<tr>
<td>EC2インスタンスが「使用中」でSGを削除できない</td>
<td>インスタンスがまだ終了していない</td>
<td>インスタンス「終了済み」になってから再試行</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc38">まとめ</span></h2>
<p>今回のハンズオンで体験できたこと：</p>
<table>
<thead>
<tr>
<th>確認項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>SG参照の設定</strong></td>
<td>DBサーバSGのMySQL(3306)ルールのソースにクライアントSGを指定</td>
</tr>
<tr>
<td><strong>MariaDBのセットアップ</strong></td>
<td>UserDataでインストール・起動・ユーザー作成・DB作成を自動化</td>
</tr>
<tr>
<td><strong>EC2間通信の確認</strong></td>
<td>クライアントEC2からプライベートIPを使ってDBサーバに接続</td>
</tr>
<tr>
<td><strong>SG削除の依存関係</strong></td>
<td>DBサーバSG → クライアントSGの順番で削除する必要があることを体験</td>
</tr>
<tr>
<td><strong>2台のリソース管理</strong></td>
<td>EC2とSGをそれぞれ2つ管理する手間を体験（CloudFormationの必要性を実感）</td>
</tr>
</tbody>
</table>
<p>SG参照を手動で設定・確認することで、CloudFormationが裏で何を自動化しているかが理解できます。ぜひ次は <a href="https://caymezon.com/aws-handson-cloudformation-ec2-mysql/">CloudFormation版</a> で同じ構成をコードで再現してみてください。</p>
<hr>
<h2><span id="toc39">関連記事</span></h2>
<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運用入門 改訂第2版 押さえておきたいAWSの基本と運用ノウハウ [AWS深掘りガイド]","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51AAOubymTL._SL500_.jpg","\/51VMG6YKHdL._SL500_.jpg","\/41EdPB8azAL._SL500_.jpg","\/41v2JFE-9jL._SL500_.jpg","\/41FEEqR-yDL._SL500_.jpg","\/41JfZAdnTPL._SL500_.jpg","\/41vGK0czQrL._SL500_.jpg","\/41-SnYtz2aL._SL500_.jpg","\/41sPrV5fi3L._SL500_.jpg","\/41p7JtvYJ1L._SL500_.jpg","\/4169GVNTs8L._SL500_.jpg","\/41BPI5HP3zL._SL500_.jpg","\/41QOyk60CYL._SL500_.jpg","\/41APjk6FphL._SL500_.jpg","\/41ezKUu7VRL._SL500_.jpg","\/41A1n3K+r5L._SL500_.jpg","\/41aY2T8lEOL._SL500_.jpg","\/419Ca1V6HZL._SL500_.jpg","\/41zQkYyLPzL._SL500_.jpg","\/41YpHcyxiTL._SL500_.jpg","\/41-tKN5mt6L._SL500_.jpg","\/419Mv6m55IL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815631085","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\/4815631085","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D\/","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"E8MM1","s":"s"});</script></p>
<div id="msmaflink-E8MM1">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --> --></p><p>The post <a href="https://caymezon.com/aws-handson-console-ec2-mysql/">EC2サーバ構築ハンズオン：AWSコンソールでEC2 MySQLのDBサーバを構築する手順【SG参照 / CloudFormation版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-console-ec2-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>EC2サーバ構築をIaC化：CloudFormationでEC2 MySQLのDBサーバを自動デプロイする手順【SG参照 / コンソール版との比較付き】</title>
		<link>https://caymezon.com/aws-handson-cloudformation-ec2-mysql/</link>
					<comments>https://caymezon.com/aws-handson-cloudformation-ec2-mysql/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sun, 29 Mar 2026 07:32:34 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWSCLI]]></category>
		<category><![CDATA[CloudFormation]]></category>
		<category><![CDATA[DBサーバー]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[ec2サーバ構築]]></category>
		<category><![CDATA[IaC]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[SG参照]]></category>
		<category><![CDATA[UserData]]></category>
		<category><![CDATA[セキュリティグループ]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20317</guid>

					<description><![CDATA[<p>はじめに 「コンソールで手動構築したSG参照の構成を、コードで再現したい」——それを実現するのが AWS CloudFormation です。 この記事では、template.yaml 1ファイルにリソース構成を定義し、 [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-cloudformation-ec2-mysql/">EC2サーバ構築をIaC化：CloudFormationでEC2 MySQLのDBサーバを自動デプロイする手順【SG参照 / コンソール版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>「コンソールで手動構築したSG参照の構成を、コードで再現したい」——それを実現するのが <strong>AWS CloudFormation</strong> です。</p>
<p>この記事では、<code>template.yaml</code> 1ファイルにリソース構成を定義し、<strong>コマンド1本でEC2 MySQL（MariaDB）環境を一括構築するハンズオン</strong>を紹介します。コンソール版（<a href="https://caymezon.com/aws-handson-console-ec2-mysql/">AWSコンソール版ハンズオン</a>）と全く同じ構成を、CloudFormationで自動化します。</p>
<pre><code class="language-plaintext">ローカル環境（VSCode）
  └── template.yaml + AWS CLI
        ↓ スタック作成（コマンド1本）
AWS環境
  ├── IAMロール（SSM接続用）
  ├── ClientSecurityGroup（クライアントSG）
  │     └── 適用先: クライアントEC2
  ├── DBSecurityGroup（DBサーバSG）
  │     ├── MySQL(3306) ← ClientSecurityGroup を参照  ★SG参照
  │     └── 適用先: DBサーバEC2
  ├── DBサーバEC2（MariaDB）
  └── クライアントEC2（mysqlコマンド）</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li>SG参照（SG-to-SG）を <code>SourceSecurityGroupId</code> でtemplate.yamlに記述する方法</li>
<li>2台のEC2・2つのSGを <code>template.yaml</code> 1ファイルで一括管理</li>
<li><code>aws cloudformation create-stack</code> コマンド1本での全リソース一括デプロイ</li>
<li><code>delete-stack</code> によるSGの依存関係を自動解決した一括削除</li>
</ul>
<p><strong>このハンズオンの特徴：</strong></p>
<ul>
<li>コンソール版では順番を意識しながら手動で作成・削除していたSGの依存関係を、CloudFormationが自動管理</li>
<li>2台分のEC2を並列で起動するため、コンソール版より短時間で構築完了</li>
</ul>
<hr>
<p><!-- ![CloudFormationスタック作成完了画面](images/cfn-create-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">CloudFormation vs コンソール：どれだけ違うか</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>CloudFormation</th>
<th>コンソール（手動）</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>SG×2台の作成</strong></td>
<td>template.yamlに定義（順序自動管理）</td>
<td>クライアントSG → DBサーバSGの順で手動作成</td>
</tr>
<tr>
<td><strong>EC2×2台の起動</strong></td>
<td>コマンド1本（並列作成）</td>
<td>2回インスタンス起動操作</td>
</tr>
<tr>
<td><strong>SG削除（依存関係あり）</strong></td>
<td><code>delete-stack</code> 1本（自動解決）</td>
<td>DBサーバSG → クライアントSGの順で手動管理</td>
</tr>
<tr>
<td><strong>全リソースのデプロイ</strong></td>
<td>コマンド1本（5〜8分）</td>
<td>複数画面を行き来（20〜30分）</td>
</tr>
<tr>
<td><strong>再現性</strong></td>
<td>高い（同じ構成を何度でも再現可能）</td>
<td>低い（手順ミスのリスク大）</td>
</tr>
<tr>
<td><strong>バージョン管理</strong></td>
<td>Gitで管理可能</td>
<td>不可</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">キーワード解説</span></h2>
<table>
<thead>
<tr>
<th>用語</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>CloudFormation</strong></td>
<td>AWSが提供するIaC（Infrastructure as Code）サービス。YAMLテンプレートでリソースをコード化する</td>
</tr>
<tr>
<td><strong>スタック</strong></td>
<td>CloudFormationが管理するリソースのまとまり。今回はEC2×2・SG×2・IAMロールを1スタックで管理</td>
</tr>
<tr>
<td><strong>SG参照（SG-to-SG）</strong></td>
<td>セキュリティグループのルールで、アクセス元として別のSGを指定する設定</td>
</tr>
<tr>
<td><strong><code>SourceSecurityGroupId</code></strong></td>
<td>CloudFormationでSG参照を設定するプロパティ。<code>!GetAtt ClientSecurityGroup.GroupId</code> でSGのIDを取得して指定する</td>
</tr>
<tr>
<td><strong><code>!GetAtt</code></strong></td>
<td>CloudFormation組み込み関数。リソースの属性値を取得する</td>
</tr>
<tr>
<td><strong>プライベートIP</strong></td>
<td>VPC内でのみ使用できるIPアドレス。EC2間の通信に使う</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc4">前提条件</span></h2>
<table>
<thead>
<tr>
<th>ツール</th>
<th>確認コマンド</th>
<th>最低バージョン目安</th>
</tr>
</thead>
<tbody>
<tr>
<td>AWS CLI v2</td>
<td><code>aws --version</code></td>
<td>2.x</td>
</tr>
<tr>
<td>Git</td>
<td><code>git --version</code></td>
<td>2.x</td>
</tr>
<tr>
<td>VSCode</td>
<td>-</td>
<td>-</td>
</tr>
</tbody>
</table>
<p>AWS認証確認:</p>
<pre><code class="language-cmd">aws sts get-caller-identity</code></pre>
<p>アカウントIDが表示されれば認証設定済みです。</p>
<hr>
<h2><span id="toc5">template.yaml の全文</span></h2>
<p>以下が今回使用する <code>template.yaml</code> の全文です。プロジェクトフォルダ（<code>ec2-mysql-db/</code>）直下に配置します。</p>
<blockquote>
<p><strong>⚠️ コピー前に確認</strong>: <code>Default: &#39;123.456.78.901/32&#39;</code> の箇所は<strong>ダミーIPです</strong>。このまま使うとスタック作成は成功しますが、SSHもMySQLもアクセスできません。<code>--parameters</code> でIPを上書きするか（推奨）、Defaultを自分のIPに書き換えてから使ってください。</p>
</blockquote>
<pre><code class="language-yaml">AWSTemplateFormatVersion: '2010-09-09'
Description: 'EC2 + MySQL (MariaDB) DB Server Hands-on (Phase 1-3) - SG-to-SG inter-EC2 communication control'

Parameters:
  KeyName:
    Type: String
    Default: 'my-ec2-mysql-key'
    Description: Name of an existing EC2 KeyPair

  MyIP:
    Type: String
    Default: '123.456.78.901/32'
    Description: Your IP address to allow SSH and MySQL access (CIDR format e.g. 203.0.113.1/32)

Resources:
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: 'my-ec2-mysql-role'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Tags:
        - Key: Name
          Value: 'my-ec2-mysql-role'

  # Instance Profile: wrapper that attaches the IAM role to EC2
  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: 'my-ec2-mysql-profile'
      Roles:
        - !Ref EC2Role

  # Client Security Group: attached to the AP server (client side)
  # The DB server SG references this SG to allow MySQL access only from this group
  ClientSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'my MySQL client SG (AP server role)'
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref MyIP
          Description: SSH from my IP
      Tags:
        - Key: Name
          Value: 'my-ec2-mysql-client-sg'

  # DB Server Security Group: allows MySQL ONLY from the client SG (not from the internet)
  # This is the key concept of SG-to-SG inter-EC2 communication control
  DBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'my MySQL DB server SG'
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref MyIP
          Description: SSH from my IP (admin only)
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          SourceSecurityGroupId: !GetAtt ClientSecurityGroup.GroupId
          Description: MySQL from client SG only (EC2-to-EC2 control - NOT open to internet)
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          CidrIp: !Ref MyIP
          Description: MySQL from my IP (for initial testing from local)
      Tags:
        - Key: Name
          Value: 'my-ec2-mysql-db-sg'

  # DB Server EC2: MariaDB (MySQL compatible) installed via UserData
  DBInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}'
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      SecurityGroupIds:
        - !Ref DBSecurityGroup
      IamInstanceProfile: !Ref EC2InstanceProfile
      # UserData: install MariaDB and configure initial users and database
      UserData:
        Fn::Base64: |
          #!/bin/bash
          dnf update -y
          dnf install -y mariadb105-server mariadb105

          systemctl start mariadb
          systemctl enable mariadb

          sudo mysql -u root &lt;&lt; 'SQLEOF'
          SET PASSWORD FOR root@localhost = PASSWORD('Admin1234!');
          CREATE USER IF NOT EXISTS 'handson'@'%' IDENTIFIED BY 'Handson1234!';
          GRANT ALL PRIVILEGES ON *.* TO 'handson'@'%' WITH GRANT OPTION;
          CREATE DATABASE IF NOT EXISTS sampledb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
          FLUSH PRIVILEGES;
          SQLEOF
      Tags:
        - Key: Name
          Value: 'my-ec2-mysql-db-instance'

  # Client EC2: represents the AP server - has mysql client installed to test DB connection
  ClientInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}'
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      SecurityGroupIds:
        - !Ref ClientSecurityGroup
      IamInstanceProfile: !Ref EC2InstanceProfile
      # UserData: install mysql client only (no server)
      UserData:
        Fn::Base64: |
          #!/bin/bash
          dnf update -y
          dnf install -y mariadb105
      Tags:
        - Key: Name
          Value: 'my-ec2-mysql-client-instance'

Outputs:
  DBInstanceId:
    Description: DB server EC2 Instance ID
    Value: !Ref DBInstance

  DBPublicIP:
    Description: DB server public IP (SSH access for admin)
    Value: !GetAtt DBInstance.PublicIp

  DBPrivateIP:
    Description: DB server private IP (use this to connect from client EC2)
    Value: !GetAtt DBInstance.PrivateIp

  ClientInstanceId:
    Description: Client EC2 Instance ID
    Value: !Ref ClientInstance

  ClientPublicIP:
    Description: Client EC2 public IP (SSH to test DB connection)
    Value: !GetAtt ClientInstance.PublicIp

  DBSSHCommand:
    Description: SSH command to connect to DB server
    Value: !Sub 'ssh -i C:\Users\username\.ssh\${KeyName}.pem ec2-user@${DBInstance.PublicIp}'

  ClientSSHCommand:
    Description: SSH command to connect to client EC2
    Value: !Sub 'ssh -i C:\Users\username\.ssh\${KeyName}.pem ec2-user@${ClientInstance.PublicIp}'

  MySQLConnectCommand:
    Description: MySQL connect command (run this from client EC2)
    Value: !Sub 'mysql -h ${DBInstance.PrivateIp} -u handson -pHandson1234! sampledb'</code></pre>
<p><strong>SG参照の書き方：IPアドレス指定との違い:</strong></p>
<pre><code class="language-yaml">SecurityGroupIngress:

  # 通常のIPアドレス指定（前回までのやり方）
  - IpProtocol: tcp
    FromPort: 22
    ToPort: 22
    CidrIp: !Ref MyIP           # ← IPアドレスを指定

  # SG参照（このハンズオンの核心）
  - IpProtocol: tcp
    FromPort: 3306
    ToPort: 3306
    SourceSecurityGroupId: !GetAtt ClientSecurityGroup.GroupId  # ← SGのIDを取得
    Description: MySQL from client SG only (EC2-to-EC2 control)</code></pre>
<table>
<thead>
<tr>
<th>方法</th>
<th>指定するもの</th>
<th>特徴</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CidrIp</code></td>
<td>IPアドレス（<code>/32</code> など）</td>
<td>IPが変わると設定変更が必要</td>
</tr>
<tr>
<td><code>SourceSecurityGroupId</code></td>
<td>セキュリティグループID</td>
<td>そのSGに属するEC2全体を対象にできる</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong><code>!Ref</code> vs <code>!GetAtt ... .GroupId</code> の違い</strong>: <code>VpcId</code> を明示していないSGに対して <code>!Ref</code> するとSGの<strong>名前</strong>が返るため <code>SourceSecurityGroupId</code>（IDを期待）でエラーになります。<code>!GetAtt ClientSecurityGroup.GroupId</code> を使うことで常にSGの<strong>ID</strong>（<code>sg-xxx</code>）を確実に取得できます。</p>
</blockquote>
<p><strong>構築されるリソースと論理ID:</strong></p>
<table>
<thead>
<tr>
<th>リソース</th>
<th>template.yaml上の論理ID</th>
</tr>
</thead>
<tbody>
<tr>
<td>IAMロール</td>
<td><code>EC2Role</code></td>
</tr>
<tr>
<td>インスタンスプロファイル</td>
<td><code>EC2InstanceProfile</code></td>
</tr>
<tr>
<td>クライアントSG</td>
<td><code>ClientSecurityGroup</code></td>
</tr>
<tr>
<td>DBサーバSG</td>
<td><code>DBSecurityGroup</code></td>
</tr>
<tr>
<td>DBサーバEC2</td>
<td><code>DBInstance</code></td>
</tr>
<tr>
<td>クライアントEC2</td>
<td><code>ClientInstance</code></td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc6">作業順序</span></h2>
<pre><code class="language-plaintext">⓪ 自分のIPアドレスを確認する
      ↓
① キーペアを作成する（コンソールで実施）
      ↓
② プロジェクトフォルダに移動する
      ↓
③ スタックを作成する（aws cloudformation create-stack）
      ↓
④ 作成完了・Outputsを確認する
      ↓
⑤ 動作確認（MariaDB・SG参照の確認）
      ↓
⑥ スタックを削除する（aws cloudformation delete-stack）</code></pre>
<hr>
<h2><span id="toc7">⓪ 自分のIPアドレスを確認する</span></h2>
<pre><code class="language-cmd">curl https://checkip.amazonaws.com</code></pre>
<p>またはルーター管理画面（<code>http://192.168.0.1</code> など）の「WAN IPアドレス」で確認します。</p>
<p><strong>控えておく情報</strong>: 自分のIPアドレス（例: <code>203.0.113.1</code>）</p>
<hr>
<h2><span id="toc8">① キーペアの作成（コンソールで実施）</span></h2>
<p>キーペアのみコンソールで作成します。CloudFormationではキーペアのダウンロードが行えないためです。</p>
<p><strong>AWSコンソール → EC2 → キーペア → 「キーペアを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-ec2-mysql-key</code></td>
</tr>
<tr>
<td>キーペアのタイプ</td>
<td><strong>RSA</strong></td>
</tr>
<tr>
<td>プライベートキーファイル形式</td>
<td><strong>.pem</strong></td>
</tr>
</tbody>
</table>
<p>ダウンロードされた <code>my-ec2-mysql-key.pem</code> を保存します。</p>
<pre><code class="language-plaintext">C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pem</code></pre>
<hr>
<h2><span id="toc9">② プロジェクトフォルダに移動する</span></h2>
<p>VSCodeのターミナル（CMD）を開き、プロジェクトフォルダに移動します。</p>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\ec2-mysql-db</code></pre>
<p><code>template.yaml</code> があることを確認します。</p>
<pre><code class="language-cmd">dir template.yaml</code></pre>
<hr>
<h2><span id="toc10">③ スタックの作成</span></h2>
<p>以下のコマンドを実行します。<code>203.0.113.1</code> は⓪で確認した自分のIPアドレスに置き換えてください。</p>
<pre><code class="language-cmd">aws cloudformation create-stack ^
  --stack-name my-ec2-mysql-stack ^
  --template-body file://template.yaml ^
  --region ap-northeast-1 ^
  --capabilities CAPABILITY_NAMED_IAM ^
  --parameters ^
    ParameterKey=KeyName,ParameterValue=my-ec2-mysql-key ^
    ParameterKey=MyIP,ParameterValue=203.0.113.1/32</code></pre>
<p><strong>各オプションの説明:</strong></p>
<table>
<thead>
<tr>
<th>オプション</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>--stack-name my-ec2-mysql-stack</code></td>
<td>スタック名（英字始まり）</td>
</tr>
<tr>
<td><code>--template-body file://template.yaml</code></td>
<td>使用するテンプレートファイル</td>
</tr>
<tr>
<td><code>--region ap-northeast-1</code></td>
<td>デプロイ先リージョン（東京）</td>
</tr>
<tr>
<td><code>--capabilities CAPABILITY_NAMED_IAM</code></td>
<td>名前付きIAMロール作成の明示的な許可</td>
</tr>
<tr>
<td><code>--parameters ...</code></td>
<td>テンプレートのParametersに渡す値</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong><code>^</code> について</strong>: Windowsのコマンドプロンプトで長いコマンドを複数行に分けるための改行エスケープ文字です。</p>
</blockquote>
<p>成功すると以下のようなStackIdが表示されます。</p>
<pre><code class="language-json">{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/my-ec2-mysql-stack/xxxxx"
}</code></pre>
<p><!-- ![スタック作成コマンドの実行結果](images/cfn-create-stack-cmd.jpg) --></p>
<hr>
<h2><span id="toc11">④ 作成完了・Outputsの確認</span></h2>
<p>スタック作成は完了まで<strong>約5〜8分</strong>かかります（EC2×2台の起動 + MariaDBインストールの時間）。</p>
<h3><span id="toc12">作成状況の確認</span></h3>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-mysql-stack ^
  --query "Stacks[0].StackStatus" ^
  --output text</code></pre>
<table>
<thead>
<tr>
<th>ステータス</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CREATE_IN_PROGRESS</code></td>
<td>作成中（しばらく待つ）</td>
</tr>
<tr>
<td><code>CREATE_COMPLETE</code></td>
<td>作成完了</td>
</tr>
<tr>
<td><code>CREATE_FAILED</code></td>
<td>作成失敗（トラブルシューティングを参照）</td>
</tr>
<tr>
<td><code>ROLLBACK_COMPLETE</code></td>
<td>失敗してロールバック完了</td>
</tr>
</tbody>
</table>
<h3><span id="toc13">Outputs（接続情報）の確認</span></h3>
<p><code>CREATE_COMPLETE</code> になったら以下を実行します。</p>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-mysql-stack ^
  --query "Stacks[0].Outputs" ^
  --output table</code></pre>
<p>以下のような出力が表示されます。</p>
<pre><code class="language-plaintext">---------------------------------------------------------------------------------------
|                                   DescribeStacks                                    |
+---------------------+---------------------------------------------------------------+
|  OutputKey          |  OutputValue                                                  |
+---------------------+---------------------------------------------------------------+
|  DBInstanceId       |  i-0xxxxxxxxxxxxxxx1                                         |
|  DBPublicIP         |  x.x.x.x                                                     |
|  DBPrivateIP        |  172.31.x.x      ← クライアントEC2からの接続に使用            |
|  ClientInstanceId   |  i-0xxxxxxxxxxxxxxx2                                         |
|  ClientPublicIP     |  y.y.y.y                                                     |
|  DBSSHCommand       |  ssh -i ...pem ec2-user@x.x.x.x                             |
|  ClientSSHCommand   |  ssh -i ...pem ec2-user@y.y.y.y                             |
|  MySQLConnectCommand|  mysql -h 172.31.x.x -u handson -pHandson1234! sampledb     |
+---------------------+---------------------------------------------------------------+</code></pre>
<p><strong>控えておく情報:</strong></p>
<ul>
<li><code>DBPrivateIP</code>: DBサーバのプライベートIP（クライアントEC2からの接続に使う）</li>
<li><code>DBSSHCommand</code>: DBサーバへのSSHコマンド</li>
<li><code>ClientSSHCommand</code>: クライアントEC2へのSSHコマンド</li>
<li><code>MySQLConnectCommand</code>: クライアントEC2から実行するMySQL接続コマンド</li>
</ul>
<p><!-- ![Outputs確認コマンドの実行結果](images/cfn-outputs-table.jpg) --></p>
<hr>
<h2><span id="toc14">⑤ 動作確認</span></h2>
<h3><span id="toc15">5-1. DBサーバの動作確認</span></h3>
<p>Outputsの <code>DBSSHCommand</code> を実行してDBサーバに接続します。</p>
<pre><code class="language-cmd">ssh -i C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pem ec2-user@（DBPublicIP）</code></pre>
<pre><code class="language-bash"># MariaDBのサービス状態を確認（active (running) と表示されれば正常）
sudo systemctl status mariadb

# rootでログイン
sudo mysql -u root</code></pre>
<p>MariaDBのプロンプト（<code>MariaDB [(none)]&gt;</code>）が表示されたら以下を実行します。</p>
<pre><code class="language-sql">-- ユーザー一覧（handsonユーザーが作成済みか確認）
SELECT User, Host FROM mysql.user;

-- データベース一覧（sampledbが存在するか確認）
SHOW DATABASES;

-- テスト用テーブルとデータを作成
USE sampledb;
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');
SELECT * FROM users;

EXIT;</code></pre>
<pre><code class="language-bash">exit</code></pre>
<h3><span id="toc16">5-2. SG参照の確認：クライアントEC2からMySQL接続</span></h3>
<p>Outputsの <code>ClientSSHCommand</code> を実行してクライアントEC2に接続します。</p>
<pre><code class="language-cmd">ssh -i C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pem ec2-user@（ClientPublicIP）</code></pre>
<p>Outputsに表示された <code>MySQLConnectCommand</code> をそのまま実行します。</p>
<pre><code class="language-bash">mysql -h （DBPrivateIP） -u handson -pHandson1234! sampledb</code></pre>
<p>接続成功すると <code>MariaDB [sampledb]&gt;</code> が表示されます。</p>
<pre><code class="language-sql">-- DBサーバで作成したデータが見えることを確認
SELECT * FROM users;

EXIT;</code></pre>
<pre><code class="language-bash">exit</code></pre>
<p><!-- ![クライアントEC2からのMySQL接続確認](images/client-mysql-connect.jpg) --></p>
<h3><span id="toc17">5-3. SG参照の効果を確認する（任意・スキップ可）</span></h3>
<blockquote>
<p><strong>前提</strong>: ローカルPCに <code>mysql</code> クライアントがインストールされている場合のみ実施します。5-2でクライアントEC2からの接続が成功していれば、このハンズオンの学習目的（SG参照によるEC2間通信制御）は達成済みです。</p>
</blockquote>
<p>ローカルPCに <code>mysql</code> コマンドがある場合、ローカルターミナルで以下を実行します。</p>
<pre><code class="language-cmd">mysql -h （DBPublicIP） -u handson -pHandson1234! sampledb</code></pre>
<blockquote>
<p><strong>本番環境でのベストプラクティス</strong>: DBサーバSGからMyIP指定のルールを削除し、SG参照のみにすることで、DBサーバをインターネットから完全に遮断できます。DBサーバにパブリックIPを付与しないことも有効です。</p>
</blockquote>
<hr>
<h2><span id="toc18">⑥ スタックの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ず削除してください。</strong></p>
<p>CloudFormationはスタック削除で全リソースを一括削除できます。SGの依存関係（DBサーバSG → クライアントSGの削除順序）も自動的に解決されます。</p>
<pre><code class="language-cmd">aws cloudformation delete-stack ^
  --stack-name my-ec2-mysql-stack ^
  --region ap-northeast-1</code></pre>
<p>削除の進行状況を確認します（完了まで約5〜8分）。</p>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-mysql-stack ^
  --query "Stacks[0].StackStatus" ^
  --output text</code></pre>
<table>
<thead>
<tr>
<th>ステータス</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>DELETE_IN_PROGRESS</code></td>
<td>削除中（しばらく待つ）</td>
</tr>
<tr>
<td><code>DELETE_FAILED</code></td>
<td>削除失敗（トラブルシューティングを参照）</td>
</tr>
</tbody>
</table>
<p>削除完了の確認（以下のエラーが表示されれば削除完了）。</p>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-mysql-stack ^
  --region ap-northeast-1</code></pre>
<pre><code class="language-plaintext">An error occurred (ValidationError) when calling the DescribeStacks operation:
Stack with id my-ec2-mysql-stack does not exist</code></pre>
<p>このメッセージが表示されれば削除完了です。キーペアはCloudFormationで管理していないため、手動で削除します。</p>
<p><strong>EC2 → キーペア → <code>my-ec2-mysql-key</code> を選択 → 「アクション」→「削除」</strong></p>
<p>ローカルの <code>.pem</code> ファイルも削除します。</p>
<hr>
<h2><span id="toc19">コンソール版との比較</span></h2>
<p>コンソール版でSGを手動で依存関係順に作成・削除していた手順が、CloudFormationではすべて自動管理されます。</p>
<table>
<thead>
<tr>
<th>CFnの記述</th>
<th>コンソールでやること</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ClientSecurityGroup</code>（クライアントSG定義）</td>
<td>EC2 → SGを作成（SSH:22ルール）</td>
</tr>
<tr>
<td><code>DBSecurityGroup</code>（DB SG定義・SG参照）</td>
<td>EC2 → SGを作成（SSH:22 + MySQL:3306のSG参照ルール）</td>
</tr>
<tr>
<td><code>DBInstance</code>（DBサーバEC2・UserData）</td>
<td>EC2 → インスタンス起動（UserData貼り付け・DB SGを選択）</td>
</tr>
<tr>
<td><code>ClientInstance</code>（クライアントEC2）</td>
<td>EC2 → インスタンス起動（クライアント SGを選択）</td>
</tr>
<tr>
<td><code>delete-stack</code></td>
<td>DBサーバSG → クライアントSG → IAMロール（順番管理が必要）</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>CloudFormationのSG削除順序の自動管理</strong>: コンソール版ではDBサーバSG → クライアントSGの順で手動削除が必要でしたが、CloudFormationはリソース間の依存関係を自動的に解決して正しい順序で削除します。</p>
</blockquote>
<hr>
<h2><span id="toc20">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CREATE_FAILED</code> になる</td>
<td>キーペアが存在しない</td>
<td>コンソールでキーペアを作成し、<code>KeyName</code> パラメータを確認</td>
</tr>
<tr>
<td><code>CREATE_FAILED</code> になる</td>
<td>同名のIAMロールが既に存在する</td>
<td>コンソールでロールを削除してから再実行</td>
</tr>
<tr>
<td><code>stackName failed to satisfy regular expression pattern</code></td>
<td>スタック名が数字始まり</td>
<td>CloudFormationのスタック名は<strong>英字で始まる</strong>必要がある</td>
</tr>
<tr>
<td><code>Unable to load paramfile, text contents could not be decoded</code></td>
<td>template.yaml に日本語が含まれている</td>
<td>template.yaml のコメントは<strong>英語のみ</strong>で記述する（Windows環境の既知の問題）</td>
</tr>
<tr>
<td>クライアントEC2からMySQLに接続できない</td>
<td>MariaDBのセットアップがまだ完了していない</td>
<td><code>CREATE_COMPLETE</code> 後2〜3分待ってから再試行。DBサーバで <code>sudo systemctl status mariadb</code> を確認</td>
</tr>
<tr>
<td><code>ERROR 2003: Can&#39;t connect to MySQL server</code></td>
<td>パブリックIPを指定している</td>
<td>DBサーバの<strong>プライベートIP</strong>（<code>DBPrivateIP</code>）を指定する</td>
</tr>
<tr>
<td><code>DELETE_FAILED</code> になる</td>
<td>手動でリソースを変更したためCFnが管理できない</td>
<td>コンソールで該当リソースを確認して手動削除後、<code>delete-stack</code> を再実行</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc21">まとめ</span></h2>
<p>今回のハンズオンで実現できたこと：</p>
<table>
<thead>
<tr>
<th>確認項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>SG参照のIaC化</strong></td>
<td><code>SourceSecurityGroupId: !GetAtt ClientSecurityGroup.GroupId</code> でSG参照をコードで表現</td>
</tr>
<tr>
<td><strong>複数リソースの一括管理</strong></td>
<td>EC2×2・SG×2・IAMロールを1ファイルで定義・一括デプロイ</td>
</tr>
<tr>
<td><strong>Outputs活用</strong></td>
<td>DBPrivateIP・MySQLConnectCommandを <code>describe-stacks</code> で自動取得</td>
</tr>
<tr>
<td><strong>依存関係の自動解決</strong></td>
<td>SGの削除順序をCloudFormationが自動管理（コンソール版では手動）</td>
</tr>
</tbody>
</table>
<h3><span id="toc22">CloudFormationのメリットを実感できたポイント</span></h3>
<ul>
<li>コンソール版では複数リソースの作成・削除に順番の意識が必要だったが、CloudFormationが自動管理</li>
<li><code>MySQLConnectCommand</code> がOutputsとして自動生成されるため、手動でコマンドを組み立てる必要がない</li>
<li><code>template.yaml</code> をGitで管理することで、SG参照を含む複雑な構成の変更履歴が残せる</li>
</ul>
<hr>
<h2><span id="toc23">コンソール版と比較してみる</span></h2>
<p>CloudFormationが裏で何をやっているか、同じ構成をAWSコンソールのみで構築する手順をまとめました。特にSGの依存関係管理とSG参照の設定手順を視覚的に確認できます。</p>
<p><a href="https://caymezon.com/aws-handson-console-ec2-mysql/">EC2サーバ構築ハンズオン：AWSコンソールでEC2 MySQLのDBサーバを構築する手順</a></p>
<hr>
<h2><span id="toc24">関連記事</span></h2>
<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運用入門 改訂第2版 押さえておきたいAWSの基本と運用ノウハウ [AWS深掘りガイド]","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51AAOubymTL._SL500_.jpg","\/51VMG6YKHdL._SL500_.jpg","\/41EdPB8azAL._SL500_.jpg","\/41v2JFE-9jL._SL500_.jpg","\/41FEEqR-yDL._SL500_.jpg","\/41JfZAdnTPL._SL500_.jpg","\/41vGK0czQrL._SL500_.jpg","\/41-SnYtz2aL._SL500_.jpg","\/41sPrV5fi3L._SL500_.jpg","\/41p7JtvYJ1L._SL500_.jpg","\/4169GVNTs8L._SL500_.jpg","\/41BPI5HP3zL._SL500_.jpg","\/41QOyk60CYL._SL500_.jpg","\/41APjk6FphL._SL500_.jpg","\/41ezKUu7VRL._SL500_.jpg","\/41A1n3K+r5L._SL500_.jpg","\/41aY2T8lEOL._SL500_.jpg","\/419Ca1V6HZL._SL500_.jpg","\/41zQkYyLPzL._SL500_.jpg","\/41YpHcyxiTL._SL500_.jpg","\/41-tKN5mt6L._SL500_.jpg","\/419Mv6m55IL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815631085","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\/4815631085","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D\/","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"E8MM1","s":"s"});</script></p>
<div id="msmaflink-E8MM1">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --> --></p><p>The post <a href="https://caymezon.com/aws-handson-cloudformation-ec2-mysql/">EC2サーバ構築をIaC化：CloudFormationでEC2 MySQLのDBサーバを自動デプロイする手順【SG参照 / コンソール版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-cloudformation-ec2-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>EC2サーバ構築ハンズオン：AWSコンソールでTomcatを構築する手順【EC2 Tomcat / CloudFormation版との比較付き】</title>
		<link>https://caymezon.com/aws-handson-console-ec2-tomcat/</link>
					<comments>https://caymezon.com/aws-handson-console-ec2-tomcat/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sun, 29 Mar 2026 04:44:53 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[APサーバー]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWSコンソール]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[ec2サーバ構築]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[UserData]]></category>
		<category><![CDATA[セキュリティグループ]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20313</guid>

					<description><![CDATA[<p>はじめに 「EC2サーバ上でJavaアプリを動かしたい」——ApacheでHTMLを返せるようになったら、次はJavaが実行できるAPサーバー（Tomcat）に挑戦しましょう。 この記事では、AWSコンソール（GUI）の [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-console-ec2-tomcat/">EC2サーバ構築ハンズオン：AWSコンソールでTomcatを構築する手順【EC2 Tomcat / CloudFormation版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>「EC2サーバ上でJavaアプリを動かしたい」——ApacheでHTMLを返せるようになったら、次はJavaが実行できるAPサーバー（Tomcat）に挑戦しましょう。</p>
<p>この記事では、<strong>AWSコンソール（GUI）のみ</strong>を使って、Tomcat APサーバーが動作するEC2インスタンスをゼロから手動で構築するハンズオンを紹介します。</p>
<pre><code class="language-plaintext">インターネット
  ↓ TCP 8080（Tomcat HTTP）← ブラウザでアクセス
  ↓ TCP 22（SSH）          ← ターミナルで接続
セキュリティグループ（ファイアウォール）
  ↓ 自分のIPのみ通過させる
EC2インスタンス（t2.micro / Amazon Linux 2023）
  ├── Java 17（Amazon Corretto）← Tomcatの実行基盤
  ├── Tomcat 10.1（APサーバー）← UserDataで自動インストール
  │     └── /opt/tomcat/latest/webapps/ROOT/index.jsp を返す
  └── IAMロール（Session Manager接続用）</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li>EC2サーバーへのJava 17（Amazon Corretto）とTomcat 10のインストール</li>
<li>セキュリティグループによるポートアクセス制御（SSH:22 / Tomcat:8080）</li>
<li>UserDataを使ったJava + Tomcatの初回起動時自動インストール</li>
<li>JSPが実行されていることをブラウザで確認（Apacheの静的HTMLとの違い）</li>
</ul>
<p><strong>このハンズオンの特徴：</strong></p>
<ul>
<li>Apache版（Phase 1-1）の次のステップとして、APサーバーとWebサーバーの違いを体験できる</li>
<li>手動操作を通じて、各リソースの役割と依存関係を視覚的に理解できる</li>
</ul>
<hr>
<blockquote>
<p><strong>この記事は <a href="https://caymezon.com/aws-handson-cloudformation-ec2-tomcat/">CloudFormation版ハンズオン</a> の比較記事です。</strong><br />コンソール操作でEC2 Tomcatサーバー構築の全体像を学び、CloudFormationとの違いを比較したい方向けです。</p>
</blockquote>
<hr>
<p><!-- ![ハンズオン完成後のTomcat動作確認画面](images/ec2-tomcat-top.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>EC2（Elastic Compute Cloud）</strong></td>
<td>AWSの仮想サーバーサービス。今回はここにJava + Tomcatをインストールする</td>
</tr>
<tr>
<td><strong>Tomcat</strong></td>
<td>JavaのWebアプリケーション（JSP/Servlet）を実行するAPサーバー。Apacheとは異なりJavaコードを動かすことができる</td>
</tr>
<tr>
<td><strong>Amazon Corretto</strong></td>
<td>AWSが提供するOpenJDKのディストリビューション。無償・本番利用可能なJava実行環境</td>
</tr>
<tr>
<td><strong>JSP（JavaServer Pages）</strong></td>
<td>HTMLにJavaコードを埋め込んで動的なページを生成する技術。Tomcatがサーバー側で実行してHTMLを返す</td>
</tr>
<tr>
<td><strong>セキュリティグループ</strong></td>
<td>EC2への通信を制御するファイアウォール。今回はポート22（SSH）と8080（Tomcat）を開ける</td>
</tr>
<tr>
<td><strong>UserData</strong></td>
<td>EC2の初回起動時のみ自動実行されるシェルスクリプト。今回はJava + Tomcatのインストールに使う</td>
</tr>
<tr>
<td><strong>IAMロール</strong></td>
<td>EC2にAWSサービスを利用する権限を付与する仕組み。今回はSession Manager接続に使う</td>
</tr>
<tr>
<td><strong>キーペア</strong></td>
<td>SSHでEC2に接続するための鍵ペア（公開鍵＋秘密鍵）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">Apache（Webサーバー）と Tomcat（APサーバー）の違い</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>Apache（前回）</th>
<th>Tomcat（今回）</th>
</tr>
</thead>
<tbody>
<tr>
<td>種類</td>
<td>Webサーバー</td>
<td>APサーバー（Application Server）</td>
</tr>
<tr>
<td>得意なこと</td>
<td>静的ファイル（HTML/CSS/画像）の配信</td>
<td>Java（JSP/Servlet）の実行</td>
</tr>
<tr>
<td>デフォルトポート</td>
<td>80</td>
<td><strong>8080</strong></td>
</tr>
<tr>
<td>コンテンツの置き場</td>
<td><code>/var/www/html/</code></td>
<td><code>/opt/tomcat/latest/webapps/ROOT/</code></td>
</tr>
<tr>
<td>インストール方法</td>
<td><code>yum install httpd</code>（1コマンド）</td>
<td>Java + Tomcatを手動インストール（複数ステップ）</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>EC2</strong></td>
<td>Java + Tomcatが動作するAPサーバー本体（t2.micro）</td>
<td>月750時間まで無料枠あり</td>
</tr>
<tr>
<td><strong>セキュリティグループ</strong></td>
<td>SSH/Tomcatのアクセス制御</td>
<td>無料</td>
</tr>
<tr>
<td><strong>IAM</strong></td>
<td>EC2へのSession Manager接続権限</td>
<td>無料</td>
</tr>
<tr>
<td><strong>EBS</strong></td>
<td>EC2にアタッチされるストレージ（デフォルト8GB）</td>
<td>月30GBまで無料枠あり</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>注意</strong>: 無料枠はAWSアカウント開設から12ヶ月間です。期間終了後はEC2インスタンス稼働時間に課金されます。ハンズオン後は必ずリソースを削除してください。</p>
</blockquote>
<hr>
<h2><span id="toc5">構築するリソース</span></h2>
<table>
<thead>
<tr>
<th>リソース</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td>キーペア</td>
<td>SSHでEC2に接続するための認証鍵</td>
</tr>
<tr>
<td>IAMロール</td>
<td>EC2にSession Manager接続の権限を付与</td>
</tr>
<tr>
<td>セキュリティグループ</td>
<td>SSH(22)・Tomcat(8080)のアクセス制御</td>
</tr>
<tr>
<td>EC2インスタンス</td>
<td>Java + Tomcatが動作するAPサーバー本体</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc6">全体の作業順序</span></h2>
<p>依存関係があるため、必ずこの順番で作成します。</p>
<pre><code class="language-plaintext">⓪ 自分のIPアドレスを確認する（重要）
      ↓
① キーペアを作成する
      ↓
② IAMロールを作成する
      ↓
③ EC2インスタンスを起動する
  （セキュリティグループ・UserDataも同時に設定）
      ↓
④ 動作確認（ブラウザ・SSH）
      ↓
⑤ リソースを削除する</code></pre>
<hr>
<h2><span id="toc7">【重要】⓪ 自分のIPアドレスを確認する</span></h2>
<p>セキュリティグループで自分のIPだけを許可するために、<strong>正確なIPアドレス</strong>を事前に確認します。</p>
<blockquote>
<p><strong>注意</strong>: <code>curl https://checkip.amazonaws.com</code> で表示されるIPと、EC2への実際の接続元IPが<strong>一致しない場合</strong>があります（ISPやプロキシの経路の違いによる）。最も確実な方法はルーター管理画面での確認です。</p>
</blockquote>
<h3><span id="toc8">方法A: ルーター管理画面で確認（推奨）</span></h3>
<ol>
<li>ブラウザで以下のURLにアクセスします（ルーターによって異なります）
<pre><code class="language-plaintext">http://192.168.0.1  または  http://192.168.1.1</code></pre>
</li>
<li>「ネットワークマップ」または「インターネット」項目を開く</li>
<li>**「インターネットIPアドレス」または「WAN IPアドレス」**の値を控えます</li>
</ol>
<h3><span id="toc9">方法B: コマンドで確認</span></h3>
<pre><code class="language-cmd">curl https://checkip.amazonaws.com</code></pre>
<p><strong>控えておく情報</strong>: 自分のIPアドレス（例: <code>203.0.113.1</code>）</p>
<hr>
<h2><span id="toc10">① キーペアの作成</span></h2>
<p>キーペアはSSHでEC2に接続するための鍵です。EC2起動時に指定する必要があるため、最初に作成します。</p>
<p><strong>AWSコンソール → EC2 → ネットワーク＆セキュリティ → キーペア → 「キーペアを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-ec2-tomcat-key</code></td>
</tr>
<tr>
<td>キーペアのタイプ</td>
<td><strong>RSA</strong></td>
</tr>
<tr>
<td>プライベートキーファイル形式</td>
<td><strong>.pem</strong></td>
</tr>
</tbody>
</table>
<p>「キーペアを作成」をクリックすると、自動的に <code>my-ec2-tomcat-key.pem</code> がダウンロードされます。</p>
<h3><span id="toc11">ダウンロードしたキーペアを保存する</span></h3>
<p>ダウンロードされた <code>my-ec2-tomcat-key.pem</code> を以下の場所に移動します。</p>
<pre><code class="language-plaintext">C:\Users\ユーザー名\.ssh\my-ec2-tomcat-key.pem</code></pre>
<blockquote>
<p><strong>注意</strong>: <code>.pem</code> ファイルは<strong>再ダウンロードできません</strong>。紛失した場合は新しいキーペアを作成する必要があります。</p>
</blockquote>
<blockquote>
<p><strong>前回のキーペアの流用について</strong>: EC2 + Apacheハンズオンで作成した <code>my-ec2-apache-key</code> を流用しても動作します。その場合この手順はスキップします。</p>
</blockquote>
<p><!-- ![キーペア作成画面](images/keypair-create.jpg) --></p>
<hr>
<h2><span id="toc12">② IAMロールの作成</span></h2>
<p>Session Manager（ブラウザからEC2に接続できるAWS機能）を使えるようにするためのIAMロールを作成します。</p>
<blockquote>
<p><strong>なぜIAMロールが必要か</strong>: EC2がAWSのサービス（Session Manager）を利用するには、そのEC2自身に「このサービスを使う権限」を付与する必要があります。この権限の設定がIAMロールです。</p>
</blockquote>
<p><strong>AWSコンソール → IAM → ロール → 「ロールを作成」</strong></p>
<h3><span id="toc13">ステップ1: エンティティタイプとユースケースの選択</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>信頼されたエンティティタイプ</td>
<td><strong>AWSのサービス</strong></td>
</tr>
<tr>
<td>ユースケース</td>
<td><strong>EC2</strong></td>
</tr>
</tbody>
</table>
<p>「次へ」をクリック。</p>
<h3><span id="toc14">ステップ2: 許可ポリシーのアタッチ</span></h3>
<p>検索ボックスに <code>AmazonSSMManagedInstanceCore</code> と入力してチェックを入れます。</p>
<p>「次へ」をクリック。</p>
<h3><span id="toc15">ステップ3: ロール名の設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>ロール名</td>
<td><code>my-ec2-tomcat-role</code></td>
</tr>
</tbody>
</table>
<p>「ロールを作成」をクリック。</p>
<p><!-- ![IAMロール作成画面](images/iam-role-create.jpg) --></p>
<hr>
<h2><span id="toc16">③ EC2インスタンスの起動</span></h2>
<p>キーペアとIAMロールを作成したあと、EC2インスタンスを起動します。<br />セキュリティグループとUserData（Java + Tomcat自動インストール）も同時に設定します。</p>
<p><strong>AWSコンソール → EC2 → インスタンス → 「インスタンスを起動」</strong></p>
<h3><span id="toc17">3-1. 基本設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-ec2-tomcat-instance</code></td>
</tr>
<tr>
<td>アプリケーションおよびOSイメージ</td>
<td><strong>Amazon Linux 2023 AMI</strong>（デフォルトで選択済み）</td>
</tr>
<tr>
<td>インスタンスタイプ</td>
<td><strong>t2.micro</strong>（無料枠対象）</td>
</tr>
<tr>
<td>キーペア</td>
<td><code>my-ec2-tomcat-key</code></td>
</tr>
</tbody>
</table>
<p><!-- ![EC2インスタンス起動画面 - 基本設定](images/ec2-launch-basic.jpg) --></p>
<h3><span id="toc18">3-2. セキュリティグループの設定</span></h3>
<p>「ネットワーク設定」→「セキュリティグループを作成する」を選択します。</p>
<p><strong>セキュリティグループ名と説明を設定:</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>セキュリティグループ名</td>
<td><code>my-ec2-tomcat-sg</code></td>
</tr>
<tr>
<td>説明</td>
<td><code>EC2 Tomcat hands-on SG</code></td>
</tr>
</tbody>
</table>
<p><strong>「インバウンドセキュリティグループのルールを追加」ボタンで以下の2ルールを追加します。</strong></p>
<p><strong>ルール1: SSH接続の許可</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイプ</td>
<td>SSH</td>
</tr>
<tr>
<td>ソースタイプ</td>
<td>カスタム</td>
</tr>
<tr>
<td>ソース</td>
<td><code>203.0.113.1/32</code>（⓪で確認した自分のIP + /32）</td>
</tr>
</tbody>
</table>
<p><strong>ルール2: Tomcat HTTPアクセスの許可</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイプ</td>
<td>カスタム TCP</td>
</tr>
<tr>
<td>ポート範囲</td>
<td><code>8080</code></td>
</tr>
<tr>
<td>ソースタイプ</td>
<td>カスタム</td>
</tr>
<tr>
<td>ソース</td>
<td><code>203.0.113.1/32</code>（⓪で確認した自分のIP + /32）</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>ポート8080について</strong>: TomcatはデフォルトでHTTP <strong>8080番ポート</strong>をListenします。Apacheの80番とは異なるため、セキュリティグループでも8080を明示的に開ける必要があります。</p>
</blockquote>
<blockquote>
<p><strong>/32 とは</strong>: 「このIPアドレス1つだけ」という意味のCIDR表記です。<code>0.0.0.0/0</code> は全世界に開放することになりセキュリティリスクが高いため、必ず自分のIPのみに制限します。</p>
</blockquote>
<p><!-- ![セキュリティグループ設定画面](images/security-group-create.jpg) --></p>
<h3><span id="toc19">3-3. IAMロールの設定</span></h3>
<p>「高度な詳細」を開く → 「IAM インスタンスプロファイル」→ <code>my-ec2-tomcat-role</code> を選択します。</p>
<h3><span id="toc20">3-4. UserDataの設定（Java + Tomcatの自動インストール）</span></h3>
<p>「高度な詳細」の一番下にある「ユーザーデータ」に以下を貼り付けます。</p>
<pre><code class="language-bash">#!/bin/bash
dnf update -y
dnf install -y java-17-amazon-corretto

useradd -m -d /opt/tomcat -U -s /bin/false tomcat

TOMCAT_VERSION="10.1.25"
cd /tmp
wget -q "https://archive.apache.org/dist/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz" \
  -O apache-tomcat.tar.gz
tar xzf apache-tomcat.tar.gz
mv "apache-tomcat-${TOMCAT_VERSION}" /opt/tomcat/latest
chown -R tomcat:tomcat /opt/tomcat
chmod -R u+x /opt/tomcat/latest/bin

cat &gt; /etc/systemd/system/tomcat.service &lt;&lt; 'SVCEOF'
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto"
Environment="CATALINA_HOME=/opt/tomcat/latest"
Environment="CATALINA_BASE=/opt/tomcat/latest"
Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
Environment="JAVA_OPTS=-Xms256m -Xmx512m"
ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
SVCEOF

systemctl daemon-reload
systemctl enable tomcat
systemctl start tomcat

cat &gt; /opt/tomcat/latest/webapps/ROOT/index.jsp &lt;&lt; 'JSPEOF'
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;&lt;meta charset="UTF-8"&gt;&lt;title&gt;Tomcat on EC2&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Hello from Tomcat on Amazon Linux 2023!&lt;/h1&gt;
&lt;p&gt;Java Version: &lt;%= System.getProperty("java.version") %&gt;&lt;/p&gt;
&lt;p&gt;Tomcat Version: &lt;%= application.getServerInfo() %&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
JSPEOF
chown tomcat:tomcat /opt/tomcat/latest/webapps/ROOT/index.jsp</code></pre>
<p><strong>各コマンドの説明:</strong></p>
<table>
<thead>
<tr>
<th>コマンド</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>dnf update -y</code></td>
<td>OSのパッケージを最新化する（Amazon Linux 2023はdnfを使用）</td>
</tr>
<tr>
<td><code>dnf install -y java-17-amazon-corretto</code></td>
<td>AWSが提供するJava 17ディストリビューションをインストール</td>
</tr>
<tr>
<td><code>useradd -m -d /opt/tomcat -U -s /bin/false tomcat</code></td>
<td>Tomcat専用システムユーザーを作成（ログイン不可・セキュリティ対策）</td>
</tr>
<tr>
<td><code>wget -q ... -O apache-tomcat.tar.gz</code></td>
<td>Apache公式アーカイブからTomcatをダウンロード</td>
</tr>
<tr>
<td><code>tar xzf apache-tomcat.tar.gz</code></td>
<td>ダウンロードしたtar.gzを展開</td>
</tr>
<tr>
<td><code>mv ... /opt/tomcat/latest</code></td>
<td>Tomcatを <code>/opt/tomcat/latest/</code> に配置</td>
</tr>
<tr>
<td><code>chown -R tomcat:tomcat /opt/tomcat</code></td>
<td>Tomcatディレクトリの所有者をtomcatユーザーに変更</td>
</tr>
<tr>
<td><code>chmod -R u+x /opt/tomcat/latest/bin</code></td>
<td>binディレクトリのスクリプトに実行権限を付与</td>
</tr>
<tr>
<td><code>cat &gt; /etc/systemd/system/tomcat.service</code></td>
<td>TomcatをLinuxサービスとして登録するファイルを作成</td>
</tr>
<tr>
<td><code>systemctl daemon-reload</code></td>
<td>systemdにサービス定義ファイルの変更を反映</td>
</tr>
<tr>
<td><code>systemctl enable tomcat</code></td>
<td>OS起動時にTomcatが自動起動するよう設定</td>
</tr>
<tr>
<td><code>systemctl start tomcat</code></td>
<td>Tomcatを起動</td>
</tr>
<tr>
<td><code>cat &gt; .../index.jsp</code></td>
<td>テスト用JSPページを作成（Javaコード入り）</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>Amazon Corretto（コレット）とは</strong>: AWSが提供するOpenJDKのディストリビューション。無償・本番利用可能で、Amazon Linux 2023のパッケージリポジトリから直接インストールできます。</p>
</blockquote>
<blockquote>
<p><strong>JAVA_OPTS=-Xms256m -Xmx512m</strong>: Javaの使用メモリを制限する設定です。t2.microは1GBのメモリしかないため、最小256MB・最大512MBに制限して他のプロセスと共存できるようにしています。</p>
</blockquote>
<blockquote>
<p><strong>UserDataはインスタンスの初回起動時のみ実行されます</strong>。Tomcatのダウンロードを含むため、完了まで<strong>約5〜10分</strong>かかります。</p>
</blockquote>
<h3><span id="toc21">3-5. インスタンスを起動する</span></h3>
<p>「インスタンスを起動」ボタンをクリック。</p>
<p>起動完了まで約2〜3分待ちます。インスタンスの「状態」が「実行中」になったことを確認します。</p>
<p><strong>控えておく情報: インスタンスのパブリックIPアドレス</strong></p>
<p>インスタンス一覧 → 作成したインスタンスをクリック → 「パブリック IPv4 アドレス」を確認してメモします。</p>
<p><!-- ![EC2インスタンス起動後の画面](images/ec2-running.jpg) --></p>
<hr>
<h2><span id="toc22">④ 動作確認</span></h2>
<blockquote>
<p><strong>重要</strong>: UserDataでのJava + Tomcatインストールが完了するまで<strong>約5〜10分</strong>かかります。インスタンスが「実行中」になってもすぐには接続できません。</p>
</blockquote>
<h3><span id="toc23">ブラウザで確認</span></h3>
<p>ブラウザで以下のURLにアクセスします。ポート番号 <strong>8080</strong> を忘れずに入力してください。</p>
<pre><code class="language-plaintext">http://（パブリックIPアドレス）:8080</code></pre>
<p>以下のように表示されれば成功です。</p>
<pre><code class="language-plaintext">Hello from Tomcat on Amazon Linux 2023!
Java Version: 17.x.x
Tomcat Version: Apache Tomcat/10.1.25</code></pre>
<blockquote>
<p><strong>JSPが実行されている証拠</strong>: <code>Java Version</code> や <code>Tomcat Version</code> はJavaコード（<code>&lt;%= ... %&gt;</code>）がサーバー側で実行されて表示されています。ApacheのHTMLと違い、TomcatがJavaを動かして動的にページを生成しています。</p>
</blockquote>
<blockquote>
<p><strong>表示されない場合</strong>: UserDataのインストールが完了していない可能性があります。5〜10分待ってからリロードしてください。それでも表示されない場合はSSHで接続してログを確認します。</p>
</blockquote>
<p><!-- ![ブラウザでのTomcat動作確認](images/tomcat-web-browser.jpg) --></p>
<h3><span id="toc24">SSHで接続して確認</span></h3>
<p>ローカルPCのターミナル（VSCode CMD）で実行します。</p>
<pre><code class="language-cmd">ssh -i C:\Users\ユーザー名\.ssh\my-ec2-tomcat-key.pem ec2-user@（パブリックIPアドレス）</code></pre>
<p>初回接続時に以下の確認が出ます。<code>yes</code> を入力します。</p>
<pre><code class="language-plaintext">Are you sure you want to continue connecting (yes/no)? yes</code></pre>
<p>接続できたら以下を実行します。</p>
<pre><code class="language-bash">java -version

# Tomcatサービスの動作状態を確認（active (running) と表示されれば正常）
sudo systemctl status tomcat

# TomcatのメインログでERRORがないか確認
sudo tail -50 /opt/tomcat/latest/logs/catalina.out

# Tomcatが8080番ポートをListenしているか確認
sudo ss -tlnp | grep :8080

# EC2から切断
exit</code></pre>
<p><strong>Tomcatのディレクトリ構成:</strong></p>
<table>
<thead>
<tr>
<th>パス</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/opt/tomcat/latest/webapps/ROOT/</code></td>
<td>デフォルトWebアプリのルート（JSP/HTMLを置く場所）</td>
</tr>
<tr>
<td><code>/opt/tomcat/latest/conf/server.xml</code></td>
<td>Tomcatの設定ファイル（ポート番号などを管理）</td>
</tr>
<tr>
<td><code>/opt/tomcat/latest/logs/catalina.out</code></td>
<td>Tomcatのメインログ（エラー確認に使う）</td>
</tr>
<tr>
<td><code>/opt/tomcat/latest/bin/startup.sh</code></td>
<td>Tomcat起動スクリプト</td>
</tr>
<tr>
<td><code>/opt/tomcat/latest/bin/shutdown.sh</code></td>
<td>Tomcat停止スクリプト</td>
</tr>
</tbody>
</table>
<h3><span id="toc25">UserDataのインストール状況を確認する方法</span></h3>
<p>インスタンスにSSHで接続できた場合、UserDataの実行ログで進捗を確認できます。</p>
<pre><code class="language-bash"># UserDataのログを確認（インストールの進捗・エラーを確認できる）
sudo cat /var/log/cloud-init-output.log</code></pre>
<p><!-- ![SSH接続後のTomcat動作確認](images/ssh-tomcat-status.jpg) --></p>
<h3><span id="toc26">【接続できない場合】IPアドレスが異なる可能性</span></h3>
<p><code>curl</code> で確認したIPを設定したが接続できない場合、実際の接続元IPが異なる可能性があります。</p>
<p><strong>一時的に全開放して真のIPを確認する方法:</strong></p>
<p>コンソール → EC2 → セキュリティグループ → <code>my-ec2-tomcat-sg</code> → 「インバウンドルールを編集」</p>
<p>SSHのルールを一時的に <code>0.0.0.0/0</code> に変更してSSH接続し、以下を実行します。</p>
<pre><code class="language-bash">echo $SSH_CLIENT
# 出力例: 203.0.113.1 17508 22
# 先頭の値が真の接続元IP</code></pre>
<p>このIPをメモしてSSH接続を切断し、セキュリティグループのSSHルールを <code>真のIP/32</code> に戻します。</p>
<hr>
<h2><span id="toc27">⑤ リソースの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ず削除してください。削除する順番が重要です。</strong></p>
<h3><span id="toc28">1. EC2インスタンスを終了する</span></h3>
<p><strong>EC2 → インスタンス → <code>my-ec2-tomcat-instance</code> を選択 → 「インスタンスの状態」→「インスタンスを終了」</strong></p>
<p>確認ダイアログで「終了」をクリック。状態が「終了済み」になるまで待ちます（2〜5分）。</p>
<blockquote>
<p><strong>「停止」と「終了」の違い</strong>: 「停止」は一時停止（EBSストレージ課金は続く）。「終了」は完全削除（課金停止）。学習後は「終了」を選びます。</p>
</blockquote>
<h3><span id="toc29">2. セキュリティグループを削除する</span></h3>
<p><strong>EC2 → セキュリティグループ → <code>my-ec2-tomcat-sg</code> を選択 → 「アクション」→「セキュリティグループを削除」</strong></p>
<blockquote>
<p>インスタンス終了が完了している必要があります。「使用中」エラーが出る場合はインスタンスが「終了済み」状態になるまで待ってください。</p>
</blockquote>
<h3><span id="toc30">3. IAMロールを削除する</span></h3>
<p><strong>IAM → ロール → <code>my-ec2-tomcat-role</code> を選択 → 「削除」→ ロール名を入力して確認</strong></p>
<h3><span id="toc31">4. キーペアを削除する（任意）</span></h3>
<p>他のEC2でも使い回す場合は残してよいです。不要な場合は削除します。</p>
<p><strong>EC2 → キーペア → <code>my-ec2-tomcat-key</code> を選択 → 「アクション」→「削除」→ 確認テキストを入力</strong></p>
<p>ローカルの <code>.pem</code> ファイルも手動で削除します。</p>
<pre><code class="language-plaintext">C:\Users\ユーザー名\.ssh\my-ec2-tomcat-key.pem</code></pre>
<hr>
<h2><span id="toc32">CloudFormation版との比較</span></h2>
<p>コンソール版を体験したら、次は同じ構成をCloudFormation（コード）で再現してみましょう。何が自動化されるのかがよくわかります。</p>
<table>
<thead>
<tr>
<th>作業</th>
<th>コンソール（手動）</th>
<th>CloudFormation</th>
</tr>
</thead>
<tbody>
<tr>
<td>IAMロール作成</td>
<td>画面でポチポチ（5クリック以上）</td>
<td>template.yaml に定義済み</td>
</tr>
<tr>
<td>セキュリティグループ作成</td>
<td>画面でポチポチ</td>
<td>template.yaml に定義済み</td>
</tr>
<tr>
<td>EC2起動（UserData含む）</td>
<td>画面でポチポチ</td>
<td>template.yaml に定義済み</td>
</tr>
<tr>
<td>デプロイ全体</td>
<td>複数画面を行き来（20〜30分）</td>
<td>コマンド1本（5〜10分）</td>
</tr>
<tr>
<td>削除</td>
<td>リソースを個別に依存関係順で手動削除</td>
<td><code>delete-stack</code> 1本</td>
</tr>
<tr>
<td>再現性</td>
<td>低い（手動ミスのリスクがある）</td>
<td>高い（同じ環境を何度でも再現可能）</td>
</tr>
<tr>
<td>バージョン管理</td>
<td>不可</td>
<td>Gitで管理可能</td>
</tr>
</tbody>
</table>
<p><strong>コンソール版で実感できたポイント:</strong></p>
<ul>
<li>Java + Tomcatのインストール手順が長く、手動では設定ミスが起きやすいことを実感できる</li>
<li>ポート8080の開放やTomcatユーザーの作成など、セキュリティ設定の重要性が身につく</li>
<li>UserDataの完了を待つ間に、コンソール版とCloudFormation版の差が体感できる</li>
</ul>
<p><strong>CloudFormation版でも試してみる</strong>: <a href="https://caymezon.com/aws-handson-cloudformation-ec2-tomcat/">EC2サーバ構築をIaC化：CloudFormationでEC2 Tomcatを自動デプロイする手順</a></p>
<hr>
<h2><span id="toc33">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>ブラウザで何も表示されない（起動後10分以内）</td>
<td>UserDataのインストールが完了していない</td>
<td><code>sudo cat /var/log/cloud-init-output.log</code> でインストール状況を確認</td>
</tr>
<tr>
<td>ブラウザで何も表示されない（10分以上経過）</td>
<td>Tomcatが起動に失敗している</td>
<td><code>sudo systemctl status tomcat</code> と <code>sudo tail -100 /opt/tomcat/latest/logs/catalina.out</code> を確認</td>
</tr>
<tr>
<td>ブラウザでTomcatのデフォルトページが表示される</td>
<td>JSPの配置タイミングがTomcat起動より遅れた</td>
<td><code>sudo systemctl restart tomcat</code> でTomcatを再起動する</td>
</tr>
<tr>
<td>SSH接続タイムアウト</td>
<td>セキュリティグループのIP設定誤り</td>
<td>セキュリティグループのSSH(22)ルールのIPを確認</td>
</tr>
<tr>
<td>ブラウザにアクセスできない（8080）</td>
<td>セキュリティグループのポート8080が開いていない</td>
<td>セキュリティグループのインバウンドルールで8080が追加されているか確認</td>
</tr>
<tr>
<td><code>java: command not found</code></td>
<td>Javaのインストールが失敗している</td>
<td><code>sudo dnf install -y java-17-amazon-corretto</code> を手動実行</td>
</tr>
<tr>
<td>Tomcatは起動しているがJSPが動かない</td>
<td>index.jspの所有者がtomcatユーザーになっていない</td>
<td><code>sudo chown tomcat:tomcat /opt/tomcat/latest/webapps/ROOT/index.jsp</code> を実行</td>
</tr>
<tr>
<td>セキュリティグループが削除できない</td>
<td>EC2インスタンスがまだ使用中</td>
<td>インスタンス「終了済み」状態になってから再試行</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc34">まとめ</span></h2>
<p>今回のハンズオンで体験できたこと：</p>
<table>
<thead>
<tr>
<th>確認項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>キーペア作成</strong></td>
<td>SSH接続に必要な鍵ペアをコンソールで作成し、.pemファイルをローカルに保存</td>
</tr>
<tr>
<td><strong>IAMロール作成</strong></td>
<td>AmazonSSMManagedInstanceCoreポリシーをEC2にアタッチして接続権限を付与</td>
</tr>
<tr>
<td><strong>セキュリティグループ</strong></td>
<td>SSH(22)/Tomcat(8080)を自分のIPのみに制限してEC2を保護</td>
</tr>
<tr>
<td><strong>UserDataによる自動化</strong></td>
<td>Java 17 + Tomcat 10のインストールと起動を初回起動時のスクリプトで自動化</td>
</tr>
<tr>
<td><strong>APサーバー確認</strong></td>
<td>ブラウザとSSHの両方でTomcat動作・JSP実行を確認</td>
</tr>
<tr>
<td><strong>リソース削除</strong></td>
<td>依存関係順に4つのリソースを手動で削除</td>
</tr>
</tbody>
</table>
<p>手動操作でひとつひとつ作ると、CloudFormationが裏で何を自動化しているかが理解できます。ぜひ次は <a href="https://caymezon.com/aws-handson-cloudformation-ec2-tomcat/">CloudFormation版</a> で同じ構成をコードで再現してみてください。</p>
<hr>
<h2><span id="toc35">関連記事</span></h2>
<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運用入門 改訂第2版 押さえておきたいAWSの基本と運用ノウハウ [AWS深掘りガイド]","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51AAOubymTL._SL500_.jpg","\/51VMG6YKHdL._SL500_.jpg","\/41EdPB8azAL._SL500_.jpg","\/41v2JFE-9jL._SL500_.jpg","\/41FEEqR-yDL._SL500_.jpg","\/41JfZAdnTPL._SL500_.jpg","\/41vGK0czQrL._SL500_.jpg","\/41-SnYtz2aL._SL500_.jpg","\/41sPrV5fi3L._SL500_.jpg","\/41p7JtvYJ1L._SL500_.jpg","\/4169GVNTs8L._SL500_.jpg","\/41BPI5HP3zL._SL500_.jpg","\/41QOyk60CYL._SL500_.jpg","\/41APjk6FphL._SL500_.jpg","\/41ezKUu7VRL._SL500_.jpg","\/41A1n3K+r5L._SL500_.jpg","\/41aY2T8lEOL._SL500_.jpg","\/419Ca1V6HZL._SL500_.jpg","\/41zQkYyLPzL._SL500_.jpg","\/41YpHcyxiTL._SL500_.jpg","\/41-tKN5mt6L._SL500_.jpg","\/419Mv6m55IL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815631085","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\/4815631085","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D\/","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"E8MM1","s":"s"});</script></p>
<div id="msmaflink-E8MM1">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --> --></p><p>The post <a href="https://caymezon.com/aws-handson-console-ec2-tomcat/">EC2サーバ構築ハンズオン：AWSコンソールでTomcatを構築する手順【EC2 Tomcat / CloudFormation版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-console-ec2-tomcat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>EC2サーバ構築をIaC化：CloudFormationでEC2 Tomcatを自動デプロイする手順【コンソール版との比較付き】</title>
		<link>https://caymezon.com/aws-handson-cloudformation-ec2-tomcat/</link>
					<comments>https://caymezon.com/aws-handson-cloudformation-ec2-tomcat/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sun, 29 Mar 2026 04:44:49 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[APサーバー]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWSCLI]]></category>
		<category><![CDATA[CloudFormation]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[ec2サーバ構築]]></category>
		<category><![CDATA[IaC]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[UserData]]></category>
		<category><![CDATA[セキュリティグループ]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20311</guid>

					<description><![CDATA[<p>はじめに 「コンソールで手動構築できた構成を、コードで再現したい」——それを実現するのが AWS CloudFormation です。 この記事では、template.yaml 1ファイルにリソース構成を定義し、コマンド [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-cloudformation-ec2-tomcat/">EC2サーバ構築をIaC化：CloudFormationでEC2 Tomcatを自動デプロイする手順【コンソール版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>「コンソールで手動構築できた構成を、コードで再現したい」——それを実現するのが <strong>AWS CloudFormation</strong> です。</p>
<p>この記事では、<code>template.yaml</code> 1ファイルにリソース構成を定義し、<strong>コマンド1本でEC2 Tomcat環境を一括構築するハンズオン</strong>を紹介します。コンソール版（<a href="https://caymezon.com/aws-handson-console-ec2-tomcat/">AWSコンソール版ハンズオン</a>）と全く同じ構成を、CloudFormationで自動化します。</p>
<pre><code class="language-plaintext">ローカル環境（VSCode）
  ├── template.yaml（CloudFormationテンプレート）
  └── AWS CLI コマンド
        ↓ スタック作成（コマンド1本）
AWS環境
  ├── IAMロール（SSM接続用）                       ← template.yamlで定義
  ├── セキュリティグループ（SSH:22・Tomcat:8080）    ← template.yamlで定義
  └── EC2インスタンス（t2.micro / AL2023 + Java17 + Tomcat10）← template.yamlで定義</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li><code>template.yaml</code> へのリソース定義（IAMロール・セキュリティグループ・EC2インスタンス）</li>
<li><code>!Ref</code> / <code>!Sub</code> / <code>!GetAtt</code> を使ったリソース間参照</li>
<li><code>aws cloudformation create-stack</code> コマンド1本での全リソース一括デプロイ</li>
<li><code>aws cloudformation delete-stack</code> コマンド1本での全リソース一括削除</li>
</ul>
<p><strong>このハンズオンの特徴：</strong></p>
<ul>
<li>コンソール版では20〜30分かかった手動作業が、コマンド1本（約5〜10分）で完了する</li>
<li><code>delete-stack</code> 1本で依存関係を考慮した順番で全リソースを自動削除できる</li>
</ul>
<hr>
<p><!-- ![CloudFormationスタック作成完了画面](images/cfn-create-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">CloudFormation vs コンソール：どれだけ違うか</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>CloudFormation</th>
<th>コンソール（手動）</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>IAMロール作成</strong></td>
<td><code>--parameters</code> で値を渡すだけ</td>
<td>画面でポチポチ（5クリック以上）</td>
</tr>
<tr>
<td><strong>セキュリティグループ作成</strong></td>
<td>同上</td>
<td>画面でポチポチ</td>
</tr>
<tr>
<td><strong>EC2起動（UserData含む）</strong></td>
<td>同上</td>
<td>画面でポチポチ</td>
</tr>
<tr>
<td><strong>全リソースのデプロイ</strong></td>
<td>コマンド1本（5〜10分）</td>
<td>複数画面を行き来（20〜30分）</td>
</tr>
<tr>
<td><strong>リソース削除</strong></td>
<td><code>delete-stack</code> 1本</td>
<td>依存関係順に個別削除（4ステップ）</td>
</tr>
<tr>
<td><strong>再現性</strong></td>
<td>高い（同じ構成を何度でも再現可能）</td>
<td>低い（手動ミスのリスクがある）</td>
</tr>
<tr>
<td><strong>バージョン管理</strong></td>
<td>Gitで管理可能</td>
<td>不可（過去の設定を記録できない）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">キーワード解説</span></h2>
<table>
<thead>
<tr>
<th>用語</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>CloudFormation</strong></td>
<td>AWSが提供するIaC（Infrastructure as Code）サービス。YAMLテンプレートでリソースをコード化する</td>
</tr>
<tr>
<td><strong>スタック</strong></td>
<td>CloudFormationが管理するリソースのまとまり。作成・削除・更新をまとめて操作できる</td>
</tr>
<tr>
<td><strong><code>!Ref</code></strong></td>
<td>CloudFormation組み込み関数。パラメータの値やリソースのIDを参照する</td>
</tr>
<tr>
<td><strong><code>!Sub</code></strong></td>
<td>CloudFormation組み込み関数。文字列内の <code>${変数}</code> を展開する</td>
</tr>
<tr>
<td><strong><code>!GetAtt</code></strong></td>
<td>CloudFormation組み込み関数。リソースの属性値（ARNなど）を取得する</td>
</tr>
<tr>
<td><strong>CAPABILITY_NAMED_IAM</strong></td>
<td>名前付きIAMリソースを作成する場合に必要な明示的な許可フラグ</td>
</tr>
<tr>
<td><strong>UserData</strong></td>
<td>EC2の初回起動時のみ自動実行されるシェルスクリプト</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc4">前提条件</span></h2>
<table>
<thead>
<tr>
<th>ツール</th>
<th>確認コマンド</th>
<th>最低バージョン目安</th>
</tr>
</thead>
<tbody>
<tr>
<td>AWS CLI v2</td>
<td><code>aws --version</code></td>
<td>2.x</td>
</tr>
<tr>
<td>Git</td>
<td><code>git --version</code></td>
<td>2.x</td>
</tr>
<tr>
<td>VSCode</td>
<td>-</td>
<td>-</td>
</tr>
</tbody>
</table>
<p>AWS認証確認:</p>
<pre><code class="language-cmd">aws sts get-caller-identity</code></pre>
<p>アカウントIDが表示されれば認証設定済みです。</p>
<hr>
<h2><span id="toc5">template.yaml の全文</span></h2>
<p>以下が今回使用する <code>template.yaml</code> の全文です。プロジェクトフォルダ（<code>ec2-tomcat-web/</code>）直下に配置します。</p>
<blockquote>
<p><strong>⚠️ コピー前に確認</strong>: <code>Default: &#39;123.456.78.901/32&#39;</code> の箇所は<strong>ダミーIPです</strong>。このまま使うとスタック作成は成功しますが、SSHもブラウザもアクセスできません。<code>--parameters</code> でIPを上書きするか（推奨）、Defaultを自分のIPに書き換えてから使ってください。</p>
</blockquote>
<pre><code class="language-yaml">AWSTemplateFormatVersion: '2010-09-09'
Description: 'EC2 + Tomcat Application Server Hands-on (Phase 1-2)'

Parameters:
  KeyName:
    Type: String
    Default: 'my-ec2-tomcat-key'
    Description: Name of an existing EC2 KeyPair

  MyIP:
    Type: String
    Default: '123.456.78.901/32'
    Description: Your IP address to allow SSH and Tomcat access (CIDR format e.g. 203.0.113.1/32)

Resources:
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: 'my-ec2-tomcat-role'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Tags:
        - Key: Name
          Value: 'my-ec2-tomcat-role'

  # Instance Profile: wrapper that attaches the IAM role to EC2
  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: 'my-ec2-tomcat-profile'
      Roles:
        - !Ref EC2Role

  # Security Group: allow SSH(22) and Tomcat(8080) from MyIP only
  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'my EC2 Tomcat hands-on SG'
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref MyIP
          Description: SSH access from my IP
        - IpProtocol: tcp
          FromPort: 8080
          ToPort: 8080
          CidrIp: !Ref MyIP
          Description: Tomcat HTTP access from my IP
      Tags:
        - Key: Name
          Value: 'my-ec2-tomcat-sg'

  # EC2 Instance: Amazon Linux 2023 + Java 17 + Tomcat 10 (installed via UserData)
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}'
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      SecurityGroupIds:
        - !Ref EC2SecurityGroup
      IamInstanceProfile: !Ref EC2InstanceProfile
      # UserData: shell script executed automatically on first boot
      UserData:
        Fn::Base64: |
          #!/bin/bash
          dnf update -y
          dnf install -y java-17-amazon-corretto

          useradd -m -d /opt/tomcat -U -s /bin/false tomcat

          TOMCAT_VERSION="10.1.25"
          cd /tmp
          wget -q "https://archive.apache.org/dist/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz" \
            -O apache-tomcat.tar.gz
          tar xzf apache-tomcat.tar.gz
          mv "apache-tomcat-${TOMCAT_VERSION}" /opt/tomcat/latest
          chown -R tomcat:tomcat /opt/tomcat
          chmod -R u+x /opt/tomcat/latest/bin

          cat &gt; /etc/systemd/system/tomcat.service &lt;&lt; 'SVCEOF'
          [Unit]
          Description=Apache Tomcat Web Application Container
          After=network.target

          [Service]
          Type=forking
          User=tomcat
          Group=tomcat
          Environment="JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto"
          Environment="CATALINA_HOME=/opt/tomcat/latest"
          Environment="CATALINA_BASE=/opt/tomcat/latest"
          Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
          Environment="JAVA_OPTS=-Xms256m -Xmx512m"
          ExecStart=/opt/tomcat/latest/bin/startup.sh
          ExecStop=/opt/tomcat/latest/bin/shutdown.sh
          Restart=on-failure

          [Install]
          WantedBy=multi-user.target
          SVCEOF

          systemctl daemon-reload
          systemctl enable tomcat
          systemctl start tomcat

          cat &gt; /opt/tomcat/latest/webapps/ROOT/index.jsp &lt;&lt; 'JSPEOF'
          &lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
          &lt;!DOCTYPE html&gt;
          &lt;html&gt;
          &lt;head&gt;&lt;meta charset="UTF-8"&gt;&lt;title&gt;Tomcat on EC2&lt;/title&gt;&lt;/head&gt;
          &lt;body&gt;
          &lt;h1&gt;Hello from Tomcat on Amazon Linux 2023!&lt;/h1&gt;
          &lt;p&gt;Java Version: &lt;%= System.getProperty("java.version") %&gt;&lt;/p&gt;
          &lt;p&gt;Tomcat Version: &lt;%= application.getServerInfo() %&gt;&lt;/p&gt;
          &lt;/body&gt;
          &lt;/html&gt;
          JSPEOF
          chown tomcat:tomcat /opt/tomcat/latest/webapps/ROOT/index.jsp
      Tags:
        - Key: Name
          Value: 'my-ec2-tomcat-instance'

Outputs:
  InstanceId:
    Description: EC2 Instance ID
    Value: !Ref EC2Instance

  PublicIP:
    Description: Public IP Address
    Value: !GetAtt EC2Instance.PublicIp

  TomcatURL:
    Description: Tomcat URL (open in browser)
    Value: !Sub 'http://${EC2Instance.PublicIp}:8080'

  SSHCommand:
    Description: SSH command (update the .pem path as needed)
    Value: !Sub 'ssh -i C:\Users\username\.ssh\${KeyName}.pem ec2-user@${EC2Instance.PublicIp}'</code></pre>
<p><strong><code>!Ref</code> と <code>!Sub</code> の使い分け:</strong></p>
<table>
<thead>
<tr>
<th>関数</th>
<th>意味</th>
<th>例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>!Ref パラメータ名</code></td>
<td>パラメータの値を参照する</td>
<td><code>!Ref MyIP</code> → <code>203.0.113.1/32</code></td>
</tr>
<tr>
<td><code>!Ref リソースID</code></td>
<td>リソースのIDを参照する</td>
<td><code>!Ref EC2SecurityGroup</code> → <code>sg-xxxxx</code></td>
</tr>
<tr>
<td><code>!Sub &#39;文字列&#39;</code></td>
<td>文字列内の <code>${変数}</code> を展開する</td>
<td><code>!Sub &#39;http://${EC2Instance.PublicIp}:8080&#39;</code> → <code>http://x.x.x.x:8080</code></td>
</tr>
<tr>
<td><code>!GetAtt リソース.属性</code></td>
<td>リソースの属性値を取得する</td>
<td><code>!GetAtt EC2Instance.PublicIp</code> → IPアドレス</td>
</tr>
</tbody>
</table>
<p><strong>Apache版との主な違い（template.yaml）:</strong></p>
<table>
<thead>
<tr>
<th>項目</th>
<th>Apache版</th>
<th>Tomcat版（今回）</th>
</tr>
</thead>
<tbody>
<tr>
<td>セキュリティグループ</td>
<td>SSH(22) + HTTP(80)</td>
<td>SSH(22) + TCP(8080)</td>
</tr>
<tr>
<td>UserData</td>
<td>httpd のインストール</td>
<td>Java17 + Tomcat10 のインストール</td>
</tr>
<tr>
<td>Outputs</td>
<td>WebsiteURL（port 80）</td>
<td>TomcatURL（port 8080）</td>
</tr>
</tbody>
</table>
<p><strong>構築されるリソースと論理ID:</strong></p>
<table>
<thead>
<tr>
<th>リソース</th>
<th>template.yaml上の論理ID</th>
</tr>
</thead>
<tbody>
<tr>
<td>IAMロール</td>
<td><code>EC2Role</code></td>
</tr>
<tr>
<td>インスタンスプロファイル</td>
<td><code>EC2InstanceProfile</code></td>
</tr>
<tr>
<td>セキュリティグループ</td>
<td><code>EC2SecurityGroup</code></td>
</tr>
<tr>
<td>EC2インスタンス</td>
<td><code>EC2Instance</code></td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc6">作業順序</span></h2>
<pre><code class="language-plaintext">⓪ 自分のIPアドレスを確認する（重要）
      ↓
① キーペアを作成する（コンソールで実施）
      ↓
② プロジェクトフォルダに移動する
      ↓
③ スタックを作成する（aws cloudformation create-stack）
      ↓
④ 作成状況・Outputsを確認する
      ↓
⑤ 動作確認（ブラウザ・SSH）
      ↓
⑥ スタックを削除する（aws cloudformation delete-stack）</code></pre>
<hr>
<h2><span id="toc7">【重要】⓪ 自分のIPアドレスを確認する</span></h2>
<p>セキュリティグループで自分のIPのみを許可するために、<strong>正確なIPアドレス</strong>を事前に確認します。</p>
<blockquote>
<p><strong>注意</strong>: <code>curl https://checkip.amazonaws.com</code> で表示されるIPと、EC2への実際の接続元IPが<strong>一致しない場合</strong>があります（ISPやプロキシの経路の違いによる）。</p>
</blockquote>
<h3><span id="toc8">方法A: ルーター管理画面で確認（推奨）</span></h3>
<ol>
<li>ブラウザで以下のURLにアクセスします
<pre><code class="language-plaintext">http://192.168.0.1  または  http://192.168.1.1</code></pre>
</li>
<li>「ネットワークマップ」または「インターネット」項目を開く</li>
<li>**「インターネットIPアドレス」または「WAN IPアドレス」**の値を控えます</li>
</ol>
<h3><span id="toc9">方法B: コマンドで確認</span></h3>
<pre><code class="language-cmd">curl https://checkip.amazonaws.com</code></pre>
<p><strong>控えておく情報</strong>: 自分のIPアドレス（例: <code>203.0.113.1</code>）</p>
<hr>
<h2><span id="toc10">① キーペアの作成（コンソールで実施）</span></h2>
<p>キーペアのみコンソールで作成します。CloudFormationではキーペアのダウンロードが行えないためです。</p>
<p><strong>AWSコンソール → EC2 → キーペア → 「キーペアを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>名前</td>
<td><code>my-ec2-tomcat-key</code></td>
</tr>
<tr>
<td>キーペアのタイプ</td>
<td><strong>RSA</strong></td>
</tr>
<tr>
<td>プライベートキーファイル形式</td>
<td><strong>.pem</strong></td>
</tr>
</tbody>
</table>
<p>ダウンロードされた <code>my-ec2-tomcat-key.pem</code> を保存します。</p>
<pre><code class="language-plaintext">C:\Users\ユーザー名\.ssh\my-ec2-tomcat-key.pem</code></pre>
<blockquote>
<p><strong>前回のキーペアの流用について</strong>: Apacheハンズオンで作成した <code>my-ec2-apache-key</code> を流用する場合、この手順はスキップし、後続コマンドの <code>KeyName</code> の値を <code>my-ec2-apache-key</code> に変更します。</p>
</blockquote>
<hr>
<h2><span id="toc11">② プロジェクトフォルダに移動する</span></h2>
<p>VSCodeのターミナル（CMD）を開き、プロジェクトフォルダに移動します。</p>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\ec2-tomcat-web</code></pre>
<p><code>template.yaml</code> があることを確認します。</p>
<pre><code class="language-cmd">dir template.yaml</code></pre>
<hr>
<h2><span id="toc12">③ スタックの作成</span></h2>
<p>以下のコマンドを実行します。<code>203.0.113.1</code> は⓪で確認した自分のIPアドレスに置き換えてください。</p>
<pre><code class="language-cmd">aws cloudformation create-stack ^
  --stack-name my-ec2-tomcat-stack ^
  --template-body file://template.yaml ^
  --region ap-northeast-1 ^
  --capabilities CAPABILITY_NAMED_IAM ^
  --parameters ^
    ParameterKey=KeyName,ParameterValue=my-ec2-tomcat-key ^
    ParameterKey=MyIP,ParameterValue=203.0.113.1/32</code></pre>
<p><strong>各オプションの説明:</strong></p>
<table>
<thead>
<tr>
<th>オプション</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>--stack-name my-ec2-tomcat-stack</code></td>
<td>スタック名（英字始まり）</td>
</tr>
<tr>
<td><code>--template-body file://template.yaml</code></td>
<td>使用するテンプレートファイル</td>
</tr>
<tr>
<td><code>--region ap-northeast-1</code></td>
<td>デプロイ先リージョン（東京）</td>
</tr>
<tr>
<td><code>--capabilities CAPABILITY_NAMED_IAM</code></td>
<td>名前付きIAMロール作成の明示的な許可</td>
</tr>
<tr>
<td><code>--parameters ...</code></td>
<td>テンプレートのParametersに渡す値</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong><code>^</code> について</strong>: Windowsのコマンドプロンプトで長いコマンドを複数行に分けるための改行エスケープ文字です。1行で書いても動作します。</p>
</blockquote>
<blockquote>
<p><strong>template.yamlのコメントは英語のみ</strong>: 日本語コメントが含まれているとWindows上のAWS CLIがエンコードエラーを起こすため、コメントはすべて英語で記述しています。</p>
</blockquote>
<p>成功すると以下のようなStackIdが表示されます。</p>
<pre><code class="language-json">{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/my-ec2-tomcat-stack/xxxxx"
}</code></pre>
<p><!-- ![スタック作成コマンドの実行結果](images/cfn-create-stack-cmd.jpg) --></p>
<hr>
<h2><span id="toc13">④ 作成完了・Outputsの確認</span></h2>
<p>スタック作成は完了まで<strong>約3〜5分</strong>かかります。ただし、Tomcatのインストール（UserData）はさらに<strong>5〜10分</strong>かかるため、スタック完了後もすぐにブラウザでアクセスできないことがあります。</p>
<h3><span id="toc14">作成状況の確認</span></h3>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-tomcat-stack ^
  --query "Stacks[0].StackStatus" ^
  --output text</code></pre>
<table>
<thead>
<tr>
<th>ステータス</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CREATE_IN_PROGRESS</code></td>
<td>作成中（しばらく待つ）</td>
</tr>
<tr>
<td><code>CREATE_COMPLETE</code></td>
<td>作成完了</td>
</tr>
<tr>
<td><code>CREATE_FAILED</code></td>
<td>作成失敗（トラブルシューティングを参照）</td>
</tr>
<tr>
<td><code>ROLLBACK_COMPLETE</code></td>
<td>失敗してロールバック完了（リソースは作成されていない）</td>
</tr>
</tbody>
</table>
<h3><span id="toc15">Outputs（接続情報）の確認</span></h3>
<p><code>CREATE_COMPLETE</code> になったら以下を実行します。</p>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-tomcat-stack ^
  --query "Stacks[0].Outputs" ^
  --output table</code></pre>
<p>以下のような出力が表示されます。</p>
<pre><code class="language-plaintext">------------------------------------------------------------------------------------------
|                                    DescribeStacks                                      |
+----------------+-----------------------------------------------------------------------+
|  OutputKey     |  OutputValue                                                          |
+----------------+-----------------------------------------------------------------------+
|  InstanceId    |  i-0123456789abcdef0                                                 |
|  PublicIP      |  x.x.x.x                                                             |
|  TomcatURL     |  http://x.x.x.x:8080                                                 |
|  SSHCommand    |  ssh -i C:\Users\...\.ssh\my-ec2-tomcat-key.pem ec2-user@x.x.x.x     |
+----------------+-----------------------------------------------------------------------+</code></pre>
<p><strong>控えておく情報</strong>: <code>PublicIP</code> と <code>TomcatURL</code></p>
<p><!-- ![Outputs確認コマンドの実行結果](images/cfn-outputs-table.jpg) --></p>
<hr>
<h2><span id="toc16">⑤ 動作確認</span></h2>
<h3><span id="toc17">ブラウザで確認</span></h3>
<p>Outputsに表示された <code>TomcatURL</code>（<code>http://x.x.x.x:8080</code>）をブラウザで開きます。</p>
<pre><code class="language-plaintext">Hello from Tomcat on Amazon Linux 2023!
Java Version: 17.x.x
Tomcat Version: Apache Tomcat/10.1.25</code></pre>
<p>が表示されれば成功です。</p>
<blockquote>
<p><strong>表示されない場合</strong>: UserDataのインストール完了まで5〜10分かかります。スタックが <code>CREATE_COMPLETE</code> になった後も少し待ってからアクセスしてください。</p>
</blockquote>
<p><!-- ![ブラウザでのTomcat動作確認](images/tomcat-web-browser.jpg) --></p>
<h3><span id="toc18">SSHで接続して確認</span></h3>
<p>Outputsに表示された <code>SSHCommand</code> を実行します（パスは実際のパスに修正します）。</p>
<pre><code class="language-cmd">ssh -i C:\Users\ユーザー名\.ssh\my-ec2-tomcat-key.pem ec2-user@（PublicIP）</code></pre>
<p>初回接続時の確認には <code>yes</code> を入力します。</p>
<pre><code class="language-bash"># Javaのバージョン確認
java -version

# Tomcatサービスの状態確認（active (running) と表示されれば正常）
sudo systemctl status tomcat

# TomcatのログでERRORがないか確認
sudo tail -50 /opt/tomcat/latest/logs/catalina.out

# UserDataの実行ログ確認（インストール状況を詳細に確認できる）
sudo cat /var/log/cloud-init-output.log

# 8080番ポートのListen確認
sudo ss -tlnp | grep :8080

exit</code></pre>
<h3><span id="toc19">【接続できない場合】真のIPアドレスを確認する</span></h3>
<p><code>curl</code> で確認したIPを設定したが接続できない場合、実際の接続元IPが異なる可能性があります。</p>
<p><strong>セキュリティグループIDを取得:</strong></p>
<pre><code class="language-cmd">aws cloudformation describe-stack-resources ^
  --stack-name my-ec2-tomcat-stack ^
  --query "StackResources[?ResourceType=='AWS::EC2::SecurityGroup'].PhysicalResourceId" ^
  --output text</code></pre>
<p><strong>SSH全開放（一時的・テスト用）:</strong></p>
<pre><code class="language-cmd">aws ec2 authorize-security-group-ingress ^
  --group-id sg-XXXXXXXXX ^
  --protocol tcp ^
  --port 22 ^
  --cidr 0.0.0.0/0 ^
  --region ap-northeast-1</code></pre>
<p>SSH接続して真のIPを確認します。</p>
<pre><code class="language-bash">echo $SSH_CLIENT
# 出力例: 203.0.113.1 17508 22
# 先頭の値が真の接続元IP
exit</code></pre>
<p>確認後、全開放を削除して真のIPで制限し直します。</p>
<pre><code class="language-cmd">rem 全開放を削除
aws ec2 revoke-security-group-ingress ^
  --group-id sg-XXXXXXXXX ^
  --protocol tcp ^
  --port 22 ^
  --cidr 0.0.0.0/0 ^
  --region ap-northeast-1

rem 真のIPで再制限
aws ec2 authorize-security-group-ingress ^
  --group-id sg-XXXXXXXXX ^
  --protocol tcp ^
  --port 22 ^
  --cidr 真のIP/32 ^
  --region ap-northeast-1</code></pre>
<hr>
<h2><span id="toc20">⑥ スタックの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ず削除してください。</strong></p>
<p>CloudFormationはスタック削除で全リソースを一括削除できます。手動でリソースを1つ1つ削除する必要はありません。</p>
<pre><code class="language-cmd">aws cloudformation delete-stack ^
  --stack-name my-ec2-tomcat-stack ^
  --region ap-northeast-1</code></pre>
<p>削除の進行状況を確認します（完了まで約3〜5分）。</p>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-tomcat-stack ^
  --query "Stacks[0].StackStatus" ^
  --output text</code></pre>
<table>
<thead>
<tr>
<th>ステータス</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>DELETE_IN_PROGRESS</code></td>
<td>削除中（しばらく待つ）</td>
</tr>
<tr>
<td><code>DELETE_FAILED</code></td>
<td>削除失敗（トラブルシューティングを参照）</td>
</tr>
</tbody>
</table>
<p>削除完了の確認（以下のエラーが表示されれば削除完了）。</p>
<pre><code class="language-cmd">aws cloudformation describe-stacks ^
  --stack-name my-ec2-tomcat-stack ^
  --region ap-northeast-1</code></pre>
<pre><code class="language-plaintext">An error occurred (ValidationError) when calling the DescribeStacks operation:
Stack with id my-ec2-tomcat-stack does not exist</code></pre>
<p>このメッセージが表示されれば削除完了です。キーペアはCloudFormationで管理していないため、手動で削除します。</p>
<p><strong>EC2 → キーペア → <code>my-ec2-tomcat-key</code> を選択 → 「アクション」→「削除」</strong></p>
<p>ローカルの <code>.pem</code> ファイルも削除します。</p>
<hr>
<h2><span id="toc21">コンソール版との比較</span></h2>
<p>コンソール版でIAMロール・セキュリティグループ・EC2を手動作成した手順が、CloudFormationではすべて <code>template.yaml</code> に定義されています。</p>
<table>
<thead>
<tr>
<th>CFnの記述</th>
<th>コンソールでやること</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>EC2Role</code>（IAMロール定義）</td>
<td>IAM → ロールを作成（AmazonSSMManagedInstanceCore付与）</td>
</tr>
<tr>
<td><code>EC2SecurityGroup</code>（SGルール定義）</td>
<td>EC2 → セキュリティグループを作成（SSH/TCP8080各ルール追加）</td>
</tr>
<tr>
<td><code>EC2Instance</code>（UserData含む）</td>
<td>EC2 → インスタンスを起動（UserData貼り付け・キーペア選択）</td>
</tr>
<tr>
<td><code>--parameters MyIP=...</code></td>
<td>セキュリティグループのインバウンドルールに自分のIPを入力</td>
</tr>
<tr>
<td><code>delete-stack</code></td>
<td>インスタンス終了 → SG削除 → IAMロール削除（順番が重要）</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>コンソール版で詰まりやすいポイント:</strong><br />UserDataのTomcatインストールが5〜10分かかるため、コンソール版では「インスタンスが動いているのにアクセスできない」状態が続きます。<br />CloudFormationでも待ち時間は同じですが、デプロイ自体はコマンド1本で完了します。</p>
</blockquote>
<hr>
<h2><span id="toc22">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CREATE_FAILED</code> になる</td>
<td>キーペアが存在しない</td>
<td>コンソールでキーペアを作成し、<code>--parameters KeyName=...</code> の値を確認</td>
</tr>
<tr>
<td><code>CREATE_FAILED</code> になる</td>
<td><code>CAPABILITY_NAMED_IAM</code> が不足</td>
<td>コマンドに <code>--capabilities CAPABILITY_NAMED_IAM</code> が含まれているか確認</td>
</tr>
<tr>
<td><code>stackName failed to satisfy regular expression pattern</code></td>
<td>スタック名が数字始まり</td>
<td>CloudFormationのスタック名は<strong>英字で始まる</strong>必要がある</td>
</tr>
<tr>
<td><code>Unable to load paramfile, text contents could not be decoded</code></td>
<td>template.yaml に日本語が含まれている</td>
<td>template.yaml のコメントを<strong>すべて英語</strong>で記述する（Windows環境の既知の問題）</td>
</tr>
<tr>
<td>ブラウザで8080に接続できない</td>
<td>UserDataのインストールが未完了</td>
<td>スタック完了後5〜10分待つ。SSHで <code>sudo cat /var/log/cloud-init-output.log</code> を確認</td>
</tr>
<tr>
<td>Tomcatは起動しているがJSPが動かない</td>
<td>index.jspがTomcat起動後に配置されなかった</td>
<td><code>sudo systemctl restart tomcat</code> でTomcatを再起動する</td>
</tr>
<tr>
<td>SSH接続タイムアウト</td>
<td>セキュリティグループのIP設定誤り</td>
<td>SGのインバウンドルールでSSH(22)のIPを確認</td>
</tr>
<tr>
<td><code>DELETE_FAILED</code> になる</td>
<td>手動でリソースを変更したためCFnが管理できない</td>
<td>コンソールで該当リソースを確認して手動削除後、<code>delete-stack</code> を再実行</td>
</tr>
<tr>
<td><code>ValidationError: Template format error</code></td>
<td>template.yamlのインデントが崩れている</td>
<td>YAMLはインデントが厳格。スペース2つ単位でインデントを確認する</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc23">まとめ</span></h2>
<p>今回のハンズオンで実現できたこと：</p>
<table>
<thead>
<tr>
<th>確認項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>IaCの体験</strong></td>
<td>template.yaml 1ファイルにIAMロール・SG・EC2をコードで定義</td>
</tr>
<tr>
<td><strong>一括デプロイ</strong></td>
<td><code>create-stack</code> コマンド1本でコンソール版と同じ構成を5〜10分で構築</td>
</tr>
<tr>
<td><strong>Outputs活用</strong></td>
<td>デプロイ後にIPアドレス・TomcatURL・SSHコマンドを <code>describe-stacks</code> で自動取得</td>
</tr>
<tr>
<td><strong>一括削除</strong></td>
<td><code>delete-stack</code> 1本でリソースの依存関係を自動解決して全削除</td>
</tr>
</tbody>
</table>
<h3><span id="toc24">CloudFormationのメリットを実感できたポイント</span></h3>
<ul>
<li>コンソール版では20〜30分かかった作業がコマンド1本（5〜10分）で完了した</li>
<li><code>delete-stack</code> で依存関係を気にせず全リソースを一括削除できた</li>
<li><code>template.yaml</code> をGitで管理することで、環境構成の変更履歴が残せる</li>
</ul>
<hr>
<h2><span id="toc25">コンソール版と比較してみる</span></h2>
<p>CloudFormationが裏で何をやっているか、同じ構成をAWSコンソールのみで構築する手順をまとめました。コンソール版ではキーペア・IAMロール・セキュリティグループ・EC2を依存関係順に手動で作成する必要があり、各リソースの役割と繋がりが視覚的に理解できます。</p>
<p><a href="https://caymezon.com/aws-handson-console-ec2-tomcat/">EC2サーバ構築ハンズオン：AWSコンソールでTomcatを構築する手順</a></p>
<hr>
<h2><span id="toc26">関連記事</span></h2>
<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運用入門 改訂第2版 押さえておきたいAWSの基本と運用ノウハウ [AWS深掘りガイド]","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51AAOubymTL._SL500_.jpg","\/51VMG6YKHdL._SL500_.jpg","\/41EdPB8azAL._SL500_.jpg","\/41v2JFE-9jL._SL500_.jpg","\/41FEEqR-yDL._SL500_.jpg","\/41JfZAdnTPL._SL500_.jpg","\/41vGK0czQrL._SL500_.jpg","\/41-SnYtz2aL._SL500_.jpg","\/41sPrV5fi3L._SL500_.jpg","\/41p7JtvYJ1L._SL500_.jpg","\/4169GVNTs8L._SL500_.jpg","\/41BPI5HP3zL._SL500_.jpg","\/41QOyk60CYL._SL500_.jpg","\/41APjk6FphL._SL500_.jpg","\/41ezKUu7VRL._SL500_.jpg","\/41A1n3K+r5L._SL500_.jpg","\/41aY2T8lEOL._SL500_.jpg","\/419Ca1V6HZL._SL500_.jpg","\/41zQkYyLPzL._SL500_.jpg","\/41YpHcyxiTL._SL500_.jpg","\/41-tKN5mt6L._SL500_.jpg","\/419Mv6m55IL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815631085","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\/4815631085","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D\/","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%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"E8MM1","s":"s"});</script></p>
<div id="msmaflink-E8MM1">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --> --></p><p>The post <a href="https://caymezon.com/aws-handson-cloudformation-ec2-tomcat/">EC2サーバ構築をIaC化：CloudFormationでEC2 Tomcatを自動デプロイする手順【コンソール版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-cloudformation-ec2-tomcat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Claude Code vs Gemini CLI vs Codex CLI｜できること・できないことを徹底比較【2026年3月版】</title>
		<link>https://caymezon.com/codex-cli-vs-claude-code-vs-gemini-cli/</link>
					<comments>https://caymezon.com/codex-cli-vs-claude-code-vs-gemini-cli/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sat, 28 Mar 2026 07:40:53 +0000</pubDate>
				<category><![CDATA[AI & Next Tech]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Anthropic]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[Codex CLI]]></category>
		<category><![CDATA[Gemini CLI]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[OpenAI]]></category>
		<category><![CDATA[ターミナル]]></category>
		<category><![CDATA[開発効率化]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20305</guid>

					<description><![CDATA[<p>はじめに 「ターミナル型AIエージェントが乱立していて、どれを選べばいいか分からない…」 Claude Code（Anthropic）、Gemini CLI（Google）、Codex CLI（OpenAI）——三大AI [&#8230;]</p>
<p>The post <a href="https://caymezon.com/codex-cli-vs-claude-code-vs-gemini-cli/">Claude Code vs Gemini CLI vs Codex CLI｜できること・できないことを徹底比較【2026年3月版】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>「ターミナル型AIエージェントが乱立していて、どれを選べばいいか分からない…」</p>
<p>Claude Code（Anthropic）、Gemini CLI（Google）、Codex CLI（OpenAI）——三大AI企業がそれぞれターミナル型エージェントをリリースし、2026年3月現在、どれを使うべきか迷っているエンジニアが急増しています。</p>
<p>どれも「ターミナルから自律的にファイルを編集・コマンドを実行できる」という点は同じです。しかし<strong>設計思想・得意分野・コスト</strong>が大きく異なります。</p>
<p>本記事では3つのツールを<strong>同じ観点で徹底的に比較</strong>します。「どれを選ぶべきか」の判断材料として、ぜひ参考にしてください。</p>
<p><!-- ![3ツール比較](images/three-tools-comparison.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%2BClaude%2BCode%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D359XA1WJGH366%26sprefix%3D%25E6%259C%25AC%2Bclaude%2Bcode%252Caps%252C183%26ref%3Dnb_sb_noss_2" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 Claude Code]</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":"実践Claude Code入門―現場で活用するためのAIコーディングの思考法","b":"技術評論社","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51kkd9SNiVL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4297153548","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\/4297153548","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\/%E5%AE%9F%E8%B7%B5Claude%20Code%E5%85%A5%E9%96%80%E2%80%95%E7%8F%BE%E5%A0%B4%E3%81%A7%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95\/","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=%E5%AE%9F%E8%B7%B5Claude%20Code%E5%85%A5%E9%96%80%E2%80%95%E7%8F%BE%E5%A0%B4%E3%81%A7%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"lxeQQ","s":"s"});</script></p>
<div id="msmaflink-lxeQQ">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></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%2BGemini%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D2PFMA06JS9D1M%26sprefix%3D%25E6%259C%25AC%2Bgemini%252Caps%252C227%26ref%3Dnb_sb_noss_1" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 Gemini]</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":"この1冊でしっかりわかる Geminiの教科書","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51X1I1kbN-L._SL500_.jpg","\/41kmDYgoMpL._SL500_.jpg","\/41sNP8dLGoL._SL500_.jpg","\/41iiyShlpbL._SL500_.jpg","\/41kSFn+mo1L._SL500_.jpg","\/41LPk+9l7EL._SL500_.jpg","\/41mBxEkk83L._SL500_.jpg","\/41VqrVXO8yL._SL500_.jpg","\/41Iv8qNWfKL._SL500_.jpg","\/417zP-i82SL._SL500_.jpg","\/41Vun754v6L._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815637660","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\/4815637660","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\/%E3%81%93%E3%81%AE1%E5%86%8A%E3%81%A7%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8B%20Gemini%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8\/","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=%E3%81%93%E3%81%AE1%E5%86%8A%E3%81%A7%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8B%20Gemini%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"4MXUc","s":"s"});</script></p>
<div id="msmaflink-4MXUc">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc2">基本スペック比較</span></h2>
<p>まずは数値で比べます。</p>
<table>
<thead>
<tr>
<th>項目</th>
<th>Claude Code</th>
<th>Gemini CLI</th>
<th>Codex CLI</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>開発元</strong></td>
<td>Anthropic</td>
<td>Google</td>
<td>OpenAI</td>
</tr>
<tr>
<td><strong>最新安定版</strong></td>
<td>最新版（2026/03時点）</td>
<td>v0.34.0（2026/03時点）</td>
<td>v0.117.0（2026/03時点）</td>
</tr>
<tr>
<td><strong>デフォルトモデル</strong></td>
<td>Sonnet 4.6（Opus 4.6も選択可）</td>
<td>Gemini 2.5 Flash</td>
<td>gpt-5.4（gpt-5.3-codexも選択可）</td>
</tr>
<tr>
<td><strong>コンテキストウィンドウ</strong></td>
<td>約20万トークン</td>
<td><strong>最大100万トークン</strong></td>
<td><strong>最大100万トークン</strong>（gpt-5.3-codex使用時）</td>
</tr>
<tr>
<td><strong>無料枠</strong></td>
<td>なし</td>
<td><strong>あり（1,000req/日）</strong></td>
<td>なし</td>
</tr>
<tr>
<td><strong>月額費用</strong></td>
<td>Pro: $20/月〜</td>
<td>個人アカウントで無料</td>
<td>APIキー従量課金のみ</td>
</tr>
<tr>
<td><strong>オープンソース</strong></td>
<td>なし</td>
<td>あり（Apache-2.0）</td>
<td>あり（Apache-2.0）</td>
</tr>
<tr>
<td><strong>SWE-bench Verified</strong></td>
<td>Sonnet 4.6: <strong>72.7%</strong> / Opus 4.6: <strong>80.8%</strong></td>
<td>Gemini 2.5 Flash: <strong>78%</strong></td>
<td>※後述</td>
</tr>
<tr>
<td><strong>Terminal-Bench 2.0</strong></td>
<td>65.4%</td>
<td>未公開</td>
<td><strong>77.3%</strong></td>
</tr>
<tr>
<td><strong>サンドボックス実行</strong></td>
<td>なし</td>
<td>なし</td>
<td><strong>あり</strong></td>
</tr>
</tbody>
</table>
<h3><span id="toc3">ベンチマークについての補足</span></h3>
<p>SWE-bench Verifiedはコーディングタスク全般の能力評価です。一方、<strong>Terminal-Bench 2.0</strong>はターミナル操作・シェルスクリプト実行に特化した評価です。Codex CLIはターミナル特化のベンチマークで最高スコアを記録しています。</p>
<p>※OpenAIはSWE-bench Verifiedにトレーニングデータ汚染が発見されたとして報告を停止。Codex CLIの現行モデル比較にはSWE-bench ProとTerminal-Bench 2.0が使われています。</p>
<h3><span id="toc4">料金の詳細</span></h3>
<p><strong>Claude Code:</strong></p>
<pre><code class="language-plaintext">Proプラン: $20/月（5時間ごとに約10〜40プロンプト制限）
Max 5x:   $100/月（5倍の使用量）
Max 20x:  $200/月（20倍の使用量）
※ Web版・Desktop版・Claude Codeで使用量を共有</code></pre>
<p><strong>Gemini CLI:</strong></p>
<pre><code class="language-plaintext">無料枠:   0円（Googleアカウントのみ）
          └→ 60リクエスト/分、1,000リクエスト/日
          └→ デフォルト: Gemini 2.5 Flash
API利用:  従量課金（Google AI Studio経由）
          └→ Gemini 3 Flash: 高コスパ（SWE-bench Verified 78%）</code></pre>
<p><strong>Codex CLI:</strong></p>
<pre><code class="language-plaintext">無料枠:   なし（APIキー or ChatGPT Plus必須）
Plus:     $20/月（30〜150メッセージ/5時間）
Pro:      $200/月（300〜1,500メッセージ/5時間）
API従量:  gpt-5.4-mini: 入力 $1.25/Mトークン
          → 使いすぎると青天井になる点に注意</code></pre>
<hr>
<h2><span id="toc5">Claude Codeの強み——他2ツールにできないこと</span></h2>
<h3><span id="toc6">1. 高い自律性と粘り強いデバッグ</span></h3>
<p>Claude Codeの最大の強みは**「テストを回す→エラーが出る→自分で修正する→またテストする」** というループの粘り強さです。</p>
<pre><code class="language-plaintext">Claude Codeのデバッグループ:
1. エラーを検知
2. 原因を深く推論（Thinkingモード）
3. 修正案を実装
4. テストを再実行
5. 成功するまで繰り返す（ほとんど手動介入不要）</code></pre>
<p>実際のベンチマーク比較（あるコーディングタスク）：</p>
<pre><code class="language-plaintext">Claude Code: 1h17m で完了、コスト $4.80（全自動）
Gemini CLI: より長い時間、コスト $7.06（途中で手動介入が必要なケースも）</code></pre>
<p><strong>Gemini CLI・Codex CLIの課題:</strong> どちらも修正を繰り返すと同じ間違いをループしたり、指示を無視して大幅な書き換えをしてしまうことがあります。</p>
<h3><span id="toc7">2. 洗練されたコードの品質</span></h3>
<p>Claudeは「コーディングの職人気質」が評価されており、生成されるコードが非常に洗練されています。</p>
<pre><code class="language-plaintext">Claude Code: 簡潔で読みやすいコード
             冗長な記述を避ける傾向
             命名規則やスタイルに一貫性がある

Gemini CLI:  実用的だが、時に冗長なボイラープレートを出力
Codex CLI:   gpt-5.4使用時は高品質だが、モデル選択に依存する</code></pre>
<h3><span id="toc8">3. 深い思考（Thinkingモード）による自己修正</span></h3>
<p>Claude Codeは、コードを書く前に**「なぜその設計にするのか」を深く自問自答**します。</p>
<pre><code class="language-plaintext">Claudeの思考プロセス:
1. 要件の本質を理解
2. 複数の実装パターンを検討
3. トレードオフを評価
4. 最適解を選択してから実装

→ 結果: 一発で動くコードを書く確率が高い
   SWE-bench Verified: Opus 4.6 で 80.8%（3ツール中最高）</code></pre>
<h3><span id="toc9">4. 音声入力モード（2026年3月〜）</span></h3>
<p>2026年3月のアップデートで、Claude Codeに<strong>音声入力モード</strong>が追加されました。</p>
<pre><code class="language-plaintext">/voice コマンドでプッシュトゥトーク方式の音声入力が可能
→ ターミナルでの長い指示も音声で素早く入力できる
→ ハンズフリーでのコーディングが可能に</code></pre>
<p>Gemini CLI・Codex CLIでは現時点でネイティブ音声モードは未搭載です。</p>
<h3><span id="toc10">5. VS Code + JetBrains 両方に公式IDE統合</span></h3>
<pre><code class="language-plaintext">Claude Code:  VS Code拡張機能（公式）+ JetBrains拡張機能（公式）
Gemini CLI:   VS Code拡張機能あり
Codex CLI:    ターミナル中心（公式IDE統合なし）</code></pre>
<p>IntelliJ・WebStorm等のJetBrains系IDEを使う開発者には特に優位です。</p>
<h3><span id="toc11">6. 定額制による費用の予測しやすさ</span></h3>
<pre><code class="language-plaintext">Claude Code Pro: $20/月で使用量の上限がある
                 → 月の予算が読みやすく、予算オーバーが起きない

Codex CLI:       APIキー従量課金で青天井になる可能性
Gemini CLI:      無料枠を超えると従量課金に</code></pre>
<hr>
<h2><span id="toc12">Gemini CLIの強み——他2ツールにできないこと</span></h2>
<h3><span id="toc13">1. 完全無料から始められる</span></h3>
<p>これがGemini CLIの最大のアドバンテージです。</p>
<pre><code class="language-plaintext">Gemini CLI:
✅ Googleアカウントだけで今日から無料でスタート
✅ 1,000リクエスト/日で日常的な開発には十分
✅ SWE-bench Verified 78%（Sonnet 4.6の72.7%を上回る）という高精度が無料で使える

Claude Code: 別途サブスク（$20/月〜）が必要
Codex CLI:   APIキー or ChatGPT Plus（$20/月〜）が必要</code></pre>
<h3><span id="toc14">2. 超大規模プロジェクトの「一括」把握</span></h3>
<pre><code class="language-plaintext">Gemini CLIのコンテキスト: 最大100万トークン
  └→ 数万行のコードベースを丸ごと読み込める
  └→ ファイル間の依存関係や矛盾を一括検出可能

Claude Code: 約20万トークン
  └→ 大規模プロジェクトでは記憶を圧縮（Compaction）
  └→ 圧縮により細部の記憶が抜け落ちることがある

Codex CLI:  gpt-5.3-codexで100万トークン対応
  └→ ただし gpt-5.4（デフォルト）は100万トークン未対応
  └→ モデルを指定変更する必要がある</code></pre>
<p>Gemini CLIは<strong>デフォルトのモデルから100万トークンが使える</strong>点が優位です。</p>
<p><strong>実際の活用例:</strong></p>
<pre><code class="language-bash"># 数万行のコードベースを丸ごと分析
&gt; このプロジェクト全体を俯瞰して、
&gt; アーキテクチャ上の矛盾点と将来の拡張に向けた改善提案を教えて</code></pre>
<h3><span id="toc15">3. Google検索とのリアルタイム統合</span></h3>
<pre><code class="language-bash"># 昨日リリースされたライブラリの最新仕様を調べながらコードを書く
&gt; /search React 19 useOptimistic の使い方

# 最新のAWSサービスを使った実装
&gt; 最新のLambda関数URLの仕様を確認して、このコードに組み込んで</code></pre>
<p>Claude Code・Codex CLIはいずれも学習データに基づく推論がメインで、最新情報へのリアルタイムアクセスではGemini CLIが優位です（Codex CLIもWeb検索機能はあるが、Googleほど検索精度が高くない）。</p>
<h3><span id="toc16">4. Plan Mode（v0.30.0〜デフォルト有効）</span></h3>
<pre><code class="language-plaintext">Gemini CLI:
✅ 実行前に必ず「実装計画」を提示し、ユーザーが承認してから動く
✅ v0.30.0以降はデフォルト有効
✅ 外部エディタでプランを編集してから実行する機能もあり

Claude Code: 近い機能はあるが、Plan Modeとして独立していない
Codex CLI:   /plan コマンドで呼び出せるが、デフォルトではない</code></pre>
<h3><span id="toc17">5. スキル（Skills）機能——ワークフローのチーム共有</span></h3>
<p>Gemini CLI独自の拡張機能です。</p>
<pre><code class="language-plaintext">スキルとは:
- 定型的なワークフローや複雑な手順を「スキル」として定義・共有できる
- タスクに適合するスキルをGemini CLIが自動検出して起動
- チーム全体での開発標準化が容易になる

管理コマンド:
/skills list    → 利用可能なスキルを一覧表示
/skills enable  → スキルを有効化
/skills disable → スキルを無効化</code></pre>
<h3><span id="toc18">6. マルチモーダル（動画・音声）の優位性</span></h3>
<pre><code class="language-plaintext">Gemini CLI（Geminiモデル）:
✅ 動画ファイルを渡してバグを修正させることが可能
✅ 画像・音声・PDFなど多様なメディアに対応

Claude Code: スクリーンショット（画像）解析は得意
Codex CLI:  画像入力に対応。動画・音声はGeminiが先行</code></pre>
<h3><span id="toc19">7. コスト効率（大規模タスク）</span></h3>
<pre><code class="language-plaintext">Gemini 2.5 Flash（デフォルト）:
- SWE-bench Verified スコア: 78%（3ツール中最高水準）
- 無料枠: 1,000リクエスト/日
- → 品質を保ちながら大量処理できる</code></pre>
<hr>
<h2><span id="toc20">Codex CLIの強み——他2ツールにできないこと</span></h2>
<h3><span id="toc21">1. ターミナル作業能力が業界最高水準</span></h3>
<p>Terminal-Bench 2.0（ターミナル操作・シェルスクリプトの実行能力を評価するベンチマーク）での比較：</p>
<pre><code class="language-plaintext">Terminal-Bench 2.0:
Codex CLI (gpt-5.3-codex): 77.3%  ← 最高
Claude Code (Opus 4.6):    65.4%
Gemini CLI:                未公開</code></pre>
<p>シェル操作・コマンドライン作業が<strong>本職</strong>のツールです。</p>
<h3><span id="toc22">2. OSネイティブのサンドボックス実行</span></h3>
<p>Codex CLIにしかない最も特徴的な機能です。</p>
<pre><code class="language-plaintext">Codex CLI:
✅ OSネイティブのサンドボックスでコマンド実行を完全隔離
✅ approval-policy=never でも安全な完全自動化が可能
✅ ワークスペース内に操作範囲を限定できる

Claude Code: サンドボックスなし
Gemini CLI:  サンドボックスなし</code></pre>
<p>これにより、他2ツールが「安全のためにfull-autoは危険」なのに対し、Codex CLIは<strong>サンドボックスが有効な状態でfull-auto</strong>が実現できます。</p>
<h3><span id="toc23">3. 承認モードの細かい制御（4段階）</span></h3>
<pre><code class="language-plaintext">Codex CLI の承認モード:
on-request（デフォルト）: ワークスペース外の操作のみ確認
untrusted:               変更・破壊的操作を全て確認（読み取りは自動）
never:                   全ての承認をスキップ（サンドボックスは有効）
dangerously-bypass:      全制限を解除（隔離環境専用）

Claude Code・Gemini CLI: On/Off 程度の制御しかない</code></pre>
<h3><span id="toc24">4. CI/CDパイプラインへの最適設計</span></h3>
<pre><code class="language-plaintext">Codex CLI:
✅ never + sandbox の組み合わせで安全な完全自動化
✅ GitHub Actionsに直接組み込める
✅ 夜間バッチ・定期タスクの自動実行に最適

Claude Code・Gemini CLI:
△ CLIとして動作はするが、CI/CD前提の設計ではない</code></pre>
<h3><span id="toc25">5. Apache-2.0ライセンスで社内カスタマイズが自由</span></h3>
<pre><code class="language-plaintext">Codex CLI（Apache-2.0）:
✅ ソースコードを完全に改変・再配布可能
✅ 社内セキュリティポリシーに合わせたカスタマイズが可能
✅ 社内MCPサーバーと組み合わせた専用エージェント構築

Gemini CLI（Apache-2.0）: 同様にオープンソース
Claude Code:              クローズドソース</code></pre>
<h3><span id="toc26">6. マルチエージェントv2による並列タスク実行</span></h3>
<p>v0.117.0から本格化した機能です。</p>
<pre><code class="language-plaintext">Codex CLI マルチエージェントv2:
✅ パスベースアドレスで複数のサブエージェントを管理
✅ 構造化メッセージングで各エージェントが協調
✅ フロントエンド・バックエンドを別エージェントが並列で担当

→ 大規模なリファクタリングや複数モジュールの同時実装に効果的</code></pre>
<h3><span id="toc27">7. 高速処理（Cerebras統合）</span></h3>
<pre><code class="language-plaintext">Codex CLI (Cerebras統合): 1,000トークン/秒超
Claude Code:              約200トークン/秒
→ 約5倍の処理速度</code></pre>
<p>大量のファイルを素早く処理する際に特に有効です。</p>
<hr>
<h2><span id="toc28">設定ファイルの比較</span></h2>
<p>3つのツールともに、プロジェクトのルールを記述したMarkdownファイルを自動読み込みします。</p>
<h3><span id="toc29">配置パスの比較</span></h3>
<table>
<thead>
<tr>
<th>階層</th>
<th>CLAUDE.md（Claude Code）</th>
<th>GEMINI.md（Gemini CLI）</th>
<th>AGENTS.md（Codex CLI）</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>グローバル</strong></td>
<td><code>~/.claude/CLAUDE.md</code></td>
<td><code>~/.gemini/GEMINI.md</code></td>
<td><code>~/.codex/AGENTS.md</code></td>
</tr>
<tr>
<td><strong>プロジェクト</strong></td>
<td><code>./CLAUDE.md</code></td>
<td><code>./GEMINI.md</code></td>
<td><code>./AGENTS.md</code></td>
</tr>
<tr>
<td><strong>サブフォルダ</strong></td>
<td><code>./src/CLAUDE.md</code></td>
<td><code>./src/GEMINI.md</code></td>
<td><code>./src/AGENTS.md</code></td>
</tr>
</tbody>
</table>
<h3><span id="toc30">書き方の違いと特徴</span></h3>
<p><strong>CLAUDE.md（Claude Code）：</strong></p>
<pre><code class="language-markdown"># プロジェクトルール

## コミュニケーション
- すべてのやり取りは日本語で行うこと

## コーディング規約
- コードの右側にコメントを書くこと
  例: `const x = 1; // 値を初期化`

## プロジェクト固有のルール
- npm scripts 実行時は -- を使って引数を渡すこと</code></pre>
<p><strong>GEMINI.md（Gemini CLI）：</strong></p>
<pre><code class="language-markdown"># プロジェクト概要
このプロジェクトは Next.js + TypeScript で構築したブログシステムです。

# コーディングルール
- すべてのやり取りは日本語で行うこと
- コメントはコードの右側に記述すること

# 開発コマンド
- ビルド: npm run build
- テスト: npm test</code></pre>
<p><strong>AGENTS.md（Codex CLI）：</strong></p>
<pre><code class="language-markdown"># プロジェクト概要
Next.js + TypeScript のブログシステム

# コーディング規約
- すべてのやり取りは日本語で行うこと
- TypeScript strict モードを厳守

# 開発コマンド
- ビルド: npm run build
- テスト: npm test

# セキュリティポリシー（full-autoモードでの暴走防止）
- .envファイルは絶対に読み取らないこと
- node_modules は絶対に編集しないこと
- 本番環境のDBに接続するコマンドは実行しないこと</code></pre>
<p><strong>書き方のポイント:</strong></p>
<ul>
<li><strong>CLAUDE.md</strong>: 制約・スタイルガイドの記述が効果的（指示への忠実さが高いため）</li>
<li><strong>GEMINI.md</strong>: 開発コマンドの記述が効果的（CLIコマンドを自律実行するため）</li>
<li><strong>AGENTS.md</strong>: 禁止事項・セキュリティポリシーの明記が特に効果的（full-autoモードの安全性確保のため）</li>
</ul>
<h3><span id="toc31">設定の確認コマンド</span></h3>
<table>
<thead>
<tr>
<th>操作</th>
<th>Claude Code</th>
<th>Gemini CLI</th>
<th>Codex CLI</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>設定の確認</strong></td>
<td>自動読み込み（表示なし）</td>
<td><code>/memory show</code></td>
<td><code>/status</code></td>
</tr>
<tr>
<td><strong>設定の再読み込み</strong></td>
<td>起動し直す</td>
<td><code>/memory refresh</code></td>
<td>起動し直す</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc32">UI・操作感の違い</span></h2>
<h3><span id="toc33">Claude Code</span></h3>
<ul>
<li><strong>ステップを細かく逐次表示</strong>（「ファイルAを読み込みました」「ファイルBを編集しました」など、各アクションを個別に報告）</li>
<li>ツリー形式でアクションを表示</li>
<li>変更内容の差分表示が明確</li>
<li>承認プロンプトのUXが洗練されている</li>
</ul>
<h3><span id="toc34">Gemini CLI</span></h3>
<ul>
<li><strong>複数のアクションをまとめてボックスで表示</strong>（「3つのファイルを確認して修正しました」のようにサマリー形式）</li>
<li><strong>Plan Mode</strong>で作業前に確認ステップを挟める（v0.30.0〜デフォルト有効）</li>
<li>Verboseモードへの切り替えで、Claude Codeのような逐次ログ表示も可能</li>
<li>外部エディタでプランを開いて編集する機能も追加（v0.30.0〜）</li>
</ul>
<h3><span id="toc35">Codex CLI</span></h3>
<ul>
<li><strong>シンプルなターミナルUI</strong>（3ツールの中で最もミニマル）</li>
<li>承認プロンプトは機能的だが、視覚的な洗練度は低め</li>
<li><code>/plan</code> コマンドでプランモードを呼び出せるが、デフォルトではない</li>
<li>マルチエージェントv2では複数スレッドを <code>agent</code> コマンドで切り替えて管理</li>
</ul>
<pre><code class="language-plaintext">「何をやっているか全部見たい」派            → Claude Code
「結果だけ教えてくれればいい」派            → Gemini CLI
「CIに組み込んで完全自動化したい」派        → Codex CLI</code></pre>
<hr>
<h2><span id="toc36">実際の使い分け戦略</span></h2>
<h3><span id="toc37">ケース別おすすめ</span></h3>
<table>
<thead>
<tr>
<th>ケース</th>
<th>おすすめ</th>
<th>理由</th>
</tr>
</thead>
<tbody>
<tr>
<td>まず無料で試したい</td>
<td><strong>Gemini CLI</strong></td>
<td>0円から始められる</td>
</tr>
<tr>
<td>大規模プロジェクト全体の分析</td>
<td><strong>Gemini CLI</strong></td>
<td>デフォルトから100万トークン</td>
</tr>
<tr>
<td>最新ライブラリを使った実装</td>
<td><strong>Gemini CLI</strong></td>
<td>Google検索リアルタイム連携</td>
</tr>
<tr>
<td>バグを確実に直したい</td>
<td><strong>Claude Code</strong></td>
<td>自律デバッグループの粘り強さ</td>
</tr>
<tr>
<td>複雑なロジックの実装</td>
<td><strong>Claude Code</strong></td>
<td>Thinkingモードによる高精度</td>
</tr>
<tr>
<td>品質重視のリファクタリング</td>
<td><strong>Claude Code</strong></td>
<td>洗練されたコード生成</td>
</tr>
<tr>
<td>CI/CDパイプラインに組み込む</td>
<td><strong>Codex CLI</strong></td>
<td>サンドボックス + full-auto設計</td>
</tr>
<tr>
<td>シェル・ターミナル作業の自動化</td>
<td><strong>Codex CLI</strong></td>
<td>Terminal-Bench 2.0 最高水準</td>
</tr>
<tr>
<td>チームでワークフローを標準化</td>
<td><strong>Gemini CLI</strong></td>
<td>Skills共有機能</td>
</tr>
<tr>
<td>社内ツールにカスタム組み込み</td>
<td><strong>Codex CLI</strong></td>
<td>Apache-2.0、改変自由</td>
</tr>
<tr>
<td>費用を月額固定にしたい</td>
<td><strong>Claude Code</strong></td>
<td>定額制で青天井にならない</td>
</tr>
<tr>
<td>並列で大規模タスクを処理</td>
<td><strong>Codex CLI</strong></td>
<td>マルチエージェントv2</td>
</tr>
<tr>
<td>音声入力で指示したい</td>
<td><strong>Claude Code</strong></td>
<td>/voice コマンド対応（2026/03〜）</td>
</tr>
</tbody>
</table>
<h3><span id="toc38">プロの3ツール使い分け</span></h3>
<pre><code class="language-plaintext">Gemini CLI を使う場面:
✅ ブログ記事100本を一度にスキャンしてSEO課題を見つける
✅ 新しいフレームワークで「まず動くもの」を速攻で作る
✅ コードベース全体の依存関係を把握する
✅ チーム共通のスキル（Skills）を定義してワークフローを標準化する
✅ Plan Modeで実行前に全工程を確認・承認してから安全に作業する
✅ 無料枠の範囲で日常のちょっとした作業を済ませる

Claude Code を使う場面:
✅ 複雑なロジックをバグなしで一発で実装したい
✅ Geminiが書いた「動くけど汚いコード」を清書する
✅ 特定のバグを粘り強くデバッグしたい
✅ 音声入力で手をふさがずにコーディング指示を出したい
✅ VS Code / JetBrains の両方を使った IDE統合で作業したい

Codex CLI を使う場面:
✅ GitHub ActionsなどのCI/CDに組み込んだ安全な自動化
✅ 夜間バッチで大量ファイルの処理を完全自動実行
✅ シェルスクリプト・インフラコードの高度な自動化
✅ Apache-2.0ライセンスで社内ツールに改造・組み込み
✅ マルチエージェントで複数モジュールを並列で開発</code></pre>
<p><strong>最適な分担:</strong></p>
<pre><code class="language-plaintext">「全体像を把握させる」          → Gemini CLI（デフォルトで100万トークン）
「一か所のバグを徹底的に詰める」 → Claude Code（粘り強い自律デバッグ）
「自動化・CI/CDに組み込む」     → Codex CLI（サンドボックス + full-auto）</code></pre>
<hr>
<h2><span id="toc39">機能比較まとめ表</span></h2>
<table>
<thead>
<tr>
<th>機能・特性</th>
<th>Gemini CLI</th>
<th>Claude Code</th>
<th>Codex CLI</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>コンテキストウィンドウ</strong></td>
<td>◎ 100万トークン（デフォルト）</td>
<td>△ 20万トークン</td>
<td>◎ 100万トークン（gpt-5.3-codex時）</td>
</tr>
<tr>
<td><strong>無料枠</strong></td>
<td>◎ あり</td>
<td>× なし</td>
<td>× なし</td>
</tr>
<tr>
<td><strong>オープンソース</strong></td>
<td>◎ Apache-2.0</td>
<td>× なし</td>
<td>◎ Apache-2.0</td>
</tr>
<tr>
<td><strong>Google検索統合</strong></td>
<td>◎ リアルタイム</td>
<td>△ 学習データのみ</td>
<td>△ Web検索あり（Google比で精度劣る）</td>
</tr>
<tr>
<td><strong>マルチモーダル</strong></td>
<td>◎ 動画・音声対応</td>
<td>△ 画像のみ</td>
<td>△ 画像のみ</td>
</tr>
<tr>
<td><strong>自律デバッグ</strong></td>
<td>△ 介入が必要な場合も</td>
<td>◎ 粘り強い</td>
<td>△ モデル依存</td>
</tr>
<tr>
<td><strong>コードの質</strong></td>
<td>△ 実用的・やや冗長</td>
<td>◎ 洗練されている</td>
<td>◎ gpt-5.4使用時は高品質</td>
</tr>
<tr>
<td><strong>サンドボックス実行</strong></td>
<td>× なし</td>
<td>× なし</td>
<td><strong>◎ OSネイティブ実装</strong></td>
</tr>
<tr>
<td><strong>承認モードの粒度</strong></td>
<td>△ On/Off程度</td>
<td>△ On/Off程度</td>
<td>◎ 4段階（on-request/untrusted/never/bypass）</td>
</tr>
<tr>
<td><strong>Plan Mode</strong></td>
<td>◎ デフォルト有効（v0.30.0〜）</td>
<td>△ 近い機能はあり</td>
<td>△ /plan コマンドで呼び出し可</td>
</tr>
<tr>
<td><strong>スキル（Skills）機能</strong></td>
<td>◎ チームで共有可能</td>
<td>× なし</td>
<td>× なし</td>
</tr>
<tr>
<td><strong>音声入力モード</strong></td>
<td>× なし</td>
<td>◎ あり（/voice、2026/03〜）</td>
<td>× なし</td>
</tr>
<tr>
<td><strong>MCP対応</strong></td>
<td>◎ あり</td>
<td>◎ あり</td>
<td>◎ あり</td>
</tr>
<tr>
<td><strong>CI/CDへの組み込み</strong></td>
<td>△ 可能</td>
<td>△ 可能</td>
<td>◎ 前提設計</td>
</tr>
<tr>
<td><strong>マルチエージェント</strong></td>
<td>× なし</td>
<td>△ 限定的</td>
<td>◎ v2（パスベース並列処理）</td>
</tr>
<tr>
<td><strong>IDE統合</strong></td>
<td>◎ VS Code拡張</td>
<td>◎ VS Code + JetBrains</td>
<td>× なし（ターミナルのみ）</td>
</tr>
<tr>
<td><strong>Terminal-Bench 2.0</strong></td>
<td>未公開</td>
<td>△ 65.4%</td>
<td>◎ <strong>77.3%</strong></td>
</tr>
<tr>
<td><strong>SWE-bench Verified</strong></td>
<td>◎ 78%（Gemini 2.5 Flash）</td>
<td>◎ 72.7% / 80.8%（Opus）</td>
<td>※独自ベンチ参照</td>
</tr>
<tr>
<td><strong>コスト予測性</strong></td>
<td>◎ 無料〜定額</td>
<td>◎ 定額制</td>
<td>△ 従量課金（青天井リスク）</td>
</tr>
<tr>
<td><strong>設定ファイル</strong></td>
<td>GEMINI.md</td>
<td>CLAUDE.md</td>
<td>AGENTS.md + config.toml</td>
</tr>
<tr>
<td><strong>主な強み</strong></td>
<td>全体分析・大規模処理・無料</td>
<td>精密実装・デバッグ・コード品質</td>
<td>自動化・CI・ターミナル作業</td>
</tr>
</tbody>
</table>
<hr>
<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%2BClaude%2BCode%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D359XA1WJGH366%26sprefix%3D%25E6%259C%25AC%2Bclaude%2Bcode%252Caps%252C183%26ref%3Dnb_sb_noss_2" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 Claude Code]</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":"Claude CodeによるAI駆動開発入門","b":"","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/41Ana0tBMIL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B0G13D2JS4","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\/B0G13D2JS4","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\/Claude%20Code%E3%81%AB%E3%82%88%E3%82%8BAI%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80\/","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=Claude%20Code%E3%81%AB%E3%82%88%E3%82%8BAI%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"v1Sso","s":"s"});</script></p>
<div id="msmaflink-v1Sso">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></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%2BGemini%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D2PFMA06JS9D1M%26sprefix%3D%25E6%259C%25AC%2Bgemini%252Caps%252C227%26ref%3Dnb_sb_noss_1" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 Gemini]</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":"【最新版Gemini 3に対応！】できるGemini (できるシリーズ)","b":"インプレス","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51e-bbGHWnL._SL500_.jpg","\/41xZ9jPLmiL._SL500_.jpg","\/41sOKknaKDL._SL500_.jpg","\/4194OONmMYL._SL500_.jpg","\/41xpkKpoBkL._SL500_.jpg","\/41sBSFFLXmL._SL500_.jpg","\/41RlmFOWWeL._SL500_.jpg","\/41gCQ4H3VaL._SL500_.jpg","\/41eVgeL0waL._SL500_.jpg","\/41tg9xstX-L._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4295023493","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\/4295023493","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\/%E3%80%90%E6%9C%80%E6%96%B0%E7%89%88Gemini%203%E3%81%AB%E5%AF%BE%E5%BF%9C%EF%BC%81%E3%80%91%E3%81%A7%E3%81%8D%E3%82%8BGemini%20(%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA)\/","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=%E3%80%90%E6%9C%80%E6%96%B0%E7%89%88Gemini%203%E3%81%AB%E5%AF%BE%E5%BF%9C%EF%BC%81%E3%80%91%E3%81%A7%E3%81%8D%E3%82%8BGemini%20(%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA)","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"kmoP1","s":"s"});</script></p>
<div id="msmaflink-kmoP1">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc40">まとめ</span></h2>
<p>Claude Code・Gemini CLI・Codex CLIの3ツールは、<strong>三すくみの補完関係</strong>にあります。</p>
<h3><span id="toc41">3ツールの立ち位置</span></h3>
<pre><code class="language-plaintext">Claude Code  → 「精密に・確実に・高品質で」
Gemini CLI   → 「広く・大量に・無料で」
Codex CLI    → 「自動化・CI・ターミナル最強で」</code></pre>
<h3><span id="toc42">あなたに合うのはどれか</span></h3>
<p><strong>Gemini CLIが向いている方:</strong></p>
<ul>
<li>まず0円でAIエージェントを試してみたい</li>
<li>大規模なコードベース全体をAIに把握させたい</li>
<li>Google検索と連携した最新情報を使いたい</li>
<li>チームでワークフローを標準化したい（Skills機能）</li>
</ul>
<p><strong>Claude Codeが向いている方:</strong></p>
<ul>
<li>コードの品質を最優先にしたい</li>
<li>複雑なバグを自律的に修正させたい</li>
<li>定額制で費用を予測しやすくしたい</li>
<li>JetBrains系IDEで使いたい</li>
<li>音声入力でハンズフリー開発したい</li>
</ul>
<p><strong>Codex CLIが向いている方:</strong></p>
<ul>
<li>CI/CDパイプラインにAIエージェントを安全に組み込みたい</li>
<li>シェル・ターミナル作業を高度に自動化したい</li>
<li>Apache-2.0ライセンスで社内ツールに改造・組み込みしたい</li>
<li>マルチエージェントで大規模タスクを並列処理したい</li>
</ul>
<h3><span id="toc43">最もコスパの良い使い方</span></h3>
<pre><code class="language-plaintext">STEP 1: Gemini CLIの無料枠から試す（0円）
  ↓ 物足りなくなったら
STEP 2: Claude CodeのProプランを追加（$20/月）
  ↓ CI/CD自動化が必要になったら
STEP 3: Codex CLIをCI/CDに組み込む（従量課金・少額）</code></pre>
<p>この3段階のアプローチが、2026年現在でコスト面でも最も賢い選択です。</p>
<p><strong>関連記事：</strong></p>
<ul>
<li>Claude Code完全ガイド｜ターミナルで動くAIコーディングアシスタントの全貌【2026年3月版】</li>
</ul>

<a rel="noopener" href="https://caymezon.com/claude-code-overview/" title="Claude Code完全ガイド｜ターミナルで動くAIコーディングアシスタントの全貌【2026年3月版】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Claude Code完全ガイド｜ターミナルで動くAIコーディングアシスタントの全貌【2026年3月版】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「AIにコードを書かせたいけど、ブラウザとエディタを行き来するのが面倒…」そんな悩みを解決するのがClaude Codeです。2026年3月時点で、Anthropicが提供するターミナル型AIエージェントとして、開発者の間で急速に注...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.14</div></div></div></div></a>
<ul>
<li>Gemini CLI完全ガイド｜ターミナルで動くGoogleのAIエージェントの全貌【2026年3月最新】</li>
</ul>

<a rel="noopener" href="https://caymezon.com/gemini-cli-overview/" title="Gemini CLI完全ガイド｜ターミナルで動くGoogleのAIエージェントの全貌【2026年3月最新】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/gemini-cli-overview-featured-836add-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/gemini-cli-overview-featured-836add-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/gemini-cli-overview-featured-836add-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/gemini-cli-overview-featured-836add-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/gemini-cli-overview-featured-836add-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Gemini CLI完全ガイド｜ターミナルで動くGoogleのAIエージェントの全貌【2026年3月最新】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「Claude CodeみたいなAIコーディングエージェントを試したいけど、費用を抑えたい…」「Googleが出しているターミナル版AIエージェントって何ができるの？」そんな疑問を持つエンジニアに向けて、Gemini CLIの全貌を...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.21</div></div></div></div></a>
<ul>
<li>OpenAI Codex CLI完全ガイド｜ターミナルで動くOpenAIのAIエージェントの全貌【2026年3月最新】</li>
</ul>

<a rel="noopener" href="https://caymezon.com/codex-cli-overview/" title="OpenAI Codex CLI完全ガイド｜ターミナルで動くOpenAIのAIエージェントの全貌【2026年3月最新】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/03/codex-cli-overview-featured-c9678c-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/03/codex-cli-overview-featured-c9678c-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/03/codex-cli-overview-featured-c9678c-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/03/codex-cli-overview-featured-c9678c-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/03/codex-cli-overview-featured-c9678c-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">OpenAI Codex CLI完全ガイド｜ターミナルで動くOpenAIのAIエージェントの全貌【2026年3月最新】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「Claude CodeやGemini CLIみたいなAIエージェントを、OpenAIのモデルで使いたい…」「ターミナルで動くAIエージェントの中で、OpenAIが出しているものって何？」そんな疑問を持つエンジニアに向けて、Open...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.03.28</div></div></div></div></a>
<ul>
<li>【まとめ記事】Claude Code完全攻略ロードマップ｜全記事まとめ</li>
</ul>

<a rel="noopener" href="https://caymezon.com/claude-code-complete-roadmap/" title="【2026年版】Claude Code完全攻略ロードマップ｜セットアップからVSCode活用・コマンド習得まで全記事まとめ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/03/claude-code-complete-roadmap-featured-89f0d3-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/03/claude-code-complete-roadmap-featured-89f0d3-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/03/claude-code-complete-roadmap-featured-89f0d3-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/03/claude-code-complete-roadmap-featured-89f0d3-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/03/claude-code-complete-roadmap-featured-89f0d3-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【2026年版】Claude Code完全攻略ロードマップ｜セットアップからVSCode活用・コマンド習得まで全記事まとめ</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「Claude Codeに興味があるけど、何から始めればいいかわからない」「Claude Codeを使い始めたけど、もっと使いこなしたい」この記事は、Claude Codeに関するすべての記事を体系的にまとめたロードマップです。初心...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.03.21</div></div></div></div></a>
<hr>
<p><strong>タグ:</strong> #CodexCLI #ClaudeCode #GeminiCLI #AI比較 #OpenAI #Google #Anthropic #ターミナル #開発効率化</p><p>The post <a href="https://caymezon.com/codex-cli-vs-claude-code-vs-gemini-cli/">Claude Code vs Gemini CLI vs Codex CLI｜できること・できないことを徹底比較【2026年3月版】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/codex-cli-vs-claude-code-vs-gemini-cli/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OpenAI Codex CLI完全ガイド｜ターミナルで動くOpenAIのAIエージェントの全貌【2026年3月最新】</title>
		<link>https://caymezon.com/codex-cli-overview/</link>
					<comments>https://caymezon.com/codex-cli-overview/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sat, 28 Mar 2026 07:05:56 +0000</pubDate>
				<category><![CDATA[AI & Next Tech]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Codex]]></category>
		<category><![CDATA[Codex CLI]]></category>
		<category><![CDATA[OpenAI]]></category>
		<category><![CDATA[エージェント]]></category>
		<category><![CDATA[ターミナル]]></category>
		<category><![CDATA[開発効率化]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20302</guid>

					<description><![CDATA[<p>はじめに 「Claude CodeやGemini CLIみたいなAIエージェントを、OpenAIのモデルで使いたい…」 「ターミナルで動くAIエージェントの中で、OpenAIが出しているものって何？」 そんな疑問を持つエ [&#8230;]</p>
<p>The post <a href="https://caymezon.com/codex-cli-overview/">OpenAI Codex CLI完全ガイド｜ターミナルで動くOpenAIのAIエージェントの全貌【2026年3月最新】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>「Claude CodeやGemini CLIみたいなAIエージェントを、OpenAIのモデルで使いたい…」</p>
<p>「ターミナルで動くAIエージェントの中で、OpenAIが出しているものって何？」</p>
<p>そんな疑問を持つエンジニアに向けて、<strong>OpenAI Codex CLI</strong>の全貌を徹底解説します。</p>
<p>OpenAIが2025年4月に公開したCodex CLIは、2026年3月時点でバージョン<strong>v0.117.0</strong>に達し、単なるコード補完ツールから<strong>本格的なターミナル型AIエージェント</strong>へと進化しました。特に<strong>Terminal-Bench 2.0</strong>（ターミナル作業能力のベンチマーク）で**77.3%**というスコアは、同カテゴリのツールの中で最高水準です。</p>
<p><!-- ![Codex CLI起動画面](images/codex-cli-launch.jpg) --></p>
<p>本記事では、2026年3月時点の最新情報をもとに、Codex CLIの全体像から実践的な活用方法まで徹底解説します。</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%2BClaude%2BCode%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D359XA1WJGH366%26sprefix%3D%25E6%259C%25AC%2Bclaude%2Bcode%252Caps%252C183%26ref%3Dnb_sb_noss_2" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 Claude Code]</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>
<h2><span id="toc2">この記事で分かること</span></h2>
<ul>
<li>Codex CLIとは何か（Claude Code・Gemini CLIとの違い）</li>
<li>できること・主な機能</li>
<li>メリット・デメリットの詳細分析</li>
<li>承認モード（Approval Policy）とサンドボックスの使い方</li>
<li>AGENTS.mdによるプロジェクト設定</li>
<li>料金体系と使い分け</li>
<li>インストール手順（Windows/Mac/Linux対応）</li>
<li>実践的な活用シーン</li>
</ul>
<h2><span id="toc3">こんな人におすすめ</span></h2>
<ul>
<li>OpenAIのモデル（GPT-5系）でターミナルAIエージェントを使いたい開発者</li>
<li>CI/CDパイプラインにAIエージェントを組み込みたいエンジニア</li>
<li>完全自動化に安全なサンドボックスを使いたい人</li>
<li>Claude CodeやGemini CLIとの比較で選択肢を広げたい人</li>
<li>オープンソースのAIエージェントをカスタマイズして使いたい人</li>
</ul>
<h2><span id="toc4">Codex CLIとは</span></h2>
<h3><span id="toc5">基本概念</span></h3>
<p><strong>Codex CLI</strong>は、OpenAIが開発・オープンソース公開しているコマンドライン型のAIエージェントです。</p>
<pre><code class="language-plaintext">■ターミナルネイティブ
└→ コマンドラインから直接OpenAIモデルとやり取り
└→ エディタとシームレスに統合

■ローカルファイルアクセス
└→ プロジェクトファイルを直接読み書き
└→ ディレクトリ全体を丸ごと解析

■エージェント機能
└→ ファイル編集・シェル実行・Git操作を自律実行
└→ 複数ステップのタスクを自動的に処理</code></pre>
<p>GitHubリポジトリはApache-2.0ライセンスで公開されており、誰でもソースコードを確認・改変・貢献できます。</p>
<h3><span id="toc6">他のAIエージェントとの違い</span></h3>
<table>
<thead>
<tr>
<th>機能</th>
<th>ブラウザ版ChatGPT</th>
<th>Codex CLI</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>ファイル保存</strong></td>
<td>ダウンロード操作が必要</td>
<td>直接上書き・新規作成</td>
</tr>
<tr>
<td><strong>コマンド実行</strong></td>
<td>不可能</td>
<td>コンパイル、テスト、Git操作</td>
</tr>
<tr>
<td><strong>ファイル数</strong></td>
<td>数個〜十数個が限界</td>
<td>大量ファイルを一括スキャン</td>
</tr>
<tr>
<td><strong>外部連携</strong></td>
<td>コピペのみ</td>
<td>DB、API、OSツールと直結</td>
</tr>
<tr>
<td><strong>自動化</strong></td>
<td>手動対話のみ</td>
<td>スクリプトによる完全自動化</td>
</tr>
<tr>
<td><strong>サンドボックス</strong></td>
<td>なし</td>
<td>OSネイティブサンドボックスで安全隔離</td>
</tr>
</tbody>
</table>
<p><!-- ![ブラウザ版との比較](images/codex-web-vs-cli.jpg) --></p>
<h3><span id="toc7">2026年3月時点の最新バージョン</span></h3>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リリース日</th>
<th>主な内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>v0.117.0</strong>（最新安定版）</td>
<td>2026/03/26</td>
<td>プラグインのファーストクラス化、マルチエージェントv2、<code>/title</code>コマンド追加</td>
</tr>
<tr>
<td><strong>v0.116.0</strong></td>
<td>2026/03/19</td>
<td>ChatGPTデバイスコードサインイン、<code>userpromptsubmit</code>フック、プラグインリモート同期</td>
</tr>
<tr>
<td>gpt-5.3-codex統合</td>
<td>2026/02/05</td>
<td>100万トークンコンテキスト、Terminal-Bench 2.0で77.3%</td>
</tr>
<tr>
<td>codex-1 / codex-mini-latest</td>
<td>2025/05/16</td>
<td>SWE-bench Verified 72.1%のcodex-1、200Kコンテキストのcodex-mini-latest</td>
</tr>
<tr>
<td><strong>初版リリース</strong></td>
<td>2025/04/16</td>
<td>Codex CLI公開（Apache-2.0、オープンソース化）</td>
</tr>
</tbody>
</table>
<h2><span id="toc8">Codex CLIでできること</span></h2>
<h3><span id="toc9">1. ファイル操作（作成・編集・削除）</span></h3>
<p>ローカルファイルを直接操作できます。</p>
<pre><code class="language-bash"># Codex CLIを起動
codex

# 指示例（プロンプトで入力）
&gt; main.py のバグを修正して保存して

&gt; 新しいファイル utils.ts を作成して、日付フォーマット関数を実装して

&gt; src/ フォルダ内の全 .ts ファイルにエラーハンドリングを追加して</code></pre>
<p><!-- ![ファイル操作デモ](images/file-operation-demo.jpg) --></p>
<h3><span id="toc10">2. コードの理解と分析</span></h3>
<p>プロジェクト全体を読み込み、深い分析が可能です。</p>
<pre><code class="language-bash">&gt; このプロジェクト全体のアーキテクチャを分析して、セキュリティ上の問題点を指摘して

&gt; src/components/ フォルダの全コンポーネントを確認して、重複している処理をリストアップして</code></pre>
<p><strong>gpt-5.3-codexモデル使用時は100万トークンのコンテキスト</strong>に対応しており、大規模なコードベースを丸ごと保持したまま会話できます。</p>
<h3><span id="toc11">3. シェルコマンドの実行</span></h3>
<pre><code class="language-bash">&gt; テストを実行して、失敗したケースがあれば原因を分析して修正して

&gt; npm run build してエラーがあれば解決して

&gt; git log を確認して、今週のコミット内容をまとめて</code></pre>
<h3><span id="toc12">4. Git操作の自動化</span></h3>
<pre><code class="language-bash">&gt; 今の変更を feature/fix-bug ブランチにコミットしてプッシュして

&gt; git の差分を確認して、適切なコミットメッセージを作成してコミットまで完了させて</code></pre>
<h3><span id="toc13">5. Web検索との連携</span></h3>
<p>デフォルトで有効化されており、最新情報をリアルタイムに取得しながらコードを生成できます。</p>
<pre><code class="language-bash"># 最新ライブラリ情報を調べながらコードを書く
&gt; React 19 の新しいフック useOptimistic を使った実装例を見せて

# セキュリティアドバイザリを参照しながら修正
&gt; この依存パッケージに既知の脆弱性がないか確認して</code></pre>
<h3><span id="toc14">6. 大規模ドキュメント・コードの一括処理</span></h3>
<pre><code class="language-bash">&gt; content/ フォルダ内の全記事をスキャンして、古いAPIの呼び出し箇所を
&gt; 新しいバージョンに一括置換して保存して</code></pre>
<h2><span id="toc15">主要機能の詳細</span></h2>
<h3><span id="toc16">承認モード（Approval Policy）【安全のために重要】</span></h3>
<p>Codex CLIの最大の特徴が<strong>細かく制御できる承認ポリシー</strong>です。<code>--approval-policy</code> フラグまたは <code>config.toml</code> で設定します。</p>
<pre><code class="language-bash"># デフォルト（on-request）: ワークスペース外の操作のみ承認を求める
codex

# 読み取り専用: 状態変更・破壊的操作は全て承認
codex --approval-policy untrusted

# 完全無効: 全ての承認プロンプトをスキップ（サンドボックスは有効）
codex --approval-policy never

# 危険モード: サンドボックス・承認を完全無効化（隔離環境専用）
codex --dangerously-bypass-approvals-and-sandbox</code></pre>
<table>
<thead>
<tr>
<th>モード</th>
<th>動作</th>
<th>推奨ケース</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>on-request</strong>（デフォルト）</td>
<td>ワークスペース外のファイル編集・ネットワークアクセス時のみ確認</td>
<td>通常の開発作業</td>
</tr>
<tr>
<td><strong>untrusted</strong></td>
<td>読み取り専用は自動実行、変更・破壊的操作は全て確認</td>
<td>初めてのプロジェクト</td>
</tr>
<tr>
<td><strong>never</strong></td>
<td>全ての承認プロンプトをスキップ（サンドボックスは維持）</td>
<td>CI/CD環境</td>
</tr>
<tr>
<td><strong>dangerously-bypass</strong></td>
<td>全制限を解除</td>
<td>完全隔離された環境のみ</td>
</tr>
</tbody>
</table>
<p><strong>最初は <code>on-request</code>（デフォルト）で使うことを強く推奨します。</strong></p>
<h3><span id="toc17">サンドボックス実行【Codex CLI独自の安全機能】</span></h3>
<p>Codex CLIはOSネイティブの機能でコマンド実行を隔離します。macOS/Linux/WSL/Windows Nativeで実装が異なります。</p>
<pre><code class="language-plaintext">■ read-only（読み取り専用）
└→ ファイル閲覧のみ。編集・コマンド実行は承認必要

■ workspace-write（デフォルト）
└→ ワークスペース内のファイル読み書き・通常コマンドは自動許可
└→ ネットワークアクセスやワークスペース外への変更は制限

■ danger-full-access
└→ ファイルシステム・ネットワーク境界を完全解除</code></pre>
<p><strong>Claude CodeやGemini CLIにはないサンドボックス機能</strong>により、<code>--approval-policy never</code> と組み合わせても安全な完全自動化が実現できます。</p>
<h3><span id="toc18">AGENTS.md（プロジェクト設定ファイル）【Claude CodeのCLAUDE.mdに相当】</span></h3>
<p>Codexが起動時に自動読み込みするMarkdown形式の指示ファイルです。</p>
<pre><code class="language-markdown"># プロジェクト概要
このプロジェクトはNext.js + TypeScriptで構築したブログシステムです。

# コーディング規約
- すべてのやり取りは日本語で行うこと
- コメントはコードの右側に記述すること
- TypeScript strict モードを厳守すること
- 不要なboilerplateコードは書かないこと

# 開発コマンド
- ビルド: npm run build
- テスト: npm test
- Lint: npm run lint

# セキュリティポリシー
- .envファイルは絶対に読み取らないこと
- node_modules は絶対に編集しないこと
- 本番環境のDBに接続するコマンドは実行しないこと</code></pre>
<p>読み込み順序（優先度が高い順）：</p>
<table>
<thead>
<tr>
<th>ファイルパス</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>~/.codex/AGENTS.override.md</code></td>
<td>グローバル上書き（最高優先）</td>
</tr>
<tr>
<td><code>~/.codex/AGENTS.md</code></td>
<td>グローバルデフォルト</td>
</tr>
<tr>
<td>Gitルート〜現在のディレクトリの各階層の <code>AGENTS.md</code></td>
<td>プロジェクト・フォルダ設定</td>
</tr>
</tbody>
</table>
<p><strong>AGENTS.mdのポイント:</strong></p>
<ul>
<li><strong>禁止事項の明記が特に効果的</strong>（full-autoモードでの暴走防止）</li>
<li>正確なビルド・テストコマンドを記述しておくと精度が上がる</li>
<li>セキュリティポリシーを明記することで機密情報の漏洩を防止</li>
</ul>
<h3><span id="toc19">config.toml（設定ファイル）</span></h3>
<p>AGENTS.mdがプロンプトの指示なら、<code>config.toml</code>はCLI自体の動作設定です。</p>
<pre><code class="language-toml"># ~/.codex/config.toml（ユーザーレベル）
model = "gpt-5.4"                    # デフォルトモデル
sandbox_mode = "workspace-write"      # サンドボックスモード
approval_policy = "on-request"        # 承認ポリシー

[features]
multi_agent = true                    # マルチエージェントv2を有効化
web_search = true                     # Web検索を有効化</code></pre>
<h3><span id="toc20">MCP（Model Context Protocol）連携【拡張性が魅力】</span></h3>
<p>MCP対応により、外部ツールとの連携を自由に追加できます。</p>
<pre><code class="language-toml"># ~/.codex/config.toml でMCPサーバーを設定
[mcp_servers.github]
command = "npx"
args = ["-y", "@modelcontextprotocol/server-github"]
enabled = true

[mcp_servers.postgres]
command = "npx"
args = ["-y", "@modelcontextprotocol/server-postgres"]
enabled = true</code></pre>
<p>設定後は <code>/mcp</code> コマンドで接続済みツールを確認できます。GitHubのIssue読み書きやPostgreSQLへの問い合わせを、Codexに自然言語で指示できるようになります。</p>
<h3><span id="toc21">マルチエージェントv2【v0.117.0〜】</span></h3>
<p>v0.117.0で追加された機能で、<strong>複数のサブエージェントを並列実行</strong>できます。</p>
<pre><code class="language-bash">&gt; /agent
# パスベースでサブエージェントを管理
# /root/agent_a でフロントエンド担当
# /root/agent_b でバックエンド担当
# → 両エージェントが並列で作業し、構造化メッセージで通信</code></pre>
<p>大規模なリファクタリングや複数モジュールの同時実装に威力を発揮します。</p>
<h3><span id="toc22">スラッシュコマンド</span></h3>
<table>
<thead>
<tr>
<th>コマンド</th>
<th>機能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/model</code></td>
<td>アクティブモデルをセッション中に変更</td>
</tr>
<tr>
<td><code>/fast</code></td>
<td>高速モードの切り替え</td>
</tr>
<tr>
<td><code>/plan</code></td>
<td>プランモード（実行計画を先に提示）</td>
</tr>
<tr>
<td><code>/permissions</code></td>
<td>承認要件をその場で調整</td>
</tr>
<tr>
<td><code>/status</code></td>
<td>セッション設定とトークン使用量を表示</td>
</tr>
<tr>
<td><code>/diff</code></td>
<td>Gitの差分を表示</td>
</tr>
<tr>
<td><code>/new</code></td>
<td>同一セッション内で新規会話を開始</td>
</tr>
<tr>
<td><code>/fork</code></td>
<td>現在の会話をフォークして別スレッドを作成</td>
</tr>
<tr>
<td><code>/agent</code></td>
<td>マルチエージェントのスレッドを切り替え</td>
</tr>
<tr>
<td><code>/mcp</code></td>
<td>設定済みMCPツールを一覧表示</td>
</tr>
<tr>
<td><code>/plugins</code></td>
<td>プラグインの一覧・インストール</td>
</tr>
<tr>
<td><code>/review</code></td>
<td>コードレビューワークフローを起動</td>
</tr>
<tr>
<td><code>/compact</code></td>
<td>コンテキストを圧縮</td>
</tr>
<tr>
<td><code>/clear</code></td>
<td>ターミナルをクリアして新規チャット開始</td>
</tr>
<tr>
<td><code>/quit</code></td>
<td>セッション終了</td>
</tr>
</tbody>
</table>
<h3><span id="toc23">会話の再開</span></h3>
<pre><code class="language-bash"># ローカル保存されたセッションを復元（長時間タスクに便利）
codex resume</code></pre>
<p>前回の作業状態をそのまま引き継いで続きから始められます。</p>
<h2><span id="toc24">使用モデル</span></h2>
<table>
<thead>
<tr>
<th>モデル</th>
<th>特徴</th>
<th>コンテキスト</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>gpt-5.4</strong>（デフォルト）</td>
<td>フラッグシップ、高精度</td>
<td>未公開</td>
<td>複雑な推論・設計</td>
</tr>
<tr>
<td><strong>gpt-5.4-mini</strong></td>
<td>高速・低コスト版</td>
<td>未公開</td>
<td>日常的なコーディング</td>
</tr>
<tr>
<td><strong>gpt-5.3-codex</strong></td>
<td>コーディング特化</td>
<td><strong>100万トークン</strong></td>
<td>大規模コードベース解析</td>
</tr>
</tbody>
</table>
<p><strong>Terminal-Bench 2.0（ターミナル作業能力）: gpt-5.3-codex で 77.3%</strong></p>
<p>※OpenAIはSWE-bench Verifiedにトレーニングデータ汚染が発見されたとして報告を停止。現在は<strong>SWE-bench Pro</strong>（56.8%）と<strong>Terminal-Bench 2.0</strong>が実質的な比較指標となっています。</p>
<p><code>/model</code> コマンドでセッション中にいつでもモデルを切り替えられます。タスクの複雑さに応じてgpt-5.4とgpt-5.4-miniを使い分けることでコストを最適化できます。</p>
<h2><span id="toc25">料金体系</span></h2>
<h3><span id="toc26">前提：APIキーが必須</span></h3>
<p>Codex CLIを使うには<strong>OpenAI APIキーまたはChatGPTのサブスクリプション</strong>が必要です。完全無料枠はありません。</p>
<h3><span id="toc27">ChatGPTサブスクリプション経由</span></h3>
<table>
<thead>
<tr>
<th>プラン</th>
<th>月額</th>
<th>5時間あたりの利用枠</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Plus</strong></td>
<td>$20</td>
<td>30〜150メッセージ</td>
</tr>
<tr>
<td><strong>Pro</strong></td>
<td>$200</td>
<td>300〜1,500メッセージ（6倍）</td>
</tr>
<tr>
<td><strong>Business</strong></td>
<td>$30/ユーザー</td>
<td>組織向けワークスペース付き</td>
</tr>
</tbody>
</table>
<h3><span id="toc28">APIキー（従量課金）</span></h3>
<table>
<thead>
<tr>
<th>モデル</th>
<th>入力</th>
<th>出力</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>codex-mini-latest</strong></td>
<td>$1.50 / 100万トークン</td>
<td>$6.00 / 100万トークン</td>
</tr>
<tr>
<td><strong>gpt-5.4（汎用）</strong></td>
<td>$1.25 / 100万トークン</td>
<td>$10.00 / 100万トークン</td>
</tr>
</tbody>
</table>
<pre><code class="language-plaintext">⚠️ APIキー従量課金の注意点
└→ 使用量が増えると青天井になる
└→ プロジェクトごとに予算上限を設定することを推奨
└→ gpt-5.4-mini（低コストモデル）を日常タスクに使うことでコスト削減可能</code></pre>
<h3><span id="toc29">コスト最適化の考え方</span></h3>
<pre><code class="language-plaintext">gpt-5.4-mini を使う場面:
✅ 単純なファイル編集・コメント追加
✅ ドキュメント生成
✅ 簡単なリファクタリング

gpt-5.4 を使う場面:
✅ 複雑なアーキテクチャ設計
✅ 難易度の高いバグ修正
✅ セキュリティ審査

gpt-5.3-codex を使う場面:
✅ 大規模コードベース（数万行）の全体分析
✅ モノレポの依存関係解析</code></pre>
<h2><span id="toc30">インストール手順</span></h2>
<h3><span id="toc31">前提条件</span></h3>
<ul>
<li><strong>Node.js 22以上</strong></li>
<li>OpenAI APIキー または ChatGPT Plus以上のアカウント</li>
</ul>
<h3><span id="toc32">Step 1: Node.jsのインストール確認</span></h3>
<pre><code class="language-bash"># バージョン確認
node -v
# v22.x.x 以上が表示されればOK</code></pre>
<p>バージョンが表示されない場合は、<a href="https://nodejs.org/">Node.js公式サイト</a>からLTS版をインストールしてください。</p>
<h3><span id="toc33">Step 2: Codex CLIのインストール</span></h3>
<pre><code class="language-bash">npm install -g @openai/codex</code></pre>
<p><!-- ![インストール画面](images/install-screen.jpg) --></p>
<h3><span id="toc34">Step 3: APIキーの設定</span></h3>
<p><strong>OpenAI APIキーを使う場合（推奨）：</strong></p>
<pre><code class="language-bash"># Mac / Linux
export OPENAI_API_KEY="sk-..."
# または .bashrc / .zshrc に追記して永続化

# Windows (PowerShell)
[System.Environment]::SetEnvironmentVariable("OPENAI_API_KEY", "sk-...", "User")</code></pre>
<p><strong>ChatGPTアカウントを使う場合：</strong></p>
<pre><code class="language-bash"># 起動時にブラウザが開き、ChatGPTアカウントでログイン
codex
# → デバイスコードサインイン（v0.116.0〜）</code></pre>
<h3><span id="toc35">Step 4: 初回起動と動作確認</span></h3>
<pre><code class="language-bash"># 起動
codex

# 動作確認
&gt; このディレクトリの構造を教えて</code></pre>
<p>これだけで準備完了です。</p>
<h3><span id="toc36">Windowsネイティブでの使用（実験的）</span></h3>
<p>Windowsでのネイティブ実行は実験的サポートです。<strong>WSL（Windows Subsystem for Linux）の使用を強く推奨します。</strong></p>
<pre><code class="language-bash"># WSL（Ubuntu等）内で実行
npm install -g @openai/codex
export OPENAI_API_KEY="sk-..."
codex</code></pre>
<h2><span id="toc37">メリット</span></h2>
<h3><span id="toc38">1. ターミナル作業能力が最高水準</span></h3>
<p>Terminal-Bench 2.0（ターミナル操作・シェルスクリプトの実行能力評価）で**77.3%**という業界最高水準のスコアを達成しています。</p>
<pre><code class="language-plaintext">Terminal-Bench 2.0 比較:
Codex CLI (gpt-5.3-codex): 77.3%  ← 最高
Claude Code (Opus 4.6):    65.4%</code></pre>
<p><strong>シェル操作・コマンドライン作業が得意</strong>なのが最大の強みです。</p>
<h3><span id="toc39">2. サンドボックス実行による安全な完全自動化</span></h3>
<pre><code class="language-plaintext">Codex CLI:
✅ OSネイティブのサンドボックスでコマンド実行を隔離
✅ approval-policy=never でも安全な自動化が可能
✅ CI/CDパイプラインへの組み込みに最適

Claude Code・Gemini CLI:
❌ サンドボックス機能なし</code></pre>
<h3><span id="toc40">3. モデルを柔軟に使い分けられる</span></h3>
<pre><code class="language-plaintext">gpt-5.4-mini: 低コストの日常タスク用
gpt-5.4:      高精度の複雑タスク用
gpt-5.3-codex: 100万トークンの大規模解析用

→ タスクに応じてコストと品質を最適化できる</code></pre>
<h3><span id="toc41">4. Apache-2.0のオープンソース</span></h3>
<pre><code class="language-plaintext">✅ ソースコードを完全に確認・改変可能
✅ 社内環境への組み込みが容易
✅ コミュニティによる機能拡張が活発
✅ ベンダーロックインのリスクが低い</code></pre>
<h3><span id="toc42">5. 高速処理（Cerebras統合）</span></h3>
<p>Cerebras社との統合により、<strong>1,000トークン/秒超の高速推論</strong>が可能です（Claude Codeの約200トークン/秒と比較して5倍以上）。大量のファイルを素早く処理する際に特に有効です。</p>
<h3><span id="toc43">6. ChatGPT統合による統一体験</span></h3>
<pre><code class="language-plaintext">ChatGPT Web UI
    ↓ 同一アカウント
ChatGPT iOSアプリ
    ↓ 同一アカウント
VS Code拡張機能
    ↓ 同一アカウント
Codex CLI
→ どこでも同じ会話履歴にアクセス可能</code></pre>
<h3><span id="toc44">7. マルチエージェントによる並列タスク実行</span></h3>
<p>v0.117.0から本格化したマルチエージェントv2により、複数のサブエージェントが並列で作業できます。大規模なリファクタリングや複数モジュールの同時実装の効率が大幅に向上します。</p>
<h2><span id="toc45">デメリット・注意点</span></h2>
<h3><span id="toc46">1. 完全無料枠がない</span></h3>
<pre><code class="language-plaintext">Codex CLI:   APIキー or ChatGPT Plus（$20/月〜）が必須
Gemini CLI:  Googleアカウントのみで0円から始められる

→ まず試してみたいだけの場合はGemini CLIの方が手軽</code></pre>
<h3><span id="toc47">2. ターミナル操作が必須</span></h3>
<p>GUIに慣れている方には学習コストがあります。</p>
<pre><code class="language-plaintext">基本操作の習得: 1〜2時間
日常的な使いこなし: 1週間程度</code></pre>
<h3><span id="toc48">3. Windowsネイティブのサポートが実験的</span></h3>
<p>公式にはWSL経由の使用が推奨されており、Windowsネイティブでの動作は完全保証されていません。Windows環境で本格的に使う場合はWSLの導入が必要です。</p>
<h3><span id="toc49">4. コスト管理が必要</span></h3>
<p>APIキー利用の場合、使用量に上限がないため予算管理が必要です。</p>
<pre><code class="language-plaintext">⚠️ リスクケース:
- gpt-5.4で大規模コードベースを何時間も分析する
- マルチエージェントを多数起動する

✅ 対策:
- OpenAIダッシュボードで予算上限（Usage Limits）を設定
- 日常タスクはgpt-5.4-miniで処理する
- gpt-5.3-codexは大規模解析の時だけ使う</code></pre>
<h3><span id="toc50">5. ChatGPT・Claude Codeほど日本語コミュニティが充実していない</span></h3>
<p>日本語の情報や事例がまだ少ないため、問題が発生した際に日本語で解決策を探しにくい場面があります。</p>
<h2><span id="toc51">実践的な活用シーン</span></h2>
<h3><span id="toc52">シーン1: CI/CDパイプラインへの組み込み</span></h3>
<p>Codex CLIの最も得意な活用法です。</p>
<pre><code class="language-bash"># GitHub Actions での使用例
- name: Codex でコードレビュー
  run: |
    codex --approval-policy never \
      "このPRの変更をレビューして、セキュリティ上の問題を報告して"</code></pre>
<p>サンドボックス付きで完全自動化できるため、CI/CD環境への組み込みが安全です。</p>
<h3><span id="toc53">シーン2: 大規模コードベースの一括分析</span></h3>
<pre><code class="language-bash"># gpt-5.3-codexモデルで100万トークンを活用
codex
&gt; /model gpt-5.3-codex

&gt; このモノレポ全体を解析して、循環依存のあるモジュールを
&gt; すべてリストアップして、解消の優先順位を提案して</code></pre>
<h3><span id="toc54">シーン3: ターミナル作業の高度な自動化</span></h3>
<pre><code class="language-bash">&gt; システムのログを解析して、過去24時間のエラーパターンを
&gt; カテゴリ別に集計し、緊急度の高い問題から優先順位をつけてレポートを作成して

&gt; 本番サーバーのデプロイ前チェックリストを実行して、
&gt; 問題があれば詳細を報告して（実際のデプロイはしないこと）</code></pre>
<p>Terminal-Bench 2.0スコア77.3%の実力が発揮される領域です。</p>
<h3><span id="toc55">シーン4: 夜間バッチ処理の自動化</span></h3>
<pre><code class="language-bash"># 夜間に安全な完全自動モードで実行（サンドボックスは有効）
codex --approval-policy never \
  "todayリリース候補のブランチをテストして、問題があればissueを作成して"</code></pre>
<h3><span id="toc56">シーン5: 社内ツールへのカスタム組み込み</span></h3>
<p>Apache-2.0ライセンスのため、社内ツールへの改造・組み込みが自由です。</p>
<pre><code class="language-bash"># 独自のワークフローをAGENTS.mdで定義
# 社内のコーディング規約・セキュリティポリシーを強制適用
# 社内MCPサーバーと連携してDBや社内APIにアクセス</code></pre>
<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%2BClaude%2BCode%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D359XA1WJGH366%26sprefix%3D%25E6%259C%25AC%2Bclaude%2Bcode%252Caps%252C183%26ref%3Dnb_sb_noss_2" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 Claude Code]</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>
<h2><span id="toc57">まとめ</span></h2>
<p>Codex CLIは、2026年3月時点でClaude Code・Gemini CLIと並ぶ主要なターミナル型AIエージェントです。</p>
<p><strong>主要なポイント：</strong></p>
<p>✅ <strong>メリット</strong></p>
<ul>
<li><strong>ターミナル作業能力（Terminal-Bench）が業界最高水準（77.3%）</strong></li>
<li>サンドボックスによる安全な完全自動化が可能</li>
<li>CI/CDパイプラインへの組み込みに最適な設計</li>
<li>Apache-2.0オープンソースで社内カスタマイズが自由</li>
<li>gpt-5.3-codexの100万トークンで大規模コードベースに対応</li>
<li>Cerebras統合で1,000トークン/秒超の高速処理</li>
</ul>
<p>⚠️ <strong>デメリット・注意点</strong></p>
<ul>
<li>完全無料枠はなし（APIキー or ChatGPT Plus必須）</li>
<li>WindowsネイティブはWSL推奨</li>
<li>日本語コミュニティがまだ発展途上</li>
<li>APIキー利用時は予算管理が必要</li>
</ul>
<p>🎯 <strong>こんな方に特におすすめ</strong></p>
<ul>
<li>CI/CDパイプラインにAIエージェントを安全に組み込みたい方</li>
<li>シェル操作・ターミナル作業を高度に自動化したい方</li>
<li>Apache-2.0ライセンスで社内ツールにカスタム組み込みしたい方</li>
<li>gpt-5系モデルでターミナルエージェントを使いたい方</li>
</ul>
<p><strong>次のステップ：</strong></p>
<p>まずは <code>npm install -g @openai/codex</code> でインストールして、簡単なファイル操作からお試しください。APIキーのコスト管理に注意しながら、日常的な開発タスクで効果を体感してみてください。</p>
<p><strong>関連記事：</strong></p>
<ul>
<li>Claude Code完全ガイド｜ターミナルで動くAIコーディングアシスタントの全貌</li>
</ul>

<a rel="noopener" href="https://caymezon.com/claude-code-overview/" title="Claude Code完全ガイド｜ターミナルで動くAIコーディングアシスタントの全貌【2026年3月版】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/claude-code-overview-featured-a281ac-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Claude Code完全ガイド｜ターミナルで動くAIコーディングアシスタントの全貌【2026年3月版】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「AIにコードを書かせたいけど、ブラウザとエディタを行き来するのが面倒…」そんな悩みを解決するのがClaude Codeです。2026年3月時点で、Anthropicが提供するターミナル型AIエージェントとして、開発者の間で急速に注...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.14</div></div></div></div></a>
<ul>
<li>Gemini CLI完全ガイド｜ターミナルで動くGoogleのAIエージェントの全貌</li>
</ul>

<a rel="noopener" href="https://caymezon.com/gemini-cli-overview/" title="Gemini CLI完全ガイド｜ターミナルで動くGoogleのAIエージェントの全貌【2026年3月最新】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/gemini-cli-overview-featured-836add-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/gemini-cli-overview-featured-836add-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/gemini-cli-overview-featured-836add-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/gemini-cli-overview-featured-836add-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/gemini-cli-overview-featured-836add-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Gemini CLI完全ガイド｜ターミナルで動くGoogleのAIエージェントの全貌【2026年3月最新】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「Claude CodeみたいなAIコーディングエージェントを試したいけど、費用を抑えたい…」「Googleが出しているターミナル版AIエージェントって何ができるの？」そんな疑問を持つエンジニアに向けて、Gemini CLIの全貌を...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.21</div></div></div></div></a>
<ul>
<li>Claude Code vs Gemini CLI vs Codex CLI｜できること・できないことを徹底比較【2026年3月版】</li>
</ul>

<a rel="noopener" href="https://caymezon.com/codex-cli-vs-claude-code-vs-gemini-cli/" title="Claude Code vs Gemini CLI vs Codex CLI｜できること・できないことを徹底比較【2026年3月版】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/03/codex-cli-vs-claude-code-vs-gemini-cli-featured-f0d8df-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/03/codex-cli-vs-claude-code-vs-gemini-cli-featured-f0d8df-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/03/codex-cli-vs-claude-code-vs-gemini-cli-featured-f0d8df-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/03/codex-cli-vs-claude-code-vs-gemini-cli-featured-f0d8df-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/03/codex-cli-vs-claude-code-vs-gemini-cli-featured-f0d8df-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Claude Code vs Gemini CLI vs Codex CLI｜できること・できないことを徹底比較【2026年3月版】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「ターミナル型AIエージェントが乱立していて、どれを選べばいいか分からない…」Claude Code（Anthropic）、Gemini CLI（Google）、Codex CLI（OpenAI）——三大AI企業がそれぞれターミナル...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.03.28</div></div></div></div></a>
<hr>
<p><strong>タグ:</strong> #CodexCLI #Codex #OpenAI #AI #コーディング #開発効率化 #ターミナル #エージェント</p><p>The post <a href="https://caymezon.com/codex-cli-overview/">OpenAI Codex CLI完全ガイド｜ターミナルで動くOpenAIのAIエージェントの全貌【2026年3月最新】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/codex-cli-overview/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【実践編】Claude Cowork 活用事例10パターン - プロンプトの使い方と得られる効果まとめ</title>
		<link>https://caymezon.com/claude-cowork-use-cases-10-patterns/</link>
					<comments>https://caymezon.com/claude-cowork-use-cases-10-patterns/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sat, 28 Mar 2026 05:35:21 +0000</pubDate>
				<category><![CDATA[AI & Next Tech]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Cowork]]></category>
		<category><![CDATA[デスクトップ自動化]]></category>
		<category><![CDATA[活用事例]]></category>
		<category><![CDATA[生産性]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20296</guid>

					<description><![CDATA[<p>はじめに 「Claude Coworkって面白そうだけど、具体的に何ができるの？」 この記事では、Coworkを実際に使ってみて「これは便利だ」と感じた利用シーンを10パターン厳選して紹介します。実際に入力するプロンプト [&#8230;]</p>
<p>The post <a href="https://caymezon.com/claude-cowork-use-cases-10-patterns/">【実践編】Claude Cowork 活用事例10パターン - プロンプトの使い方と得られる効果まとめ</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>「Claude Coworkって面白そうだけど、具体的に何ができるの？」</p>
<p>この記事では、Coworkを実際に使ってみて「これは便利だ」と感じた利用シーンを10パターン厳選して紹介します。<strong>実際に入力するプロンプト例</strong>と<strong>得られる効果</strong>をセットで解説するので、読んだその日から試せます。</p>
<p>Coworkの概要・セットアップ方法については先にこちらをご覧ください。</p>

<a rel="noopener" href="https://caymezon.com/claude-cowork-complete-guide/" title="【2026年最新】Claude Coworkとは？完全ガイド - PCデスクトップ作業でAIを使ってできること" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【2026年最新】Claude Coworkとは？完全ガイド - PCデスクトップ作業でAIを使ってできること</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「この繰り返し作業、AIに任せられたらいいのに」と思ったことはありませんか？Claude Coworkは、その願いをそのまま実現する機能です。ファイル整理・レポート作成・ブラウザ操作まで、あなたのPCを自律的に操作してタスクを完了し...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.03.28</div></div></div></div></a>
<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":"実践Claude Code入門―現場で活用するためのAIコーディングの思考法","b":"技術評論社","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51kkd9SNiVL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4297153548","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\/4297153548","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\/%E5%AE%9F%E8%B7%B5Claude%20Code%E5%85%A5%E9%96%80%E2%80%95%E7%8F%BE%E5%A0%B4%E3%81%A7%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95\/","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=%E5%AE%9F%E8%B7%B5Claude%20Code%E5%85%A5%E9%96%80%E2%80%95%E7%8F%BE%E5%A0%B4%E3%81%A7%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"lxeQQ","s":"s"});</script></p>
<div id="msmaflink-lxeQQ">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<hr>
<h2><span id="toc2">📋 10パターン一覧</span></h2>
<table>
<thead>
<tr>
<th>#</th>
<th>シーン</th>
<th>対象ユーザー</th>
<th>難易度</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>スクリーンショット・写真の自動整理</td>
<td>誰でも</td>
<td>★☆☆</td>
</tr>
<tr>
<td>2</td>
<td>複数CSVを集計してExcelレポート作成</td>
<td>事務・経理</td>
<td>★☆☆</td>
</tr>
<tr>
<td>3</td>
<td>週次作業ログからレポートを自動生成</td>
<td>会社員・フリーランス</td>
<td>★★☆</td>
</tr>
<tr>
<td>4</td>
<td>フォルダ内ファイルの重複・古いファイル整理</td>
<td>誰でも</td>
<td>★☆☆</td>
</tr>
<tr>
<td>5</td>
<td>Webページの情報収集→比較表・まとめ資料作成</td>
<td>ライター・企画職</td>
<td>★★☆</td>
</tr>
<tr>
<td>6</td>
<td>ログイン済みWebサービスのデータ確認・操作</td>
<td>誰でも</td>
<td>★★☆</td>
</tr>
<tr>
<td>7</td>
<td>メールの下書きを複数件まとめて作成</td>
<td>営業・事務</td>
<td>★☆☆</td>
</tr>
<tr>
<td>8</td>
<td>プロジェクトフォルダ内のドキュメント整備</td>
<td>エンジニア・PM</td>
<td>★★☆</td>
</tr>
<tr>
<td>9</td>
<td>外出中にスマホからタスクを投げてPC側で実行</td>
<td>誰でも</td>
<td>★★☆</td>
</tr>
<tr>
<td>10</td>
<td>Chrome拡張機能を活用したWebサービスの自動操作</td>
<td>中級者向け</td>
<td>★★★</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">パターン1：スクリーンショット・写真の自動整理</span></h2>
<h3><span id="toc4">こんな状況に</span></h3>
<p>デスクトップや特定フォルダに大量の画像ファイルが溜まっていて、整理する気力がない。</p>
<h3><span id="toc5">プロンプト例</span></h3>
<pre><code class="language-plaintext">「C:\Users\あなた\Pictures\Screenshots フォルダにある画像を、
 ファイルの作成日ごとに「2026-01」「2026-02」のような
 年月フォルダに分類して整理してください。
 さらに各月のファイル数をカウントして一覧表をExcelで出力してください」</code></pre>
<h3><span id="toc6">得られる効果</span></h3>
<ul>
<li>手作業で数時間かかる分類が数分で完了</li>
<li>ファイル数の集計表も自動作成（Excelで見やすく整形）</li>
<li>整理後のフォルダ構成をレポートとして出力することも可能</li>
</ul>
<h3><span id="toc7">ポイント</span></h3>
<p>日付ベースの分類は最も成功率が高い操作です。まずここから試してみてください。</p>
<hr>
<h2><span id="toc8">パターン2：複数CSVを集計してExcelレポート作成</span></h2>
<h3><span id="toc9">こんな状況に</span></h3>
<p>各部署や取引先から届いたCSVファイルを毎月まとめて集計表を作っている。</p>
<h3><span id="toc10">プロンプト例</span></h3>
<pre><code class="language-plaintext">「C:\work\monthly-data フォルダ内にある
 2026年3月分のCSVファイル（接頭辞: sales_202603_）を全て読み込んで、
 部門別の売上合計と前月比を計算し、
 グラフ付きのExcel集計表として output\2026-03-report.xlsx に保存してください」</code></pre>
<h3><span id="toc11">得られる効果</span></h3>
<ul>
<li>10ファイルの集計が手作業30分→数分に短縮</li>
<li>グラフまで自動生成（棒グラフ・折れ線グラフ等）</li>
<li>計算ミスがなくなる</li>
</ul>
<h3><span id="toc12">ポイント</span></h3>
<p>「ファイル名のパターン」を伝えると、必要なファイルだけを正確に絞り込んでくれます。</p>
<hr>
<h2><span id="toc13">パターン3：週次作業ログからレポートを自動生成</span></h2>
<h3><span id="toc14">こんな状況に</span></h3>
<p>毎週テキストやメモに作業記録を残しているが、上司や顧客への報告書に整形するのが手間。</p>
<h3><span id="toc15">プロンプト例</span></h3>
<pre><code class="language-plaintext">「C:\work\logs\2026-03-24-week.txt を読んで、
 以下のテンプレート（C:\work\templates\weekly-report.docx）に沿って
 週次報告書を作成し、C:\work\reports\2026-03-28-weekly.docx として保存してください。
 完了事項・進行中・来週の予定の3セクションに整理してください」</code></pre>
<h3><span id="toc16">得られる効果</span></h3>
<ul>
<li>毎週30〜60分かかっていたレポート作成が5分以内に</li>
<li>テンプレートのフォーマットを崩さずに整形してくれる</li>
<li>記録の書き方が雑でも、適切にまとめ直してくれる</li>
</ul>
<h3><span id="toc17">ポイント</span></h3>
<p>テンプレートファイルをあらかじめ用意しておくと仕上がりが安定します。</p>
<hr>
<h2><span id="toc18">パターン4：フォルダ内の重複・古いファイル整理</span></h2>
<h3><span id="toc19">こんな状況に</span></h3>
<p>「○○_最終版」「○○_最終版2」「○○_本当の最終版」みたいなファイルが散乱している。</p>
<h3><span id="toc20">プロンプト例</span></h3>
<pre><code class="language-plaintext">「C:\work\documents フォルダ内のファイルを確認して、
 ファイル名に「_old」「_backup」「_旧」「_コピー」を含むファイルと、
 同じファイル名（番号違い）が複数あるものを一覧化してください。
 削除せずにリストとして archive-candidates.txt に書き出してください」</code></pre>
<h3><span id="toc21">得られる効果</span></h3>
<ul>
<li>整理候補の一覧が自動作成される</li>
<li>削除はせずリストだけ作ってもらうことで、誤削除のリスクゼロ</li>
<li>一覧を確認した後、改めて削除を依頼できる</li>
</ul>
<h3><span id="toc22">ポイント</span></h3>
<p><strong>削除操作はまず「一覧化だけ」に留めるのが安全</strong>。確認してから削除の2ステップにしましょう。</p>
<hr>
<h2><span id="toc23">パターン5：Webページの情報収集→比較表・まとめ資料作成</span></h2>
<h3><span id="toc24">こんな状況に</span></h3>
<p>競合他社の料金ページや製品スペックを調べて比較表を作る仕事がある。</p>
<h3><span id="toc25">プロンプト例（Claude in Chrome拡張機能が必要）</span></h3>
<pre><code class="language-plaintext">「以下の3社のサービスページを順番に開いて、
 プラン名・月額料金・主な機能・無料トライアルの有無を確認して、
 Markdownの比較表を作成し C:\work\compare.md として保存してください。

 ・サービスA: https://example-a.com/pricing
 ・サービスB: https://example-b.com/pricing
 ・サービスC: https://example-c.com/pricing」</code></pre>
<h3><span id="toc26">得られる効果</span></h3>
<ul>
<li>複数サイトを手作業でタブを行き来しながらメモする作業がゼロに</li>
<li>比較表が自動生成され、そのままWordやスライドに貼れる形に</li>
</ul>
<h3><span id="toc27">ポイント</span></h3>
<p>ブラウザ操作には<strong>Claude in Chrome拡張機能</strong>のインストールが必要です（詳細は後述のパターン10）。</p>
<hr>
<h2><span id="toc28">パターン6：ログイン済みWebサービスのデータ確認・操作</span></h2>
<h3><span id="toc29">こんな状況に</span></h3>
<p>毎朝・毎週、決まったWebサービスを開いてデータを確認するルーティン作業がある。</p>
<h3><span id="toc30">プロンプト例（Claude in Chrome拡張機能が必要）</span></h3>
<pre><code class="language-plaintext">「Chromeを起動してアクセス解析ツールのダッシュボードを開き、
 今週のページビュー数・ユニークユーザー数・直帰率を確認して、
 C:\work\analytics\2026-03-28.txt にメモしてください」</code></pre>
<h3><span id="toc31">得られる効果</span></h3>
<ul>
<li>毎朝の「確認して記録する」ルーティンが完全自動化</li>
<li>確認し忘れや記録漏れがなくなる</li>
<li>PCから離れている間に実行できる（Dispatch経由で）</li>
</ul>
<h3><span id="toc32">ポイント</span></h3>
<p><strong>すでにログイン済みのブラウザプロファイルを使うのが鍵</strong>。ログイン作業をCoworkにさせる必要がなくなるため、2段階認証で止まるリスクがなくなります。</p>
<hr>
<h2><span id="toc33">パターン7：メールの下書きを複数件まとめて作成</span></h2>
<h3><span id="toc34">こんな状況に</span></h3>
<p>複数の取引先へ似たような内容のメールを送る必要があるが、一件ずつ書くのが面倒。</p>
<h3><span id="toc35">プロンプト例</span></h3>
<pre><code class="language-plaintext">「C:\work\mail-list.csv を読み込んでください。
 各行には会社名・担当者名・送付内容が入っています。
 それぞれに合わせた件名と本文を含むメールの下書きを作成し、
 C:\work\mail-drafts\ フォルダに会社名.txt として保存してください」</code></pre>
<h3><span id="toc36">得られる効果</span></h3>
<ul>
<li>10件のメール下書きが一度に生成される</li>
<li>担当者名や内容を個別にカスタマイズしてくれる</li>
<li>確認してから送信するだけの状態に整えてくれる</li>
</ul>
<h3><span id="toc37">ポイント</span></h3>
<p>CSVに「カスタマイズしたい情報」を列として入れておくと、パーソナライズ度が上がります。</p>
<hr>
<h2><span id="toc38">パターン8：プロジェクトフォルダ内のドキュメント整備</span></h2>
<h3><span id="toc39">こんな状況に</span></h3>
<p>開発プロジェクトのフォルダ内にREADMEがなかったり、ファイル構成が把握しにくい状態になっている。</p>
<h3><span id="toc40">プロンプト例</span></h3>
<pre><code class="language-plaintext">「C:\projects\my-app フォルダの構成を確認して、
 プロジェクトの概要・ディレクトリ構造・主要ファイルの説明・
 環境構築手順を含むREADME.md を生成してください。
 既存のコードやpackage.jsonの内容を参考にしてください」</code></pre>
<h3><span id="toc41">得られる効果</span></h3>
<ul>
<li>コードを読みながらREADMEを手書きする作業がゼロに</li>
<li>新しいメンバーが参加したときにすぐ共有できる資料が整う</li>
<li>複数プロジェクト分を一気に処理できる</li>
</ul>
<h3><span id="toc42">ポイント</span></h3>
<p><code>package.json</code> や設定ファイルを読み込んでもらうことで、より正確な内容が生成されます。</p>
<hr>
<h2><span id="toc43">パターン9：外出中にスマホからタスクを投げてPC側で実行（Dispatch活用）</span></h2>
<h3><span id="toc44">こんな状況に</span></h3>
<p>移動中に「あ、あの資料整理しておきたい」と思いついた。PCは起動したまま。</p>
<h3><span id="toc45">使い方の流れ</span></h3>
<pre><code class="language-plaintext">1. スマホのClaudeアプリを開く
2. Coworkの「Dispatch」機能からタスクを送信
   例:「Documents/提案書フォルダのPDFを
       取引先名ごとにサブフォルダに整理して」
3. 帰宅するとPC上での整理が完了している</code></pre>
<h3><span id="toc46">得られる効果</span></h3>
<ul>
<li>移動中・休憩中に思いついたタスクをその場で投げられる</li>
<li>帰宅時には作業完了状態になっている</li>
<li>PCを操作する必要がない時間を有効活用できる</li>
</ul>
<h3><span id="toc47">ポイント</span></h3>
<p><strong>PCは起動・ログイン状態である必要があります。</strong> スリープ設定はオフにしておくか、「電源オプション」でスリープまでの時間を長く設定しておきましょう。</p>
<hr>
<h2><span id="toc48">パターン10：Claude in Chrome拡張機能を活用したWebサービスの自動操作</span></h2>
<h3><span id="toc49">Claude in Chrome拡張機能とは</span></h3>
<p>CoworkがChromeブラウザを操作するためのブリッジ役となる公式拡張機能です。</p>
<h3><span id="toc50">セットアップの仕組み</span></h3>
<pre><code class="language-plaintext">Cowork（デスクトップアプリ）
    ↓ 操作指示
Claude in Chrome拡張機能（Chromeにインストール）
    ↓ 有料プランアカウントでサインインが必要
Chrome上のWebページを操作
    ↓ Webサービスのアカウントは別でOK
各種WebサービスのページをCoworkが操作</code></pre>
<p><strong>重要</strong>: 拡張機能のサインインに使うClaudeアカウント（有料プラン）と、開くWebサービスのアカウントは<strong>別々に設定できます</strong>。</p>
<h3><span id="toc51">応用できるシーン</span></h3>
<table>
<thead>
<tr>
<th>シーン</th>
<th>具体例</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>広告・アクセス解析</strong></td>
<td>Google Analytics・AdSense のレポートを定期確認</td>
</tr>
<tr>
<td><strong>ECサイト管理</strong></td>
<td>受注状況の確認・在庫確認</td>
</tr>
<tr>
<td><strong>SNS確認</strong></td>
<td>エンゲージメント数・フォロワー数の記録</td>
</tr>
<tr>
<td><strong>SaaS管理画面</strong></td>
<td>請求情報・利用状況の確認</td>
</tr>
<tr>
<td><strong>フォーム操作</strong></td>
<td>定型的なフォーム入力作業</td>
</tr>
</tbody>
</table>
<h3><span id="toc52">プロンプト例（広告レポート確認）</span></h3>
<pre><code class="language-plaintext">「Chromeで広告管理ツールを開いて、
 今週のインプレッション数・クリック数・収益を確認し、
 C:\work\ad-reports\2026-03-28.txt に記録してください」</code></pre>
<h3><span id="toc53">ポイントと注意</span></h3>
<pre><code class="language-plaintext">✅ ログイン済みのブラウザプロファイルを使う → ログイン不要で操作できる
✅ 2段階認証なしのサービスから試す → 止まるリスクが低い
⚠️ 重要な操作（削除・送信など）は確認ステップを入れる
⚠️ 初めての操作は「確認だけ」から始める</code></pre>
<hr>
<h2><span id="toc54">💡 うまく使うための共通のコツ</span></h2>
<h3><span id="toc55">1. 許可フォルダを事前に登録する</span></h3>
<p>作業させたいフォルダは<strong>必ず事前にCoworkのプロジェクトに追加</strong>しておきます。登録していないフォルダへのアクセスはできません。</p>
<h3><span id="toc56">2. 「削除」より「移動」や「一覧化」から始める</span></h3>
<pre><code class="language-plaintext">❌ 「古いファイルを削除して」
✅ 「古いファイルを一覧化して」→ 確認後 →「一覧のファイルをarchiveフォルダに移動して」</code></pre>
<h3><span id="toc57">3. 出力先を明示する</span></h3>
<p>「保存して」だけでなく「〇〇フォルダにXXX.xlsxとして保存して」のように<strong>ファイル名と場所を指定</strong>すると迷子になりません。</p>
<h3><span id="toc58">4. 段階的に依頼する</span></h3>
<p>複雑な作業は一度に全部頼まず、ステップごとに確認しながら進めると安全です。</p>
<h3><span id="toc59">5. ブラウザ操作は「ログイン済み状態」を前提に</span></h3>
<p>事前に必要なWebサービスにログインしておくことで、認証で止まるリスクを最小化できます。</p>
<hr>
<h2><span id="toc60">📊 パターン別 難易度・効果まとめ</span></h2>
<table>
<thead>
<tr>
<th>パターン</th>
<th>事前準備</th>
<th>習得難易度</th>
<th>時間短縮効果</th>
</tr>
</thead>
<tbody>
<tr>
<td>1. ファイル整理</td>
<td>フォルダ登録のみ</td>
<td>★☆☆</td>
<td>★★★</td>
</tr>
<tr>
<td>2. CSV集計</td>
<td>フォルダ登録のみ</td>
<td>★☆☆</td>
<td>★★★</td>
</tr>
<tr>
<td>3. レポート自動生成</td>
<td>テンプレート準備</td>
<td>★★☆</td>
<td>★★★</td>
</tr>
<tr>
<td>4. 重複ファイル整理</td>
<td>フォルダ登録のみ</td>
<td>★☆☆</td>
<td>★★☆</td>
</tr>
<tr>
<td>5. Web情報収集</td>
<td>Chrome拡張機能</td>
<td>★★☆</td>
<td>★★★</td>
</tr>
<tr>
<td>6. Webサービス確認</td>
<td>Chrome拡張機能＋ログイン済み</td>
<td>★★☆</td>
<td>★★☆</td>
</tr>
<tr>
<td>7. メール下書き</td>
<td>CSVテンプレート準備</td>
<td>★☆☆</td>
<td>★★★</td>
</tr>
<tr>
<td>8. ドキュメント整備</td>
<td>フォルダ登録のみ</td>
<td>★★☆</td>
<td>★★☆</td>
</tr>
<tr>
<td>9. Dispatch遠隔操作</td>
<td>PC起動状態</td>
<td>★★☆</td>
<td>★★☆</td>
</tr>
<tr>
<td>10. Chrome自動操作</td>
<td>Chrome拡張機能＋設定</td>
<td>★★★</td>
<td>★★★</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc61">📚 関連記事</span></h2>
<ul>
<li>【2026年最新】Claude Cowork完全ガイド - PCデスクトップ作業をAIに丸投げする方法</li>
</ul>

<a rel="noopener" href="https://caymezon.com/claude-cowork-complete-guide/" title="【2026年最新】Claude Coworkとは？完全ガイド - PCデスクトップ作業でAIを使ってできること" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【2026年最新】Claude Coworkとは？完全ガイド - PCデスクトップ作業でAIを使ってできること</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「この繰り返し作業、AIに任せられたらいいのに」と思ったことはありませんか？Claude Coworkは、その願いをそのまま実現する機能です。ファイル整理・レポート作成・ブラウザ操作まで、あなたのPCを自律的に操作してタスクを完了し...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.03.28</div></div></div></div></a>
<ul>
<li>【2026年版】Claude Desktop 効果的な活用ガイド - ベストプラクティス完全版</li>
</ul>

<a rel="noopener" href="https://caymezon.com/claude-desktop-best-practices-guide/" title="【2026年版】Claude Desktop 効果的な活用ガイド - メリット・デメリット・ベストプラクティス完全版" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/01/claude-desktop-best-practices-guide-featured-88b844-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/01/claude-desktop-best-practices-guide-featured-88b844-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/01/claude-desktop-best-practices-guide-featured-88b844-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/01/claude-desktop-best-practices-guide-featured-88b844-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/01/claude-desktop-best-practices-guide-featured-88b844-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【2026年版】Claude Desktop 効果的な活用ガイド - メリット・デメリット・ベストプラクティス完全版</div><div class="blogcard-snippet internal-blogcard-snippet">はじめにClaude Desktopは、Claudeをネイティブアプリとして利用できる強力なツールです。本記事では、Web版との違い、効果的な使い方、トークン消費を最小化するテクニック、そして今後の展望まで、実践的な知見を完全網羅します。(...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.01.24</div></div></div></div></a>
<hr>
<h2><span id="toc62">📝 まとめ</span></h2>
<p>Claude Coworkは「やりたいことを日本語で伝えるだけ」で動いてくれる、まさに<strong>デジタル秘書</strong>です。</p>
<p>今回紹介した10パターンのうち、まず試してほしいのは**パターン1（ファイル整理）<strong>と</strong>パターン2（CSV集計）**です。特別な準備不要で、効果を実感しやすい操作です。</p>
<p>慣れてきたらChrome拡張機能を使ったブラウザ操作に挑戦してみてください。定型的なWeb確認作業が自動化されると、「なんであれを手作業でやっていたんだろう」と感じるはずです。</p>
<p>Coworkの概要・セットアップ方法はこちら：</p>

<a rel="noopener" href="https://caymezon.com/claude-cowork-complete-guide/" title="【2026年最新】Claude Coworkとは？完全ガイド - PCデスクトップ作業でAIを使ってできること" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-complete-guide-featured-f582d7-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【2026年最新】Claude Coworkとは？完全ガイド - PCデスクトップ作業でAIを使ってできること</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「この繰り返し作業、AIに任せられたらいいのに」と思ったことはありませんか？Claude Coworkは、その願いをそのまま実現する機能です。ファイル整理・レポート作成・ブラウザ操作まで、あなたのPCを自律的に操作してタスクを完了し...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.03.28</div></div></div></div></a>
<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":"Claude CodeによるAI駆動開発入門","b":"","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/41Ana0tBMIL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B0G13D2JS4","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\/B0G13D2JS4","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\/Claude%20Code%E3%81%AB%E3%82%88%E3%82%8BAI%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80\/","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=Claude%20Code%E3%81%AB%E3%82%88%E3%82%8BAI%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"v1Sso","s":"s"});</script></p>
<div id="msmaflink-v1Sso">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc63">参考リンク</span></h2>
<ul>
<li><a href="https://support.claude.com/en/articles/13345190-get-started-with-cowork">Claude公式 - Coworkを始める</a></li>
<li><a href="https://claude.com/download">Claude Desktop ダウンロード</a></li>
</ul>
<hr>
<p><strong>更新履歴</strong></p>
<ul>
<li>2026-03-28: 初版公開</li>
</ul><p>The post <a href="https://caymezon.com/claude-cowork-use-cases-10-patterns/">【実践編】Claude Cowork 活用事例10パターン - プロンプトの使い方と得られる効果まとめ</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/claude-cowork-use-cases-10-patterns/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【2026年最新】Claude Coworkとは？完全ガイド - PCデスクトップ作業でAIを使ってできること</title>
		<link>https://caymezon.com/claude-cowork-complete-guide/</link>
					<comments>https://caymezon.com/claude-cowork-complete-guide/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sat, 28 Mar 2026 05:35:16 +0000</pubDate>
				<category><![CDATA[AI & Next Tech]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Cowork]]></category>
		<category><![CDATA[チュートリアル]]></category>
		<category><![CDATA[デスクトップ自動化]]></category>
		<category><![CDATA[生産性]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20294</guid>

					<description><![CDATA[<p>はじめに 「この繰り返し作業、AIに任せられたらいいのに」と思ったことはありませんか？ Claude Coworkは、その願いをそのまま実現する機能です。ファイル整理・レポート作成・ブラウザ操作まで、あなたのPCを自律的 [&#8230;]</p>
<p>The post <a href="https://caymezon.com/claude-cowork-complete-guide/">【2026年最新】Claude Coworkとは？完全ガイド - PCデスクトップ作業でAIを使ってできること</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2><span id="toc1">はじめに</span></h2>
<p>「この繰り返し作業、AIに任せられたらいいのに」と思ったことはありませんか？</p>
<p><strong>Claude Cowork</strong>は、その願いをそのまま実現する機能です。ファイル整理・レポート作成・ブラウザ操作まで、あなたのPCを自律的に操作してタスクを完了してくれます。コーディングスキルは一切不要。日本語で指示するだけです。</p>
<p>本記事では、Coworkの概要・機能・セットアップ方法・できること/できないことを初心者にもわかるよう徹底解説します。</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":"実践Claude Code入門―現場で活用するためのAIコーディングの思考法","b":"技術評論社","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51kkd9SNiVL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4297153548","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\/4297153548","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\/%E5%AE%9F%E8%B7%B5Claude%20Code%E5%85%A5%E9%96%80%E2%80%95%E7%8F%BE%E5%A0%B4%E3%81%A7%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95\/","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=%E5%AE%9F%E8%B7%B5Claude%20Code%E5%85%A5%E9%96%80%E2%80%95%E7%8F%BE%E5%A0%B4%E3%81%A7%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"lxeQQ","s":"s"});</script></p>
<div id="msmaflink-lxeQQ">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc2">🤖 Claude Coworkとは？</span></h2>
<h3><span id="toc3">「チャット」との違い</span></h3>
<p>Claude Desktopには3つのタブがあります。</p>
<table>
<thead>
<tr>
<th>タブ</th>
<th>モード</th>
<th>特徴</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>チャット</strong></td>
<td>対話型</td>
<td>質問・相談・コード生成など</td>
</tr>
<tr>
<td><strong>Cowork</strong></td>
<td>エージェント型</td>
<td>複数ステップのタスクを自律実行</td>
</tr>
<tr>
<td><strong>コード</strong></td>
<td>開発者向け</td>
<td>Claude Codeによるコーディング支援</td>
</tr>
</tbody>
</table>
<p>チャットが「会話しながら一緒に作業する」のに対し、**Coworkは「指示したら自分でPCを操作して完了まで持っていく」**モードです。</p>
<pre><code class="language-plaintext">チャット:
あなた → 指示 → Claude → 回答 → あなた → 次の指示 → ...（往復）

Cowork:
あなた → 指示 → Claude が自律的にPCを操作して完了まで実行</code></pre>
<h3><span id="toc4">登場の背景</span></h3>
<p>2026年1月にProプランユーザー全員に開放され、同年3月23日のアップデートでWindows/Mac両対応のコンピュータ操作機能が追加されました。それまで「開発者向け」だったAIエージェント機能が、<strong>誰でも使えるデスクトップツール</strong>として進化したのがCoworkです。</p>
<p><!-- ![Claude CoworkのUI画面](images/cowork-ui.jpg) --></p>
<h2><span id="toc5">💰 料金プランと機能差</span></h2>
<table>
<thead>
<tr>
<th>プラン</th>
<th>月額</th>
<th>Cowork機能</th>
<th>レート制限</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Pro</strong></td>
<td>$20</td>
<td>✅ フル利用可</td>
<td>標準</td>
</tr>
<tr>
<td><strong>Max 5x</strong></td>
<td>$100</td>
<td>✅ フル利用可</td>
<td>5倍</td>
</tr>
<tr>
<td><strong>Max 20x</strong></td>
<td>$200</td>
<td>✅ フル利用可</td>
<td>20倍</td>
</tr>
</tbody>
</table>
<p><strong>全プランで同じ機能が使えます。</strong> 違いはレート制限（連続して使える量）のみです。まずはProプランで十分です。</p>
<blockquote>
<p><strong>無料プランではCoworkは使えません。</strong> 有料プランへのアップグレードが必要です。</p>
</blockquote>
<h2><span id="toc6">🔧 セットアップ方法</span></h2>
<h3><span id="toc7">必要なもの</span></h3>
<ol>
<li><strong>Claude Desktopアプリ（最新版）</strong> — 古いバージョンにはCoworkタブがありません</li>
<li><strong>Proプラン以上のアカウント</strong></li>
<li><strong>Windows 10以上 または macOS Sonoma以上</strong></li>
</ol>
<blockquote>
<p><strong>Windows Homeをお使いの場合</strong>: 一部機能が制限される報告があります。Windows Pro/Enterpriseを推奨します。</p>
</blockquote>
<h3><span id="toc8">インストール手順</span></h3>
<p><strong>Step 1. 最新版のClaude Desktopをダウンロード</strong></p>
<p><a href="https://claude.com/download">https://claude.com/download</a> にアクセスしてWindows/Mac版をダウンロードします。</p>
<blockquote>
<p>すでにClaude Desktopを入れている場合でも、<strong>上書きインストールを推奨</strong>します。古いバージョンではCoworkタブが表示されないことがあります。</p>
</blockquote>
<p><strong>Step 2. インストーラーを実行</strong></p>
<p>ダウンロードしたファイルを実行し、追加ファイルの自動ダウンロードが完了するまで待ちます。</p>
<p><strong>Step 3. サインインして「Cowork」タブへ</strong></p>
<p>アプリ起動後、アカウントにサインインして上部の「Cowork」タブをクリックします。</p>
<p><!-- ![Coworkタブのスクリーンショット](images/cowork-tab.jpg) --></p>
<p><strong>Step 4. プロジェクト（フォルダ）を登録</strong></p>
<p>左サイドバーの「最初のプロジェクトを作成」からアクセスを許可するフォルダを指定します。<strong>Coworkは許可したフォルダ内のファイルのみ操作します。</strong></p>
<h3><span id="toc9">ブラウザ操作に必要な追加設定（Claude in Chrome拡張機能）</span></h3>
<p>ブラウザを自動操作させたい場合は、<strong>「Claude in Chrome」拡張機能</strong>のインストールが別途必要です。</p>
<ol>
<li>ChromeウェブストアでClaude in Chrome拡張機能をインストール</li>
<li>拡張機能を<strong>有料プランのアカウント</strong>でサインイン</li>
<li>これによりCoworkがChromeを操作できるようになります</li>
</ol>
<blockquote>
<p><strong>ポイント</strong>: 拡張機能へのサインインと、ブラウザで開くWebサービスのアカウントは<strong>別々でOK</strong>です。たとえば、拡張機能は有料プランのアカウントAでサインインしつつ、開くサービス（Google Analytics・AdSenseなど）は別のアカウントBでログイン済みの状態でも問題なく動作します。</p>
</blockquote>
<h2><span id="toc10">✅ できること</span></h2>
<h3><span id="toc11">1. ファイル操作</span></h3>
<pre><code class="language-plaintext">✅ 許可したフォルダ内のファイルを読み込み・作成・編集・保存
✅ フォルダの作成・ファイルの移動・コピー・名前変更
✅ 複数ファイルを横断して情報を収集・集計
✅ ExcelやWordファイルの作成（見栄えよく整形も可能）</code></pre>
<h3><span id="toc12">2. コンピュータ操作（2026年3月〜）</span></h3>
<pre><code class="language-plaintext">✅ ブラウザ（Chrome等）の起動・ページ遷移・クリック・フォーム入力
✅ デスクトップアプリの起動・操作
✅ PowerShell・コマンドプロンプトの実行
✅ スクリーンショットの撮影・保存</code></pre>
<h3><span id="toc13">3. マルチステップタスク</span></h3>
<pre><code class="language-plaintext">✅ 「〇〇して、次に△△して、最後に××して」という連続作業
✅ 条件分岐を含む処理（「もし〜なら〜して」）
✅ 複数のアプリをまたいだ作業</code></pre>
<h3><span id="toc14">4. Dispatch（スマホからの遠隔操作）</span></h3>
<pre><code class="language-plaintext">✅ スマホのClaudeアプリからタスクを送信
✅ PCが起動していれば外出中でもタスクを実行
✅ 帰宅時に作業が完了している状態にできる</code></pre>
<h3><span id="toc15">5. マーケットプレイス連携</span></h3>
<pre><code class="language-plaintext">✅ Google Drive・Gmail・Notion・Asana・DocuSign など
✅ 12種類以上のMCPコネクタ
✅ 企業向けプライベートマーケットプレイス</code></pre>
<h2><span id="toc16">❌ できないこと・注意が必要なこと</span></h2>
<table>
<thead>
<tr>
<th>状況</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>管理者権限が必要な操作</strong></td>
<td>UAC（管理者として実行）のダイアログが出ると止まる場合がある</td>
</tr>
<tr>
<td><strong>2段階認証・CAPTCHA</strong></td>
<td>ログイン中に人間の介入が必要になると止まる</td>
</tr>
<tr>
<td><strong>PCがオフの状態での操作</strong></td>
<td>PC起動・ログイン状態が前提</td>
</tr>
<tr>
<td><strong>印刷・スキャナ等のハードウェア制御</strong></td>
<td>画面操作の範囲外</td>
</tr>
<tr>
<td><strong>Webブラウザ版（claude.ai）</strong></td>
<td>Coworkはデスクトップアプリ専用</td>
</tr>
<tr>
<td><strong>Linux</strong></td>
<td>Claude DesktopはWindows/Mac専用（Linux非対応）</td>
</tr>
</tbody>
</table>
<p><strong>考え方</strong>:</p>
<pre><code class="language-plaintext">「人間がマウスとキーボードで操作できることはほぼできる」
「人間の判断・認証が必要な割り込み」が来ると止まる</code></pre>
<h2><span id="toc17">🎯 こんな人・場面に特に向いている</span></h2>
<pre><code class="language-plaintext">✅ 毎週同じ作業を繰り返している（レポート・集計・整理）
✅ 複数のファイルやアプリをまたぐ作業が多い
✅ PC操作は自分でできるが、時間がもったいない
✅ プログラミングはわからないが自動化したい
✅ 外出中でも作業を進めておきたい</code></pre>
<pre><code class="language-plaintext">❌ 単純な質問や相談 → チャットで十分
❌ コードを書く・レビューする → Claude Code（コードタブ）向け
❌ ブラウザ上だけで完結する作業 → Web版Claudeで可能</code></pre>
<h2><span id="toc18">⚠️ 使うときの注意点</span></h2>
<h3><span id="toc19">セキュリティ</span></h3>
<ul>
<li>Coworkに許可するフォルダは<strong>必要最小限に絞る</strong></li>
<li>重要なファイルを含むフォルダは許可しない</li>
<li>操作前に「何をするか」の確認画面が表示されるので、必ず内容を確認してから承認する</li>
</ul>
<h3><span id="toc20">失敗に備える</span></h3>
<ul>
<li>大量のファイル操作を行う前は<strong>バックアップを取っておく</strong></li>
<li>初めての操作は小さなフォルダで試す</li>
<li>削除操作は特に慎重に（ゴミ箱経由にするよう指示するとよい）</li>
</ul>
<h3><span id="toc21">レート制限</span></h3>
<ul>
<li>Proプランはレート制限があるため、大量のタスクを連続で投げると制限に達することがある</li>
<li>重い処理はMax 5x/20xプランが快適</li>
</ul>
<h2><span id="toc22">🔮 今後の展望</span></h2>
<ul>
<li>スマホアプリとの連携強化（Dispatch機能の拡充）</li>
<li>マーケットプレイスの対応サービス増加</li>
<li>企業向け機能（プライベートマーケットプレイス）の充実</li>
</ul>
<h2><span id="toc23">📊 メリット・デメリットまとめ</span></h2>
<h3><span id="toc24">メリット ✅</span></h3>
<table>
<thead>
<tr>
<th>カテゴリ</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>操作範囲</strong></td>
<td>ファイル・ブラウザ・アプリを横断して操作できる</td>
</tr>
<tr>
<td><strong>難易度</strong></td>
<td>コーディング不要・日本語で指示するだけ</td>
</tr>
<tr>
<td><strong>自律性</strong></td>
<td>途中で止まらず複数ステップを自動実行</td>
</tr>
<tr>
<td><strong>遠隔操作</strong></td>
<td>Dispatchでスマホからタスクを投げられる</td>
</tr>
<tr>
<td><strong>連携</strong></td>
<td>Google Drive等の外部サービスとも統合できる</td>
</tr>
</tbody>
</table>
<h3><span id="toc25">デメリット ❌</span></h3>
<table>
<thead>
<tr>
<th>カテゴリ</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>環境</strong></td>
<td>デスクトップアプリ必須（Web版不可）</td>
</tr>
<tr>
<td><strong>コスト</strong></td>
<td>有料プランが必要（$20/月〜）</td>
</tr>
<tr>
<td><strong>制限</strong></td>
<td>認証が必要な操作で止まることがある</td>
</tr>
<tr>
<td><strong>対応OS</strong></td>
<td>Windows/Macのみ（Linux非対応）</td>
</tr>
<tr>
<td><strong>ブラウザ操作</strong></td>
<td>Chrome拡張機能の追加設定が必要</td>
</tr>
</tbody>
</table>
<h2><span id="toc26">📚 関連記事</span></h2>
<ul>
<li>【2026年版】Claude Desktop 効果的な活用ガイド - ベストプラクティス完全版</li>
</ul>

<a rel="noopener" href="https://caymezon.com/claude-desktop-best-practices-guide/" title="【2026年版】Claude Desktop 効果的な活用ガイド - メリット・デメリット・ベストプラクティス完全版" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/01/claude-desktop-best-practices-guide-featured-88b844-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/01/claude-desktop-best-practices-guide-featured-88b844-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/01/claude-desktop-best-practices-guide-featured-88b844-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/01/claude-desktop-best-practices-guide-featured-88b844-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/01/claude-desktop-best-practices-guide-featured-88b844-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【2026年版】Claude Desktop 効果的な活用ガイド - メリット・デメリット・ベストプラクティス完全版</div><div class="blogcard-snippet internal-blogcard-snippet">はじめにClaude Desktopは、Claudeをネイティブアプリとして利用できる強力なツールです。本記事では、Web版との違い、効果的な使い方、トークン消費を最小化するテクニック、そして今後の展望まで、実践的な知見を完全網羅します。(...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.01.24</div></div></div></div></a>
<ul>
<li>【実践編】Claude Cowork 活用事例10パターン - プロンプト例と得られる効果まとめ</li>
</ul>

<a rel="noopener" href="https://caymezon.com/claude-cowork-use-cases-10-patterns/" title="【実践編】Claude Cowork 活用事例10パターン - プロンプトの使い方と得られる効果まとめ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-use-cases-10-patterns-featured-529b4f-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-use-cases-10-patterns-featured-529b4f-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-use-cases-10-patterns-featured-529b4f-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-use-cases-10-patterns-featured-529b4f-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-use-cases-10-patterns-featured-529b4f-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【実践編】Claude Cowork 活用事例10パターン - プロンプトの使い方と得られる効果まとめ</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「Claude Coworkって面白そうだけど、具体的に何ができるの？」この記事では、Coworkを実際に使ってみて「これは便利だ」と感じた利用シーンを10パターン厳選して紹介します。実際に入力するプロンプト例と得られる効果をセット...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.03.28</div></div></div></div></a>
<h2><span id="toc27">📝 まとめ</span></h2>
<p>Claude Coworkは、<strong>「PCでやっている繰り返し作業を丸投げしたい」すべての人に刺さる機能</strong>です。</p>
<p>プログラマーでなくても、専門知識がなくても、日本語で「〇〇して」と指示するだけで、ファイル整理・レポート作成・ブラウザ操作まで自律実行してくれます。</p>
<p>まずは<strong>スクリーンショット整理やファイル集計など、失敗しても困らない小さなタスク</strong>から試してみてください。「こんなことも任せられるの？」という驚きがきっとあります。</p>
<p>具体的なプロンプト例と活用シーンは以下の記事で10パターン紹介しています。</p>

<a rel="noopener" href="https://caymezon.com/claude-cowork-use-cases-10-patterns/" title="【実践編】Claude Cowork 活用事例10パターン - プロンプトの使い方と得られる効果まとめ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-use-cases-10-patterns-featured-529b4f-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-use-cases-10-patterns-featured-529b4f-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-use-cases-10-patterns-featured-529b4f-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-use-cases-10-patterns-featured-529b4f-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/03/claude-cowork-use-cases-10-patterns-featured-529b4f-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【実践編】Claude Cowork 活用事例10パターン - プロンプトの使い方と得られる効果まとめ</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「Claude Coworkって面白そうだけど、具体的に何ができるの？」この記事では、Coworkを実際に使ってみて「これは便利だ」と感じた利用シーンを10パターン厳選して紹介します。実際に入力するプロンプト例と得られる効果をセット...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.03.28</div></div></div></div></a>
<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":"Claude CodeによるAI駆動開発入門","b":"","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/41Ana0tBMIL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/B0G13D2JS4","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\/B0G13D2JS4","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\/Claude%20Code%E3%81%AB%E3%82%88%E3%82%8BAI%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80\/","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=Claude%20Code%E3%81%AB%E3%82%88%E3%82%8BAI%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"v1Sso","s":"s"});</script></p>
<div id="msmaflink-v1Sso">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc28">参考リンク</span></h2>
<ul>
<li><a href="https://support.claude.com/en/articles/13345190-get-started-with-cowork">Claude公式 - Coworkを始める</a></li>
<li><a href="https://claude.com/download">Claude Desktop ダウンロード</a></li>
</ul>
<hr>
<p><strong>更新履歴</strong></p>
<ul>
<li>2026-03-28: 初版公開</li>
</ul><p>The post <a href="https://caymezon.com/claude-cowork-complete-guide/">【2026年最新】Claude Coworkとは？完全ガイド - PCデスクトップ作業でAIを使ってできること</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/claude-cowork-complete-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
