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

<channel>
	<title>CDK &#8211; エンジニア見習い</title>
	<atom:link href="https://otonan-syusyoku.work/archives/tag/cdk/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Thu, 12 Feb 2026 06:29:36 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>CDK &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>CDKで管理しているRDSを暗号化したい</title>
		<link>https://otonan-syusyoku.work/archives/2198</link>
					<comments>https://otonan-syusyoku.work/archives/2198#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Thu, 12 Feb 2026 06:29:36 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[生涯独学]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[CDK]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[RDS]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=2198</guid>

					<description><![CDATA[どうも、PHPerです。 先日、業務にて「既存のRDSのストレージを暗号化したい」という、シンプルかつ重たい要件が降ってきました。 これの何が困るかというと、皆様ご存知の通りRDSの仕様です。 RDSは作成後の暗号化ステ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">どうも、PHPerです。</p>



<p class="wp-block-paragraph">先日、業務にて<strong>「既存のRDSのストレージを暗号化したい」</strong>という、シンプルかつ重たい要件が降ってきました。</p>



<p class="wp-block-paragraph">これの何が困るかというと、皆様ご存知の通りRDSの仕様です。 RDSは<strong>作成後の暗号化ステータスの変更ができません</strong>。つまり、<strong>既存のRDSを暗号化するためには、「暗号化有効」設定で作り直す（再作成する）必要</strong>があります。 </p>



<p class="wp-block-paragraph"><a href="https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-remediate-unencrypted-amazon-rds-db-instances-and-clusters.html" target="_blank" rel="noreferrer noopener">参考: Amazon RDS DB インスタンスおよびクラスターの暗号化 &#8211; AWS Prescriptive Guidance</a></p>



<p class="wp-block-paragraph">さらに今回はインフラを <strong>AWS CDK</strong> で管理しています。<br> 単純にCDKのコードを書き換えてデプロイすると、CloudFormationの仕様により「リソースの置換」が発生し、予期せぬダウンタイムやデータ損失のリスクがあります。<br>また、よくある「スナップショットから復元して差し替え」という手法も、CDKのState管理との兼ね合いで今回は採用できませんでした。</p>



<p class="wp-block-paragraph">様々な制約がある中、「既存データを維持しつつ」「CDK管理のまま」暗号化リソースへ移行できたので、その手法を共有します。</p>



<h2 class="wp-block-heading">今回の要件と制約</h2>



<p class="wp-block-paragraph">今回のミッションにおける前提条件は以下の通りです。</p>



<ul class="wp-block-list">
<li><strong>既存RDSの暗号化</strong>（最重要）</li>



<li>既存データをそのまま移行できること</li>



<li>アプリ側の変更を避けるため、<strong>エンドポイント（またはDNS）の変更がないこと</strong></li>



<li><strong>ダウンタイムは許容</strong>（ALBでメンテナンス画面を挟む前提）</li>



<li>バッチ処理が稼働していない夜間帯での作業</li>



<li><strong>CDKコードの変更は最小限</strong>に留め、今後もCDKで管理し続けること</li>
</ul>



<h2 class="wp-block-heading">結論：CDKデプロイを3回行う</h2>



<p class="wp-block-paragraph">結論から言うと、<strong>「削除ポリシーを変更して既存RDSをCDK管理から切り離し、新規で暗号化RDSを作成する」</strong>という力技で解決しました。</p>



<p class="wp-block-paragraph">具体的には以下の3ステップでデプロイを行います。</p>



<ol start="1" class="wp-block-list">
<li><code>RemovalPolicy.RETAIN</code> を設定（既存保護）</li>



<li><code>instanceIdentifier</code> を変更（既存切り離し）</li>



<li><code>storageEncrypted: true</code> を指定（新規作成）</li>
</ol>



<h3 class="wp-block-heading">なぜこの手順が必要なのか？（ハマりポイント）</h3>



<p class="wp-block-paragraph">通常、CDKで管理されているリソースに対し、<code>instanceIdentifier</code>（物理ID）を固定したまま <code>storageEncrypted: true</code> に変更してデプロイしようとすると、以下のエラーが発生して失敗します。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>CloudFormation cannot update a stack when a custom-named resource requires replacing</strong></p>
</blockquote>



<p class="wp-block-paragraph">これは、「カスタム名（明示的な名前）がついているリソースを置換（削除＆作成）することはできない」というCloudFormationの安全装置です。これを回避するために、あえて識別子を変更して別リソースとして認識させる必要があります。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">手順詳細</h2>



<h3 class="wp-block-heading">1. 削除ポリシーの変更</h3>



<p class="wp-block-paragraph">まず、既存のRDSがCDKのスタック操作によって削除されないようにします。 これをやらないと、次の手順で「既存RDSの削除」が走ってしまい、データが消えます（超重要）。</p>



<p class="wp-block-paragraph">コード スニペット</p>



<pre class="wp-block-code"><code>new rds.DatabaseInstance(this, 'RdsInstance', {
  instanceIdentifier: 'my-prod-db', // 現在の識別子
  // ...
  removalPolicy: cdk.RemovalPolicy.RETAIN, // ここを追加！
});
</code></pre>



<p class="wp-block-paragraph">この状態で一度 <strong><code>cdk deploy</code></strong> します。 これで、このRDSはスタックから削除される際も、AWS上にはリソースが残るようになります。</p>



<h3 class="wp-block-heading">2. instanceIdentifier の変更</h3>



<p class="wp-block-paragraph">次に、既存のRDSをCDKの管理下から外す（Orphanにする）作業です。 CDK上の識別子を、既存のものとは別の名前に書き換えます。</p>



<p class="wp-block-paragraph">コード スニペット</p>



<pre class="wp-block-code"><code>new rds.DatabaseInstance(this, 'RdsInstance', {
  instanceIdentifier: 'my-prod-db-temp', // 3と被らない一時的な名前に変更
  // ...
  removalPolicy: cdk.RemovalPolicy.RETAIN,
});
</code></pre>



<p class="wp-block-paragraph">この状態で <strong><code>cdk deploy</code></strong> します。</p>



<p class="wp-block-paragraph"><strong>何が起きるか：</strong><br> CloudFormationは「<code>my-prod-db</code> を管理から外し、新しく <code>my-prod-db-temp</code> を作る」という挙動をします。 ステップ1で <code>RETAIN</code> を設定しているため、<strong>旧RDS（データ入り）は削除されずにそのまま残ります。</strong> <br>※この時点でアプリはまだ旧RDSを見ています。</p>



<h3 class="wp-block-heading">3. いよいよ暗号化RDSの構築</h3>



<p class="wp-block-paragraph">最後に、本命の「暗号化されたRDS」を作成します。</p>



<p class="wp-block-paragraph">コード スニペット</p>



<pre class="wp-block-code"><code>new rds.DatabaseInstance(this, 'RdsInstance', {
  instanceIdentifier: 'my-prod-db', // 元の名前に戻す（ここが変わるとエンドポイント変わるので注意）
  storageEncrypted: true,           // 暗号化をON
  removalPolicy: cdk.RemovalPolicy.RETAIN,
  // ...
});
</code></pre>



<p class="wp-block-paragraph">この状態で <strong><code>cdk deploy</code></strong> します。</p>



<p class="wp-block-paragraph"><strong>注意点：</strong><br>もし <code>instanceIdentifier</code> を手順1と同じ名前（<code>my-prod-db</code>）に戻したい場合、手順2の時点でAWS上に古い <code>my-prod-db</code> が残っているため、名前重複でエラーになる可能性があります。<br>その場合は、<strong>AWSマネジメントコンソールまたはCLIから、古いRDS（手順2で切り離されたもの）の識別子を手動で <code>my-prod-db-old</code> などにリネーム</strong> してからデプロイしてください。</p>



<p class="wp-block-paragraph">これで、暗号化された空っぽのRDSが立ち上がりました。</p>



<h2 class="wp-block-heading">データ移行</h2>



<p class="wp-block-paragraph">新旧2つのRDSが存在している状態になりました。</p>



<ul class="wp-block-list">
<li><strong>旧RDS</strong>
<ul class="wp-block-list">
<li>データあり</li>



<li>非暗号化</li>



<li>CDK管理外</li>
</ul>
</li>



<li><strong>新RDS</strong>
<ul class="wp-block-list">
<li>データなし</li>



<li>暗号化済み</li>



<li>CDK管理下</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">データ量がそれほど多くない（数GB〜数十GB程度）ため、今回はシンプルに <code>mysqldump</code> で移行を行いました。TB級の場合は AWS DMS (Database Migration Service) の利用を検討してください。</p>



<pre class="wp-block-code"><code># SSM Session Manager 等で踏み台サーバーに接続

# 1. 旧RDSからデータをエクスポート（パイプで圧縮して転送時間を短縮）
mysqldump -h &#91;旧RDSエンドポイント] -u &#91;ユーザー名] -p \
  --single-transaction --routines --triggers \
  --databases &#91;対象のスキーマ] \
  | gzip &gt; dump.sql.gz

# 2. 新RDSへインポート
zcat dump.sql.gz | mysqldump -h &#91;新RDSエンドポイント] -u &#91;ユーザー名] -p
</code></pre>



<p class="wp-block-paragraph">データの移行が完了したら、アプリケーションの接続先が新RDSに向いていることを確認し、メンテナンスを解除します。</p>



<h2 class="wp-block-heading">後片付け</h2>



<p class="wp-block-paragraph">無事稼働確認が取れたら、不要なリソースを削除してお財布を守りましょう。</p>



<ol start="1" class="wp-block-list">
<li><strong>手順2で立ち上がった一時的なRDS</strong>（CDKの管理からは外れているはずですが、念の為確認して削除）</li>



<li><strong>手順1以前から存在していた旧RDS</strong>（リネームした <code>my-prod-db-old</code> など）</li>
</ol>



<p class="wp-block-paragraph">スナップショットが取れていることを確認した上で、マネジメントコンソールから削除しました。</p>



<h2 class="wp-block-heading">(おまけ) 試したけどうまくいかなかったこと</h2>



<h3 class="wp-block-heading"><code>cdk import</code> での既存リソース取り込み</h3>



<p class="wp-block-paragraph">既存のリソースをリネームして、新しいスタックに取り込もうと <code>cdk import</code> を試みましたが、以下のようなメッセージが出てスキップされました。</p>



<pre class="wp-block-code"><code>TmpStack: no new resources compared to the currently deployed stack, skipping import.
</code></pre>



<p class="wp-block-paragraph">また、定義と実リソースのプロパティ（暗号化の有無）が食い違っているため、インポート自体が整合性エラーになる可能性が高いです。</p>



<h3 class="wp-block-heading"><code>DatabaseInstanceFromSnapshot</code> の利用</h3>



<p class="wp-block-paragraph">スナップショットから復元するCDKのクラスですが、これをメインの定義にしてしまうと、常に「スナップショットから作られた状態」が正となり、パラメータグループやバージョン更新などの運用時にドリフト（設定乖離）の管理が面倒になると判断し、今回は見送りました。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">CDKで管理しているステートフルなリソース（RDSなど）の「再作成必須な変更」は非常に神経を使います。 <strong>「Retainで保護」→「Identifier変更で管理から切り離し」→「新規作成」</strong> というフローは、RDSに限らず他のリソースでも応用が効くテクニックなので、覚えておいて損はないはずです。</p>



<p class="wp-block-paragraph">なにはともあれですが、RDSは最初から暗号化しましょう。これだけは覚えて頂けると。。。</p>



<p class="wp-block-paragraph">同じ悩みを抱えるPHPer（およびAWS使い）の助けになれば幸いです！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/2198/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
