<?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>DBサーバー - CayTech Lab</title>
	<atom:link href="https://caymezon.com/tag/db%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC/feed/" rel="self" type="application/rss+xml" />
	<link>https://caymezon.com</link>
	<description></description>
	<lastBuildDate>Sun, 29 Mar 2026 07:32:39 +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>DBサーバー - 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>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>目次 はじめにキーワード解説IPアドレス指定 vs SG参照前フェーズとの比較使用するAWSサービス構築するリソース全体の作業順序【重要】⓪ 自分のIPアドレスを確認する方法A: ルーター管理画面で確認（推奨）方法B:  [&#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[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">キーワード解説</a></li><li><a href="#toc3" tabindex="0">IPアドレス指定 vs SG参照</a></li><li><a href="#toc4" tabindex="0">前フェーズとの比較</a></li><li><a href="#toc5" tabindex="0">使用するAWSサービス</a></li><li><a href="#toc6" tabindex="0">構築するリソース</a></li><li><a href="#toc7" tabindex="0">全体の作業順序</a></li><li><a href="#toc8" tabindex="0">【重要】⓪ 自分のIPアドレスを確認する</a><ol><li><a href="#toc9" tabindex="0">方法A: ルーター管理画面で確認（推奨）</a></li><li><a href="#toc10" tabindex="0">方法B: コマンドで確認</a></li></ol></li><li><a href="#toc11" tabindex="0">① キーペアの作成</a></li><li><a href="#toc12" tabindex="0">② IAMロールの作成</a></li><li><a href="#toc13" tabindex="0">③ クライアントSGの作成</a></li><li><a href="#toc14" tabindex="0">④ DBサーバSGの作成（SG参照の設定）</a></li><li><a href="#toc15" tabindex="0">⑤ DBサーバEC2の起動</a><ol><li><a href="#toc16" tabindex="0">5-1. 基本設定</a></li><li><a href="#toc17" tabindex="0">5-2. セキュリティグループの設定</a></li><li><a href="#toc18" tabindex="0">5-3. IAMロールの設定</a></li><li><a href="#toc19" tabindex="0">5-4. UserDataの設定（MariaDBの自動インストール）</a></li><li><a href="#toc20" tabindex="0">5-5. インスタンスを起動する</a></li></ol></li><li><a href="#toc21" tabindex="0">⑥ クライアントEC2の起動</a><ol><li><a href="#toc22" tabindex="0">6-1. 基本設定</a></li><li><a href="#toc23" tabindex="0">6-2. セキュリティグループの設定</a></li><li><a href="#toc24" tabindex="0">6-3. IAMロールの設定</a></li><li><a href="#toc25" tabindex="0">6-4. UserDataの設定（mysqlクライアントのインストール）</a></li><li><a href="#toc26" tabindex="0">6-5. インスタンスを起動する</a></li></ol></li><li><a href="#toc27" tabindex="0">⑦ 動作確認</a><ol><li><a href="#toc28" tabindex="0">7-1. DBサーバの動作確認</a></li><li><a href="#toc29" tabindex="0">7-2. SG参照の確認：クライアントEC2からMySQL接続</a></li><li><a href="#toc30" tabindex="0">7-3. SG参照の効果を確認する（任意・スキップ可）</a></li></ol></li><li><a href="#toc31" tabindex="0">⑧ リソースの削除</a><ol><li><a href="#toc32" tabindex="0">1. EC2インスタンスを終了する（2台）</a></li><li><a href="#toc33" tabindex="0">2. セキュリティグループを削除する（2つ）</a></li><li><a href="#toc34" tabindex="0">3. IAMロールを削除する</a></li><li><a href="#toc35" tabindex="0">4. キーペアを削除する（任意）</a></li></ol></li><li><a href="#toc36" tabindex="0">CloudFormation版との比較</a></li><li><a href="#toc37" tabindex="0">トラブルシューティング</a></li><li><a href="#toc38" tabindex="0">まとめ</a></li><li><a href="#toc39" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<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>目次 はじめにCloudFormation vs コンソール：どれだけ違うかキーワード解説前提条件template.yaml の全文作業順序⓪ 自分のIPアドレスを確認する① キーペアの作成（コンソールで実施）② プロジ [&#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[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">CloudFormation vs コンソール：どれだけ違うか</a></li><li><a href="#toc3" tabindex="0">キーワード解説</a></li><li><a href="#toc4" tabindex="0">前提条件</a></li><li><a href="#toc5" tabindex="0">template.yaml の全文</a></li><li><a href="#toc6" tabindex="0">作業順序</a></li><li><a href="#toc7" tabindex="0">⓪ 自分のIPアドレスを確認する</a></li><li><a href="#toc8" tabindex="0">① キーペアの作成（コンソールで実施）</a></li><li><a href="#toc9" tabindex="0">② プロジェクトフォルダに移動する</a></li><li><a href="#toc10" tabindex="0">③ スタックの作成</a></li><li><a href="#toc11" tabindex="0">④ 作成完了・Outputsの確認</a><ol><li><a href="#toc12" tabindex="0">作成状況の確認</a></li><li><a href="#toc13" tabindex="0">Outputs（接続情報）の確認</a></li></ol></li><li><a href="#toc14" tabindex="0">⑤ 動作確認</a><ol><li><a href="#toc15" tabindex="0">5-1. DBサーバの動作確認</a></li><li><a href="#toc16" tabindex="0">5-2. SG参照の確認：クライアントEC2からMySQL接続</a></li><li><a href="#toc17" tabindex="0">5-3. SG参照の効果を確認する（任意・スキップ可）</a></li></ol></li><li><a href="#toc18" tabindex="0">⑥ スタックの削除</a></li><li><a href="#toc19" tabindex="0">コンソール版との比較</a></li><li><a href="#toc20" tabindex="0">トラブルシューティング</a></li><li><a href="#toc21" tabindex="0">まとめ</a><ol><li><a href="#toc22" tabindex="0">CloudFormationのメリットを実感できたポイント</a></li></ol></li><li><a href="#toc23" tabindex="0">コンソール版と比較してみる</a></li><li><a href="#toc24" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<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>
	</channel>
</rss>
