<?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>ナギ｜システム基盤エンジニアの知見録</title>
	<atom:link href="https://sys-univ.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://sys-univ.com</link>
	<description>大手SIer20年超｜要件定義から設計・構築・試験・移行・運用まで、実務で使える知見を発信</description>
	<lastBuildDate>Wed, 04 Nov 2026 06:39:52 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://sys-univ.com/feed/"/>
	<item>
		<title>CodeConnectionsでGitLab Self-Managedに閉域接続する｜Invalid host endpoint providedの原因とVPC・証明書・認証の設計ポイント</title>
		<link>https://sys-univ.com/aws/codeconnections-gitlab-self-managed-vpc-error/</link>
					<comments>https://sys-univ.com/aws/codeconnections-gitlab-self-managed-vpc-error/#respond</comments>
		
		<dc:creator><![CDATA[ナギ]]></dc:creator>
		<pubDate>Wed, 04 Nov 2026 06:38:58 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<guid isPermaLink="false">https://sys-univ.com/?p=3597</guid>

					<description><![CDATA[AWS CodeBuildとGitLab Self-Managedを連携させる。AWSのマネージドサービスを利用すれば、比較的簡単に実現できそうに思えます。 しかし、GitLabがプライベートネットワーク内にあり、AWS [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">AWS CodeBuildとGitLab Self-Managedを連携させる。AWSのマネージドサービスを利用すれば、比較的簡単に実現できそうに思えます。</p>


<p class="wp-block-paragraph">しかし、GitLabがプライベートネットワーク内にあり、AWSアカウントも異なるとなると、話はそう単純ではありません。</p>


<p class="wp-block-paragraph">今回、EC2上のGitLab Self-ManagedとCodeBuildを連携するため、AWS CodeConnectionsの設定を進める過程で、次のエラーが問題となりました。</p>


<p class="wp-block-paragraph"><code>Invalid host endpoint provided.</code></p>


<p class="wp-block-paragraph">当初は、Transit Gateway（TGW）でVPC間の通信経路を確保すれば、あとはCodeConnectionsの設定だけで済むと考えていました。ところが、AWSサポートへの問い合わせを通じて、VPC接続、自己署名証明書、GitLabの認証、さらにCodeBuildのソース取得方式まで、切り分けるべき論点が次々と出てきました。</p>


<p class="wp-block-paragraph">本記事では、この事例を基に、閉域環境でCodeConnectionsを利用する際の設計ポイントを整理します。</p>


<h3 class="wp-block-heading">本記事の検証範囲</h3>


<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>区分</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>確認済み</td>
<td><code>Invalid host endpoint provided.</code> の発生、AWSサポートの回答、CodeConnectionsのAvailable表示</td>
</tr>
<tr>
<td>サポート回答に基づく経緯</td>
<td>VPC無効の状態でプライベートIPを指定するとエラーとなり、VPC設定の有効化によって接続可能になった</td>
</tr>
<tr>
<td>未検証</td>
<td>CodeBuildからのソース取得・ビルド実行、CodeBuild側の追加VPC・TLS設定の要否</td>
</tr>
</tbody>
</table>
</figure>


<h2 class="wp-block-heading">1. GitLabとCodeBuildを別AWSアカウントで連携する</h2>


<p class="wp-block-paragraph">今回の構成は、次のとおりです。</p>


<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>項目</th>
<th>構成</th>
</tr>
</thead>
<tbody>
<tr>
<td>ソースコード管理</td>
<td>GitLab Self-Managed</td>
</tr>
<tr>
<td>GitLabの稼働環境</td>
<td>Amazon EC2</td>
</tr>
<tr>
<td>ビルドサービス</td>
<td>AWS CodeBuild</td>
</tr>
<tr>
<td>AWSアカウント</td>
<td>GitLabとCodeBuildで別アカウント</td>
</tr>
<tr>
<td>VPC間接続</td>
<td>Transit Gateway</td>
</tr>
<tr>
<td>GitLabの公開範囲</td>
<td>プライベートネットワークのみ</td>
</tr>
<tr>
<td>通信プロトコル</td>
<td>HTTPS</td>
</tr>
<tr>
<td>TLS証明書</td>
<td>自己署名証明書</td>
</tr>
<tr>
<td>接続サービス</td>
<td>AWS CodeConnections</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">GitLabにはパブリックIPアドレスがなく、インターネットから直接アクセスできない構成です。</p>


<p class="wp-block-paragraph">VPC間はTGWで接続されていますが、TGWの接続が存在することと、CodeConnectionsからGitLabへ通信できることは別の話です。</p>


<p class="wp-block-paragraph">さらに、CodeConnectionsの接続設定、GitLab側での認可、CodeBuildによるソース取得では、それぞれ異なる通信や権限が関係します。</p>


<p class="wp-block-paragraph">最初はネットワークの問題だと思っていたものが、調べていくと認証や証明書の問題にも広がっていく。複数のAWSサービスを組み合わせる際に、こうした切り分けの難しさを感じる場面は少なくありません。</p>


<h2 class="wp-block-heading">2. CodeConnectionsの「ホスト」と「接続」は別物</h2>


<p class="wp-block-paragraph">エラーの原因を考える前に、CodeConnectionsの仕組みを整理しておきます。</p>


<p class="wp-block-paragraph">GitLab Self-Managedとの連携では、「ホスト」と「接続」という2種類のリソースを扱います。</p>


<p class="wp-block-paragraph"><strong>ホストはGitLabの設置環境を表すリソース</strong>で、GitLabのURL、VPC、サブネット、セキュリティグループ、必要に応じたTLS証明書などを設定します。</p>


<p class="wp-block-paragraph">一方、<strong>接続はGitLabアカウントによる認可を受け、AWSサービスからリポジトリへアクセスするためのリソース</strong>です。</p>


<p class="wp-block-paragraph">両者を区別すると、ネットワークや証明書の設定と、GitLabへのアクセス認可を分けて考えられます。</p>


<h3 class="wp-block-heading">PATはホストの認可に使用する</h3>


<p class="wp-block-paragraph">GitLab Self-Managedのホストをセットアップする際には、Personal Access Token（PAT）を使用します。</p>


<p class="wp-block-paragraph">AWS公式ドキュメントによれば、PATには次の要件があります。</p>


<ul class="wp-block-list">
	<li>GitLab管理者が作成・使用する</li>


	<li><code>api</code>スコープが必要</li>


	<li>GitLabのAdmin Modeが有効な場合は<code>admin_mode</code>も必要</li>


	<li>PATはホストの認可に使用され、接続では保存・使用されない</li>


	<li>ホストのセットアップ後にPATを削除できる</li>
</ul>


<p class="wp-block-paragraph">つまり、ホストの認可に使用したPATを、そのまま継続的なリポジトリアクセス用の認証情報として保持する必要はありません。</p>


<p class="wp-block-paragraph">参考：<a href="https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-create-gitlab-managed.html">AWS公式｜GitLab Self-Managedへの接続作成</a></p>


<h2 class="wp-block-heading">3. Invalid host endpoint provided. とVPC設定の関係</h2>


<p class="wp-block-paragraph">今回のエラーは、CodeConnectionsでGitLab Self-Managedのエンドポイントを設定する際に発生したものです。</p>


<p class="wp-block-paragraph"><code>Invalid host endpoint provided.</code></p>


<p class="wp-block-paragraph">AWSサポートからは、<strong>「VPCを使用する」が無効の状態でプライベートIPを指定すると、このエラーが発生する</strong>という説明がありました。</p>


<p class="wp-block-paragraph">また、VPC接続を有効にして必要なネットワーク設定を行うことで、Availableに至ったという経緯も示されています。</p>


<p class="wp-block-paragraph">このため、今回のエラーを切り分けるうえでは、接続先URLだけでなく、VPC接続の設定が有力な確認ポイントになります。</p>


<h3 class="wp-block-heading">プライベートIPのGitLabにはVPC接続を検討する</h3>


<p class="wp-block-paragraph">AWS公式ドキュメントでは、GitLab Self-Managedがプライベートネットワーク内に存在する場合、ホストの作成時に「Use a VPC」を選択する構成が示されています。</p>


<p class="wp-block-paragraph">設定する主な項目は、VPC ID、サブネットID、セキュリティグループIDです。</p>


<p class="wp-block-paragraph">ここで注意したいのは、GitLabが稼働するVPCと、CodeConnectionsに設定するVPCが必ずしも同一とは限らないことです。</p>


<p class="wp-block-paragraph">AWS公式手順では、VPNやDirect Connectを経由してGitLabへアクセスできるVPCの例が示されています。一方、今回のような別アカウント間のTGW構成については、同じ手順の中で明示的な例示がありません。</p>


<p class="wp-block-paragraph">今回の構成ではTGWを利用し、CodeConnectionsのAvailable表示まで到達しています。ただし、これだけでTGW経由のあらゆる構成がサポートされると判断することはできません。</p>


<h3 class="wp-block-heading">エラーが発生した場合の切り分け</h3>


<p class="wp-block-paragraph">同じエラーに遭遇した場合、まず次の4点を調べます。</p>


<ol class="wp-block-list">
	<li>GitLabのエンドポイントURLが適切か</li>


	<li>プライベートIPへの接続に対応したVPC設定になっているか</li>


	<li>設定したVPC・サブネットからGitLabへの経路があるか</li>


	<li>HTTPSの証明書が接続先と整合しているか</li>
</ol>


<p class="wp-block-paragraph">特に、プライベートIPを指定しているにもかかわらずVPC接続を使用していない場合は、最初に見直したい設定です。</p>


<h2 class="wp-block-heading">4. 閉域接続では、作業端末からのアクセスも必要になる</h2>


<p class="wp-block-paragraph">AWSからGitLabへのネットワーク疎通を考える際、見落としやすいのが接続の認可操作です。</p>


<p class="wp-block-paragraph">CodeConnectionsの公式手順では、接続を作成した後、ブラウザでGitLabにサインインし、「Authorize」を選択して認可します。</p>


<p class="wp-block-paragraph">AWS CLIやCloudFormationで接続リソースを作成した場合も、初期状態はPENDINGとなり、コンソールで認可を完了させる必要があります。</p>


<p class="wp-block-paragraph">ここで問題になるのが、<strong>設定作業を行う端末からGitLabへアクセスできるか</strong>という点です。</p>


<p class="wp-block-paragraph">例えば、AWS側のVPCからGitLabへ通信できても、作業PCが社内ネットワーク外にあり、GitLabのプライベートIPに到達できなければ、ブラウザで認可操作を進められない可能性があります。</p>


<p class="wp-block-paragraph">この場合は、社内VPNや管理用端末など、GitLabへアクセスできる正規の操作環境を用意する必要があります。</p>


<p class="wp-block-paragraph">AWSサービス間の通信経路だけを考えていたところに、作業端末からのアクセスという別の問題が出てくる。閉域ネットワークの設計では、こうした運用面まで含めて考える必要があります。</p>


<h2 class="wp-block-heading">5. TGW経由の通信と自己署名証明書をどう扱うか</h2>


<p class="wp-block-paragraph">今回の構成では、GitLabとCodeBuildが異なるAWSアカウントに存在します。</p>


<p class="wp-block-paragraph">VPC間はTGWで接続されていますが、TGWが存在するだけでは通信は成立しません。</p>


<p class="wp-block-paragraph">少なくとも、次の項目を整理する必要があります。</p>


<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>対象</th>
<th>設計上の論点</th>
</tr>
</thead>
<tbody>
<tr>
<td>VPCルートテーブル</td>
<td>GitLab側ネットワークへの経路</td>
</tr>
<tr>
<td>TGWルートテーブル</td>
<td>接続元・接続先への転送経路</td>
</tr>
<tr>
<td>戻り経路</td>
<td>GitLabから接続元へ応答できるか</td>
</tr>
<tr>
<td>セキュリティグループ</td>
<td>HTTPS通信の接続元を許可しているか</td>
</tr>
<tr>
<td>ネットワークACL</td>
<td>必要な通信が遮断されていないか</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">特に、CodeConnectionsとCodeBuildを同じ通信元として扱わないことが大切です。</p>


<p class="wp-block-paragraph">どのコンポーネントがGitLabに接続するかによって、必要なネットワーク設定は変わります。</p>


<h3 class="wp-block-heading">自己署名証明書の設定先</h3>


<p class="wp-block-paragraph">今回のGitLabでは、HTTPS通信に自己署名証明書を使用しています。</p>


<p class="wp-block-paragraph">AWS CodeConnectionsには、非公開認証局を利用する環境向けにTLS証明書を指定する設定があります。</p>


<p class="wp-block-paragraph">ただし、証明書を登録することと、TLS接続が正常に検証されることは同じではありません。</p>


<p class="wp-block-paragraph">接続先としてIPアドレスを使用する場合、証明書のSubject Alternative Name（SAN）に、そのIPアドレスが登録されているかが論点になります。</p>


<p class="wp-block-paragraph">証明書を信頼できても、接続先のIPアドレスが証明書と一致しなければ、ホスト名検証で失敗する可能性があります。</p>


<p class="wp-block-paragraph">この点は、実際の証明書を<code>openssl x509 -text</code>などで調べることで確認できます。</p>


<h2 class="wp-block-heading">6. CodeBuild側にもVPCや証明書の設定が必要なのか</h2>


<p class="wp-block-paragraph">今回、最も気になったのが、CodeBuild側の証明書設定に関するAWSサポートの回答です。</p>


<p class="wp-block-paragraph">サポートからは、CodeConnections側で証明書を設定していれば、CodeBuild側に特別な証明書設定は必要ないという趣旨の説明がありました。</p>


<p class="wp-block-paragraph">当初は、CodeConnectionsがGitLabとの通信を担うのであれば、その説明で理解できそうに思えました。しかし、CodeBuildの公式仕様を調べていくと、一つ疑問が残りました。</p>


<p class="wp-block-paragraph"><strong>CodeBuildが実際にGitLabからソースを取得する際、HTTPS通信はどのコンポーネントが実行するのでしょうか。</strong></p>


<p class="wp-block-paragraph">この点を整理しないまま、CodeBuild側の証明書設定が不要と判断するのは早いと感じました。</p>


<h3 class="wp-block-heading">ビルド環境からGitLabへ接続するならVPC設定が必要</h3>


<p class="wp-block-paragraph">CodeBuildのビルド環境から直接GitLabへGit cloneを実行する方式であれば、プライベートIPしか持たないGitLabへ到達できるネットワーク経路が必要です。</p>


<p class="wp-block-paragraph">通常、VPC設定のないCodeBuildのビルド環境はAWS管理のネットワークで動作するため、TGWで接続されたプライベートVPCへ、そのままアクセスできるわけではありません。</p>


<p class="wp-block-paragraph">したがって、<strong>ビルド環境が直接GitLabへ接続する方式なら、CodeBuild側にも到達可能なVPC設定と通信経路が必要</strong>になります。</p>


<p class="wp-block-paragraph">一方、CodeConnections側の仕組みでソース取得が完結する方式なら、必要なネットワーク構成は異なります。</p>


<p class="wp-block-paragraph">残る論点は、今回のCodeConnectionsを利用したソース取得が、どちらの方式で動作するかです。</p>


<h3 class="wp-block-heading">GetConnectionTokenから読み取れること</h3>


<p class="wp-block-paragraph">AWSのCodeBuild向けGitHub App接続手順では、サービスロールに次のIAM権限を付与する例が示されています。</p>


<pre class="wp-block-code"><code>{
  "Effect": "Allow",
  "Action": [
    "codeconnections:GetConnectionToken",
    "codeconnections:GetConnection"
  ],
  "Resource": "arn:aws:codeconnections:&lt;region&gt;:&lt;account-id&gt;:connection/&lt;id&gt;"
}</code></pre>


<p class="wp-block-paragraph"><code>GetConnectionToken</code>は、接続に関連する認証トークンを取得するためのアクションです。</p>


<p class="wp-block-paragraph">この仕組みから、CodeBuildが接続を通じて認証情報を取得し、ソース取得処理に利用する構成が考えられます。</p>


<p class="wp-block-paragraph">ただし、認証トークンを取得することと、ビルド環境から直接GitLabへ通信することは同義ではありません。IAM権限だけで実際の通信元を特定することはできません。</p>


<p class="wp-block-paragraph">なお、上記はGitHub App向け公式手順を基にした説明用のポリシー例です。実際のGitLab Self-Managed構成では、接続方式と必要権限に合わせて調整する必要があります。</p>


<p class="wp-block-paragraph">参考：<a href="https://docs.aws.amazon.com/codebuild/latest/userguide/connections-github-app.html">AWS公式｜GitHub App connections</a></p>


<h3 class="wp-block-heading">証明書検証を無効化すればよいのか</h3>


<p class="wp-block-paragraph">CodeBuildの<code>ProjectSource</code> APIには、<code>insecureSsl</code>という設定項目があります。</p>


<p class="wp-block-paragraph">ただし、この設定はCodeConnectionsのホスト側で実施するTLS検証とは別のものです。今回のGitLab Self-Managed＋CodeConnections構成に適用できるかも、ソース取得方式によって異なります。</p>


<p class="wp-block-paragraph">AWSサポートからは、CodeConnections側のTLS証明書検証を無効化することはできないとの説明がありました。</p>


<p class="wp-block-paragraph">いずれにしても、証明書検証を無効化してエラーを回避するのは、セキュリティ上望ましい対応ではありません。</p>


<p class="wp-block-paragraph">自己署名証明書を使用する場合でも、適切なCA証明書の信頼設定と、接続先のホスト名またはIPアドレスとの整合性を確保することが基本です。</p>


<h3 class="wp-block-heading">実際の通信元をどう調べるか</h3>


<p class="wp-block-paragraph">CodeBuildの実行結果が得られるなら、まず<code>DOWNLOAD_SOURCE</code>フェーズのログを調べます。</p>


<p class="wp-block-paragraph">ソース取得の段階で失敗しているのか、取得後のビルド処理で失敗しているのかを分けるためです。</p>


<p class="wp-block-paragraph">さらに、GitLab側のVPC Flow Logsを利用し、通信元IPアドレスを調べる方法があります。</p>


<p class="wp-block-paragraph">通信元IPとENIの対応関係を照合すれば、CodeConnections側のネットワークコンポーネントからの通信なのか、CodeBuild側からの通信なのかを判断する手掛かりになります。</p>


<p class="wp-block-paragraph">必要に応じてGitLab側のアクセスログとも突き合わせれば、より具体的に切り分けられます。</p>


<p class="wp-block-paragraph">今回、CodeBuildの実行検証はできていませんが、設計段階では次の4点を整理しておきたいところです。</p>


<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>確認項目</th>
<th>調査する内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>ソース取得方式</td>
<td>GitLabへの通信をどのコンポーネントが実行するか</td>
</tr>
<tr>
<td>ネットワーク</td>
<td>CodeBuild側にVPC・TGW経路が必要か</td>
</tr>
<tr>
<td>TLS証明書</td>
<td>どの実行環境で証明書を信頼させる必要があるか</td>
</tr>
<tr>
<td>IAM権限</td>
<td>接続の利用に必要な権限が付与されているか</td>
</tr>
</tbody>
</table>
</figure>


<h2 class="wp-block-heading">7. AWSサポートへの問い合わせで重要なのは、設定値より前提条件</h2>


<p class="wp-block-paragraph">今回の問い合わせを整理する中で、改めて感じたのは、<strong>エラーメッセージだけを伝えても、問題の本質にはなかなかたどり着けない</strong>ということです。</p>


<p class="wp-block-paragraph">最初は「GitLabに接続できない」という問題でも、構成を整理すると、プライベートIP、TGW、自己署名証明書、GitLabの認可など、複数の条件が関係しています。</p>


<p class="wp-block-paragraph">そこで、問い合わせの前提として、次の情報を整理することが有効になります。</p>


<ul class="wp-block-list">
	<li>GitLab Self-ManagedがEC2上で稼働している</li>


	<li>GitLabはプライベートIPのみを使用している</li>


	<li>AWSアカウント間をTGWで接続している</li>


	<li>HTTPSには自己署名証明書を使用している</li>


	<li>CodeConnectionsのエンドポイント設定時にエラーが発生している</li>
</ul>


<p class="wp-block-paragraph">このように整理すると、単なる接続エラーではなく、どのコンポーネント間の通信に問題があるのかを議論しやすくなります。</p>


<p class="wp-block-paragraph">さらに、AWSサポートには設定方法だけでなく、設定が必要になる条件まで尋ねたいところです。</p>


<p class="wp-block-paragraph">例えば、CodeBuild側の証明書設定について疑問が残るなら、次のように質問します。</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">GitLab Self-Managedへのソース取得にCodeConnectionsを利用する場合、GitLabへのHTTPS通信はどのコンポーネントが実行するのでしょうか。CodeBuild側にVPC設定やCA証明書の登録が必要になる条件を教えてください。</p>
</blockquote>


<p class="wp-block-paragraph">これは、単に「CodeBuild側の証明書設定は必要ですか」と聞くよりも、通信経路と責任分界を明確にできる質問です。</p>


<p class="wp-block-paragraph">長年、基盤設計やシステム間連携に関わってきましたが、複数の製品やサービスが絡む問題では、個々の設定よりも、サービス間の境界に原因が潜んでいることが少なくありません。</p>


<p class="wp-block-paragraph">今回のCodeConnectionsも、そうした視点で考える必要がある事例でした。</p>


<h2 class="wp-block-heading">8. まとめ｜マネージドサービスでも基盤設計は不要にならない</h2>


<p class="wp-block-paragraph">今回、CodeConnectionsでGitLab Self-Managedへの閉域接続を構成する過程で、<code>Invalid host endpoint provided.</code> というエラーが問題となりました。</p>


<p class="wp-block-paragraph">AWSサポートからは、プライベートIPを使用する場合のVPC接続設定が有力な原因として示され、CodeConnectionsのAvailable表示まで到達しています。</p>


<p class="wp-block-paragraph">今回の検討から得られる教訓は、次の3つです。</p>


<p class="wp-block-paragraph"><strong>第一に、AWSサービス間の接続でも通信経路を明確にする必要があります。</strong> TGWが接続されているだけでは不十分で、ルートテーブル、セキュリティグループ、通信元の整理が欠かせません。</p>


<p class="wp-block-paragraph"><strong>第二に、ネットワークと認証は別の問題です。</strong> AWS側からGitLabへ到達できても、作業端末から認可画面へアクセスできなければ、接続のセットアップを完了できない場合があります。</p>


<p class="wp-block-paragraph"><strong>第三に、接続ステータスと実際の処理成功は区別します。</strong> CodeConnectionsがAvailableでも、CodeBuildのソース取得やビルド成功まで保証されたわけではありません。</p>


<p class="wp-block-paragraph">AWSのマネージドサービスは、インフラの構築・運用負担を減らしてくれます。しかし、複数サービスを組み合わせた際の通信経路、認証、TLS証明書、IAM権限まで自動的に設計してくれるわけではありません。</p>


<p class="wp-block-paragraph"><strong>マネージドサービスを利用することと、基盤設計が不要になることは別の話です。</strong></p>


<p class="wp-block-paragraph">今回の事例は、その基本を改めて考える機会になりました。</p>


<hr class="wp-block-separator has-alpha-channel-opacity" />

<h3 class="wp-block-heading">参考資料</h3>


<ul class="wp-block-list">
	<li><a href="https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-create-gitlab-managed.html">AWS公式｜GitLab Self-Managedへの接続作成</a></li>


	<li><a href="https://docs.aws.amazon.com/codebuild/latest/userguide/access-tokens-gitlab-overview.html">AWS公式｜GitLab access in CodeBuild</a></li>


	<li><a href="https://docs.aws.amazon.com/codebuild/latest/userguide/connections-github-app.html">AWS公式｜GitHub App connections</a></li>


	<li><a href="https://docs.aws.amazon.com/codebuild/latest/APIReference/API_ProjectSource.html">AWS公式｜CodeBuild ProjectSource API</a></li>
</ul>

<p>&nbsp;</p>]]></content:encoded>
					
					<wfw:commentRss>https://sys-univ.com/aws/codeconnections-gitlab-self-managed-vpc-error/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>情シスの仕事とは？ 新任担当者向けに役割・SIerとの分担・必要なスキルを解説</title>
		<link>https://sys-univ.com/dev/corporate-it-guide/</link>
					<comments>https://sys-univ.com/dev/corporate-it-guide/#respond</comments>
		
		<dc:creator><![CDATA[ナギ]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 07:08:44 +0000</pubDate>
				<category><![CDATA[システム開発]]></category>
		<guid isPermaLink="false">https://sys-univ.com/?p=3534</guid>

					<description><![CDATA[情報システム部門（情シス）に配属されたら、誰と、何を、どこまで調整するのでしょうか。最初は、自分の仕事の範囲がつかみにくいものです。 システムを導入する企業を、この記事では「発注側」と呼びます。発注側が外部のSIer（シ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">情報システム部門（情シス）に配属されたら、誰と、何を、どこまで調整するのでしょうか。最初は、自分の仕事の範囲がつかみにくいものです。</p>


<p class="wp-block-paragraph">システムを導入する企業を、この記事では「発注側」と呼びます。発注側が外部の<strong>SIer（システムインテグレーター）</strong>に設計・開発などを依頼しても、情シスの仕事がなくなるわけではありません。</p>


<p class="wp-block-paragraph">私は大手SIerで20年以上、データベースの設計・構築からシステム基盤の統括、プロジェクトマネジメントまで携わってきました。その中で、発注側の役割が曖昧なまま仕事が進み、プロジェクトが行き詰まる場面を何度も見てきました。</p>


<p class="wp-block-paragraph">「技術のことは詳しいSIerにお任せします」。技術的な設計や実装を専門家に委ねるのは自然です。しかし、<strong>自社の業務で何を実現するか、誰が合意するか、導入後に成果が出たか</strong>まで委ねることはできません。</p>


<p class="wp-block-paragraph">これは担当者を批判したいという話ではありません。情シスの役割や発注側としての判断を体系的に教わる機会がなく、何を確認すればよいのか分からないまま現場に立つこともあると感じています。だからこそ、実務で役立つ入門記事を書こうと考えました。</p>


<p class="wp-block-paragraph">これから情シスになる方、配属されたばかりの方に向けて、組織内の立ち位置、関係者、システム開発・運用の仕事を順番に説明します。後半では、主任クラスを目指す際に役立つ具体的な確認観点も紹介します。</p>


<h2 class="wp-block-heading">なぜ企業に情シスが必要なのか？</h2>


<h3 class="wp-block-heading">システムを作ることが目的ではない</h3>


<p class="wp-block-paragraph">企業は、売上の拡大、納期の短縮、品質の安定、コストの削減など、事業上の目標を持っています。その実現には、業務の進め方を見直し、情報を適切に使える状態にすることが必要です。</p>


<p class="wp-block-paragraph">例えば「納期を守れる会社にしたい」という目標があるなら、受注・調達・製造・出荷の状況を把握できていないことが課題かもしれません。必要なのは、いきなり新しいシステムを購入することではなく、どの情報を誰がいつ必要とするのかを整理することです。その結果として、既存システムの改修やSaaSの導入が選択肢になります。</p>


<p class="wp-block-paragraph">流れは、<strong>経営・事業の目標 → 業務課題 → 業務の改善 → IT施策 → 効果の確認</strong>です。情シスは、この流れをITの側面から支える組織です。</p>

<div id="attachment_3548" style="width: 1930px" class="wp-caption aligncenter"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-3548" class="wp-image-3548 size-full" src="https://sys-univ.com/wp-content/uploads/2026/10/bfd02ef123d33ad8cc651c08967cf77d.png" alt="" width="1920" height="640" srcset="https://sys-univ.com/wp-content/uploads/2026/10/bfd02ef123d33ad8cc651c08967cf77d.png 1920w, https://sys-univ.com/wp-content/uploads/2026/10/bfd02ef123d33ad8cc651c08967cf77d-500x167.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/bfd02ef123d33ad8cc651c08967cf77d-800x267.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/bfd02ef123d33ad8cc651c08967cf77d-300x100.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/bfd02ef123d33ad8cc651c08967cf77d-768x256.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/bfd02ef123d33ad8cc651c08967cf77d-1536x512.png 1536w" sizes="(max-width: 1920px) 100vw, 1920px" /><p id="caption-attachment-3548" class="wp-caption-text">図　情シスが支える基本の流れ</p></div>


<h3 class="wp-block-heading">経営、業務、ITをつなぐ窓口になる</h3>


<p class="wp-block-paragraph">経営層は投資の目的や優先順位を考えます。業務部門は現場の仕事と制約を知っています。SIerは技術的な実現方法を考え、設計・開発を担います。</p>


<p class="wp-block-paragraph">しかし、これらの情報を別々に持ったままでは、投資目的とシステムの仕様がずれたり、現場で使われない仕組みが出来上がったりします。情シスは、<strong>事業の目的をITの取り組みにつなぎ、導入後も目的を達成できたかを確かめる</strong>役割を持ちます。</p>


<p class="wp-block-paragraph">なお、企業によっては情シス自身が開発や運用を行い、別の企業では外部委託を中心とするなど、担当範囲は異なります。この記事では、業務システムの企画・開発・運用を社内外の関係者と進める情シス担当者を中心に説明します。</p>


<h2 class="wp-block-heading">情シスの仕事内容と、社内外の関係者との役割分担</h2>


<h3 class="wp-block-heading">まずは3つの仕事を押さえる</h3>


<p class="wp-block-paragraph">情シスの仕事は、大きく次の3つに分けられます。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>仕事の領域</th>
<th>具体的な活動</th>
<th>新任担当者がまず知るべきこと</th>
</tr>
</thead>
<tbody>
<tr>
<td>IT戦略・システム企画</td>
<td>IT投資計画、製品・サービス選定、業務改善の企画</td>
<td>なぜ導入するのか、誰が予算と方針を決めるのか</td>
</tr>
<tr>
<td>開発・導入・運用</td>
<td>要件整理、ベンダ管理、設計レビュー、受け入れ、障害対応</td>
<td>自分が何を判断し、何をベンダに委ねるのか</td>
</tr>
<tr>
<td>社内サポート・IT管理</td>
<td>問い合わせ、端末・アカウント・ライセンス管理、セキュリティ対応</td>
<td>利用者の困りごととシステム全体への影響を把握すること</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">近年はクラウド・SaaSの組み合わせ、外部サービスとのデータ連携、情報セキュリティ、生成AIの利用ルールなども重要になっています。「自社で全部作る」だけでなく、「選び、つなぎ、継続して使う」仕事が増えています。</p>


<h3 class="wp-block-heading">情シス内部の組織構造も知っておこう</h3>


<p class="wp-block-paragraph">情シスの中でも、役職による判断権限と、業務領域による担当分担があります。例えば、次のような体制です。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>組織内の立場</th>
<th>主な仕事・責任</th>
</tr>
</thead>
<tbody>
<tr>
<td>部門長・管理者</td>
<td>部門方針、予算・人員、優先順位、重要案件の判断・承認</td>
</tr>
<tr>
<td>主任・チームリーダー</td>
<td>担当領域の進捗・品質・費用の把握、課題整理、担当間の調整、管理者への上申</td>
</tr>
<tr>
<td>担当者</td>
<td>自担当システムや業務の把握、要件の確認、ベンダ窓口、試験・課題管理の実務</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">これとは別に、企画・開発、運用・保守、社内IT支援などの担当グループが置かれることもあります。企業規模によっては兼務も珍しくありません。<strong>若手は担当するシステムと業務を理解するところから始め、主任クラスでは担当領域を横断して課題や判断をつなぐこと</strong>が期待されます。</p>


<h3 class="wp-block-heading">情シス担当者の周囲に、誰がいるのか</h3>


<p class="wp-block-paragraph">新任担当者は、まず社内外の関係者を整理してください。情シスはすべてを一人で決める部署ではありません。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>関係者</th>
<th>主な役割</th>
<th>情シス担当者との接点</th>
</tr>
</thead>
<tbody>
<tr>
<td>経営層・事業責任者</td>
<td>投資目的・予算・事業上の優先順位を判断</td>
<td>投資の根拠、重大な判断事項を報告する</td>
</tr>
<tr>
<td>情シスの管理者・責任者</td>
<td>担当範囲、要員、部門としての判断・承認</td>
<td>方針の確認、課題の上申、意思決定の依頼</td>
</tr>
<tr>
<td>業務部門・システム利用者</td>
<td>業務要件を示し、業務仕様を確定・受け入れる</td>
<td>現行業務を確認し、変更案や試験結果をすり合わせる</td>
</tr>
<tr>
<td>SIer・導入ベンダ</td>
<td>技術方式の検討、設計・実装、技術試験、保守支援</td>
<td>仕様・見積り・進捗・品質・障害対応を協議する</td>
</tr>
<tr>
<td>取引先・外部サービス</td>
<td>データ連携、取引条件、外部サービスの提供</td>
<td>業務責任者と協力して接続条件や変更可否を確認する</td>
</tr>
</tbody>
</table>
</figure>


<div id="attachment_3552" style="width: 1682px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-3552" class="wp-image-3552 size-full" src="https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222.png" alt="" width="1672" height="941" srcset="https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222.png 1672w, https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222-240x135.png 240w, https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222-640x360.png 640w, https://sys-univ.com/wp-content/uploads/2026/10/52c7a8d7e580930b769703ea7d8ee222-752x423.png 752w" sizes="(max-width: 1672px) 100vw, 1672px" /><p id="caption-attachment-3552" class="wp-caption-text">図　新任情シス担当者の組織内の位置と社内外の関係者</p></div>

<p class="wp-block-paragraph">担当者の仕事は「すべての関係者を指揮すること」ではありません。<strong>情報を集め、論点を整理し、権限のある人が判断できる状態を作ること</strong>です。ベンダへ技術的な詳細を任せても、判断の所在を曖昧にしないことが大切です。</p>


<h3 class="wp-block-heading">【実体験】仕事が進む発注者は、決める人が明確だった</h3>


<p class="wp-block-paragraph">私が関わったプロジェクトの中には、発注側がキックオフMTGを自ら仕切り、業務仕様を決める責任者を当初から明確にしている案件がありました。業務ごとに課長級の責任者が判断し、SIerは論点の整理や技術的な選択肢の提示で支援する、という役割分担です。</p>


<p class="wp-block-paragraph">反対に、発注側の業務部門間で意見が割れた際、ベンダが合意形成まで引き受けてしまうと、あとから「そういう意味で承認したのではない」という行き違いが起こります。<strong>業務部門間の合意形成は発注側が主導する。技術的な実現方法はSIerが主体的に設計する。</strong> この線引きは、最初の会議で確認しておきたいことの一つです。</p>


<h2 class="wp-block-heading">企画・開発・運用で、情シスは何をするのか？</h2>


<p class="wp-block-paragraph">情シスは、システム開発の特定の工程だけに関わるわけではありません。企画から導入、運用、効果の確認まで、仕事がつながっています。</p>
<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>段階</th>
<th>情シスが確認・推進すること</th>
<th>SIerに期待すること</th>
</tr>
</thead>
<tbody>
<tr>
<td>企画・調達</td>
<td>導入目的、対象業務、予算、関係者、RFP（提案依頼書）、評価基準</td>
<td>技術的な実現性、概算費用、制約・リスクの提示</td>
</tr>
<tr>
<td>要件定義</td>
<td>業務要件・非機能要件、業務責任者の合意、優先順位</td>
<td>要求の具体化、技術的な論点整理</td>
</tr>
<tr>
<td>設計・開発</td>
<td>重要な仕様のレビュー、変更影響の確認、課題の判断</td>
<td>技術方式・詳細設計・実装・内部品質の確保</td>
</tr>
<tr>
<td>試験・導入</td>
<td>試験方針のレビュー、業務受け入れ、移行判定、利用者への周知</td>
<td>技術試験、不具合解消、移行の準備と実施支援</td>
</tr>
<tr>
<td>運用・改善</td>
<td>障害の業務影響、運用費、改善要望、導入効果</td>
<td>契約に基づく運用・保守、原因分析、改善提案</td>
</tr>
</tbody>
</table>
</figure>


<div id="attachment_3554" style="width: 1610px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-3554" class="wp-image-3554 size-full" src="https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394.png" alt="" width="1600" height="900" srcset="https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394.png 1600w, https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394-240x135.png 240w, https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394-640x360.png 640w, https://sys-univ.com/wp-content/uploads/2026/10/41489ff0f1325166c639870cdd43d394-752x423.png 752w" sizes="(max-width: 1600px) 100vw, 1600px" /><p id="caption-attachment-3554" class="wp-caption-text">図　発注側とSIerが工程ごとに担う作業</p></div>

<p>システム開発は、新しい機能を作る仕事だけではありません。既存システムを新しい環境へ移行する「システム更改」でも、現行調査、設計、試験、データ移行、運用引継ぎなど、多くの作業が発生します。</p>
<p>具体的な開発プロジェクトの進め方は、次の記事「システム更改で学ぶ、プログラミングだけではない仕事の全体像」で紹介しています。</p>

<a href="https://sys-univ.com/dev/base2/" title="【システム開発とは何か】システム更改で学ぶ、プログラミングだけではない仕事の全体像" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-500x281.jpg 500w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-800x450.jpg 800w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-300x169.jpg 300w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-768x432.jpg 768w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-1536x864.jpg 1536w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-376x212.jpg 376w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f.jpg 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【システム開発とは何か】システム更改で学ぶ、プログラミングだけではない仕事の全体像</div><div class="blogcard-snippet internal-blogcard-snippet">システム開発はプログラミングだけではありません。A銀行のクラウドリフトを例に、現行調査、基盤設計、データ移行、テスト、運用引継ぎ、ステークホルダーや責任共有モデルまで、初心者向けに解説します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.07.17</div></div></div></div></a>
<h3 class="wp-block-heading">発注側は「何を実現するか」を決める</h3>


<p class="wp-block-paragraph">業務要件や優先順位は発注側が決めます。一方、実現するための技術方式や物理設計は、SIerが専門家として主体的に検討・設計します。発注側は、その内容が自社の要求に合っているかを理解して承認します。</p>


<p class="wp-block-paragraph">例えば、データベースの索引をどう設計するかまで情シスが指定する必要はありません。しかし、必要な性能や運用条件が満たされるか、費用にどのような影響があるかは確認すべきです。技術方式が業務や投資判断に大きく関わるなら、SIerが代替案を説明し、発注側と合意して進めます。</p>


<p class="wp-block-paragraph"><strong>任せることと、丸投げすることは違います。</strong></p>


<h3 class="wp-block-heading">【実体験】RFPの一行から、設計上の論点を引き出す</h3>


<p class="wp-block-paragraph">以前、RFPに「オンライン受付は夕方で終了するが、必要に応じて延長できること」とだけ書かれていたことがあります。</p>


<p class="wp-block-paragraph">SIerとして確認したいのは、延長をいつまでに申し込むのか、誰が承認するのか、延長範囲はシステム全体か処理単位か、延長対象外の接続はどう扱うのか、といった点です。帳票作成などの非同期処理が終了時刻をまたいだらどうするのかも確認が必要です。</p>


<p class="wp-block-paragraph">私は質問表で条件を一つずつ確認し、パッケージの標準機能で実現できるか、追加開発が必要かを整理しました。他社パッケージの対応状況も検討材料にしつつ、発注側には「本当に必須か」「代替案を認められるか」を質問しました。</p>


<p class="wp-block-paragraph">入札で質問・回答が参加各社に公開される場合、こうした質問は、発注側が自らの要求を具体化する機会にもなります。<strong>ベンダからの質問が多いことは、必ずしも悪い兆候ではありません。曖昧な要求を放置して進める方が危険です。</strong></p>


<h2 class="wp-block-heading">ある失敗ケースで考える、誰が何を確認すべきだったのか</h2>


<p class="wp-block-paragraph">ここまで説明した役割が欠けると、何が起こるでしょうか。問題を見つけやすいよう、<strong>あえて単純化した極端な例</strong>で考えてみます。実際の個別案件を紹介するものではありません。</p>


<p class="wp-block-paragraph">経験者にとっては初歩的な確認漏れに見える内容ですが、開発を初めて担当する人には、そもそも何を確認すべきか分からないこともあります。まず「誰が、どの段階で気づけたか」を意識して読んでみてください。</p>


<h3 class="wp-block-heading">取引先との連携で起きたこと</h3>


<p class="wp-block-paragraph">ある企業が、受発注管理システムをクラウドサービスに移行します。通常のデータ送受信は確認できていましたが、本番切替前の外部接続リハーサルで、受信確認が届かなかった場合の再送を試すと、同じ注文が二重に登録されました。</p>


<p class="wp-block-paragraph">取引先との間には「注文番号で同じ注文を判定し、重複登録しない」という条件がありました。しかし、移行先サービスの標準機能は、その取引先固有の条件に対応していませんでした。この差異が、要件・設計・試験の確認対象から漏れていたのです。導入ベンダは技術的な対応案と費用・期間・リスクを提示し、発注側は業務への影響を検討した結果、追加対応と本番切替の延期を判断しました。</p>


<p class="wp-block-paragraph">本来、再送時の重複登録防止は、要件定義・設計・試験で扱うべき基本的な確認事項です。本番切替直前まで残るのは重大な品質管理上の問題です。</p>


<p class="wp-block-paragraph">さて、<strong>どの役割を果たしていれば、もっと早い段階で発見できたでしょうか。</strong></p>


<h3 class="wp-block-heading">欠けていた活動と、本来すべき活動</h3>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>活動</th>
<th>このケースで欠けていたこと</th>
<th>本来すべきこと</th>
<th>主な担当</th>
</tr>
</thead>
<tbody>
<tr>
<td>業務要件の確認</td>
<td>連携ファイルの形式だけを見て、運用上の条件を拾わなかった</td>
<td>現行運用担当・業務部門・取引先に再送時の取り決めを確認</td>
<td>発注側が情報収集、SIerが確認観点を提示</td>
</tr>
<tr>
<td>技術検討・設計</td>
<td>標準機能との差異と重複防止方式を詰めなかった</td>
<td>連携の正常系・異常系を設計し、方式を評価</td>
<td>SIer</td>
</tr>
<tr>
<td>試験計画</td>
<td>通常送受信だけを確認対象にした</td>
<td>再送・重複・通信障害などを試験項目に入れる</td>
<td>SIerが計画・試験、発注側が方針をレビュー</td>
</tr>
<tr>
<td>外部調整</td>
<td>取引先との運用変更可否が未決定</td>
<td>変更する条件と合意責任者を明確にする</td>
<td>発注側の業務責任者</td>
</tr>
<tr>
<td>課題・リスク管理</td>
<td>未確認事項が放置された</td>
<td>担当・期限・影響・判断先を管理する</td>
<td>双方</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">これは発注側だけの失敗でも、SIerだけの失敗でもありません。<strong>専門家が確認すべき技術的論点と、発注側が把握・判断すべき業務条件が結び付かなかったこと</strong>にあります。</p>


<p class="wp-block-paragraph">また、対応には品質（Quality）・費用（Cost）・納期（Delivery）、いわゆるQCDの観点が必要です。追加開発するか、取引先と条件を見直すか、安全に管理できる範囲で暫定対応するか。SIerが影響と選択肢を提示し、発注側が事業上の優先順位を踏まえて判断します。</p>


<p class="wp-block-paragraph">この例から学んでほしいのは、極端な失敗そのものではなく、<strong>要件と試験の対応を追い、抜けている確認事項に気づく視点</strong>です。後半のVモデルの説明にもつながります。</p>
<p>今回のケースは、問題点を分かりやすくするために単純化した例ですが、上流工程で確認すべき事項を残したまま進めると、後工程で手戻りが発生するという構造は、実際のプロジェクトにも共通します。</p>
<p>別の例として、AWSへのクラウド移行で事前検証（PoC）が不足し、設計上のリスクが構築・試験段階で表面化する問題を次の記事「クラウドリフトの失敗は構築前に始まっている」で解説しています。</p>

<a href="https://sys-univ.com/dev/cloudlift/" title="【第1回】クラウドリフトの失敗は構築前に始まっている｜PoC不足が手戻り・コスト超過・納期遅延を招く理由" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/08/34014ea8103fa5e3a36e14fd6df22125-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/08/34014ea8103fa5e3a36e14fd6df22125-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/08/34014ea8103fa5e3a36e14fd6df22125-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/08/34014ea8103fa5e3a36e14fd6df22125-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/08/34014ea8103fa5e3a36e14fd6df22125-376x212.png 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【第1回】クラウドリフトの失敗は構築前に始まっている｜PoC不足が手戻り・コスト超過・納期遅延を招く理由</div><div class="blogcard-snippet internal-blogcard-snippet">クラウド移行（AWSへのクラウドリフト）で起きる手戻り・コスト超過・納期遅延は、構築中ではなくPoC不足から始まります。Auto Scaling、EFS/EBS、RDS、監視、バックアップ、ライセンスなど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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.20</div></div></div></div></a>


<h2 class="wp-block-heading">開発が終わってからが本番。運用と導入効果はどう評価する？</h2>


<p class="wp-block-paragraph">システムが予定どおり完成し、ベンダによる試験を通過したら成功でしょうか。情シスの評価は、そこで終わりません。</p>


<h3 class="wp-block-heading">「作れたか」と「成果が出たか」は別の評価</h3>


<p class="wp-block-paragraph">開発段階では、必要な品質を確保できたか、予算と納期を守れたかというQCDが重要です。一方、導入後には、業務が実際に改善したか、投資に見合う便益が生まれたかを確かめる必要があります。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>観点</th>
<th>主な問い</th>
<th>確認する時期・担当</th>
</tr>
</thead>
<tbody>
<tr>
<td>開発のQCD</td>
<td>約束した機能・性能を、求めた品質・費用・時期で実現できたか</td>
<td>開発中〜受け入れ時。発注側とSIerで確認</td>
</tr>
<tr>
<td>運用品質</td>
<td>安定して使え、障害時に業務を継続・復旧できるか</td>
<td>稼働後。情シスと運用・保守担当</td>
</tr>
<tr>
<td>導入効果・ROI</td>
<td>業務時間、誤処理、売上などが改善し、投資に見合ったか</td>
<td>稼働後。情シスが業務部門・経理等と評価を主導</td>
</tr>
</tbody>
</table>
</figure>


<div id="attachment_3558" style="width: 1610px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-3558" class="wp-image-3558 size-full" src="https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1.png" alt="" width="1600" height="900" srcset="https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1.png 1600w, https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1-240x135.png 240w, https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1-640x360.png 640w, https://sys-univ.com/wp-content/uploads/2026/10/434e533229540c2c6c6cb91f49674ab1-752x423.png 752w" sizes="(max-width: 1600px) 100vw, 1600px" /><p id="caption-attachment-3558" class="wp-caption-text">図　QCDと導入効果ROI</p></div>

<p class="wp-block-paragraph">SIerはシステムが要求に沿って稼働しているかを検証できます。しかし、部門の実際の工数や取引の改善、事業上の収益への影響を、SIerだけで測ることはできません。業務の成果を測る責任は発注側にあります。</p>


<h3 class="wp-block-heading">導入前にKPIと測定方法を決めておく</h3>


<p class="wp-block-paragraph">例えば、受注処理の効率化が導入目的なら、稼働前後で「処理件数」「担当者の作業時間」「手戻り件数」などを比較します。</p>


<p class="wp-block-paragraph">仮に月400時間かかっていた処理が、導入後280時間になれば、月120時間、年間1,440時間の削減です。時間当たり3,000円で換算すると、年間432万円分の工数に相当します。</p>


<p class="wp-block-paragraph">ただし、<strong>432万円がそのまま会社の現金支出削減になるとは限りません。</strong> 実際に残業代や外注費が減る場合もあれば、空いた時間を別の業務に振り向ける場合もあるからです。後者は生産性向上という効果ですが、費用削減と同じものとして扱ってはいけません。</p>


<p class="wp-block-paragraph">このため、KPIは企画段階で決め、測定方法、導入前の数値、導入後の測定時期、データを持つ部署まで定めておきます。導入後に慌てて効果を測ろうとしても、比較する基準が残っていないことがあります。</p>


<h3 class="wp-block-heading">ROIは「便益」と「費用」を同じ期間で比較する</h3>


<p class="wp-block-paragraph">ROI（Return on Investment、投資利益率）は、投資に対してどれだけの利益が得られたかを見る指標です。簡易的には、<strong>ROI＝（便益－費用）÷費用×100％</strong>で計算できます。比較期間と費用・便益の範囲をそろえることが前提です。</p>


<p class="wp-block-paragraph">先ほどの年間432万円は、削減した作業時間の<strong>金額換算例</strong>でした。ここからは、それとは別に、実際に外注費などの支出を減らせると仮定した試算を示します。</p>


<p class="wp-block-paragraph">初期投資900万円、削減できる費用が年間480万円、新しいシステムの運用費が年間80万円の場合、年間の差引便益は400万円です。単純な投資回収期間は、<strong>900万円÷400万円＝2.25年（約2年3か月）</strong>となります。</p>


<p class="wp-block-paragraph">同じ条件を3年間で評価すると、次のようになります。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>3年間の評価項目</th>
<th style="text-align: right;">金額</th>
</tr>
</thead>
<tbody>
<tr>
<td>便益（480万円×3年）</td>
<td style="text-align: right;">1,440万円</td>
</tr>
<tr>
<td>初期投資</td>
<td style="text-align: right;">900万円</td>
</tr>
<tr>
<td>運用費（80万円×3年）</td>
<td style="text-align: right;">240万円</td>
</tr>
<tr>
<td>総費用（初期投資＋運用費）</td>
<td style="text-align: right;">1,140万円</td>
</tr>
<tr>
<td>差引便益（便益－総費用）</td>
<td style="text-align: right;">300万円</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">したがって、<strong>3年間の簡易ROI＝300万円÷1,140万円×100≒26.3％</strong>です。これは物価変動や資金の時間価値、税金、追加改修費用などを考慮しない説明用の試算です。</p>


<p class="wp-block-paragraph">実務ではクラウド利用料、保守契約、ライセンス更新、追加改修、利用部門の負担なども評価対象に含めます。また、内部統制の強化や顧客サービスの改善など、金額にしにくい効果は、ROIと併せて別のKPIで評価します。</p>


<h3 class="wp-block-heading">安定運用・障害対応・次の更改にも責任がある</h3>


<p class="wp-block-paragraph">稼働後の監視、バックアップ、障害復旧、更新作業などは、契約によってSIerや運用ベンダが担うことも多い仕事です。それでも情シスには、障害の業務影響を把握し、復旧の優先順位を決め、関係者に連絡し、改善の必要性を判断する役割があります。</p>


<p class="wp-block-paragraph">導入後の効果が低ければ、運用を見直すのか、追加改善するのかを検討します。老朽化による「守りの更改」だけでなく、新しい事業のために仕組みを変える「攻めの更改」もあります。システムを知るベンダとは、稼働後もパートナーとして適切に連携しておきたいところです。</p>


<h2 class="wp-block-heading">若手・主任クラスの情シス担当者が身につけたい実務能力</h2>


<p class="wp-block-paragraph">「業務を理解する」「関係者と円滑にコミュニケーションする」といった心得だけでは、日々の仕事で何をすればよいか分かりません。そこで、現場でベンダの窓口を担う若手が、主任クラスを目指す際の具体的な到達目標を示します。<strong>自担当システムの全体像を説明でき、計画書や報告書にある重要な抜けに気づけること</strong>が、一つの目安です。</p>


<h3 class="wp-block-heading">① 自担当システムの構成と費用を説明できる</h3>


<p class="wp-block-paragraph">まず、担当システムがどの業務を支え、どのシステムと連携しているかを説明できるようにします。主要なサーバ・クラウドサービス、データベース、ネットワーク、認証、外部連携先を、構成図で指し示せる水準が目標です。</p>


<p class="wp-block-paragraph">また、障害が起きるとどの部署や取引先に影響するか、バックアップや復旧の仕組みはどうなっているかも押さえます。自分が全装置の設定をできる必要はありませんが、<strong>どこが止まれば何が止まるのか</strong>を説明できることが大切です。</p>


<p class="wp-block-paragraph">費用面では、初期開発費だけでなく、保守費、クラウド利用料、ライセンス、回線、外注費などの構造を理解します。「今の費用は何に対して払っているのか」「利用量が増えたらどこが増額するのか」が分かれば、更新や追加投資の相談にも参加できます。</p>


<h3 class="wp-block-heading">② プロジェクト計画書をレビューできる</h3>


<p class="wp-block-paragraph">ベンダから計画書を受け取ったとき、「専門家が作ったから問題ない」と受け取るのではなく、次の点を確認します。</p>


<p class="wp-block-paragraph">以下の10の観点は、PMI（Project Management Institute）の「PMBOKガイド」第6版※に示された<strong>10の知識エリア</strong>を参考に、情シス担当者が計画書をレビューするときのチェックポイントとして整理したものです。PMBOKを覚えることが目的ではなく、<strong>管理上の確認漏れに気づけるようになること</strong>が目的です。</p>
<p>※最新版は<a href="https://www.pmi.org/standards/pmbok">こちら</a></p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>管理の観点</th>
<th>主任クラスを目指す担当者のチェックポイント</th>
</tr>
</thead>
<tbody>
<tr>
<td>① 統合・変更管理</td>
<td>全体計画と各社の計画がつながっているか。変更の申請・影響評価・承認方法はあるか</td>
</tr>
<tr>
<td>② スコープ</td>
<td>対象業務、対象外、成果物、発注側とSIerの作業境界が明確か</td>
</tr>
<tr>
<td>③ スケジュール</td>
<td>主要な節目、他部署・他社との依存関係、受け入れ期間は明確か</td>
</tr>
<tr>
<td>④ コスト</td>
<td>予算、見積り前提、追加費用が発生する条件が明確か</td>
</tr>
<tr>
<td>⑤ 品質</td>
<td>機能・非機能要件の確認方法、レビュー・試験計画、合否判定基準は明確か</td>
</tr>
<tr>
<td>⑥ 資源・体制</td>
<td>必要な要員、スキル、担当責任者、要員不足時の対応は決まっているか</td>
</tr>
<tr>
<td>⑦ コミュニケーション</td>
<td>会議体ごとの目的・出席者・決定事項、報告経路は明確か</td>
</tr>
<tr>
<td>⑧ リスク</td>
<td>重大リスクと未確認事項、対応担当、期限、判断先が整理されているか</td>
</tr>
<tr>
<td>⑨ 調達・契約</td>
<td>委託範囲、契約上の責任境界、複数ベンダの調整方法が明確か</td>
</tr>
<tr>
<td>⑩ ステークホルダー</td>
<td>業務責任者、利用者、承認者、取引先など関係者を特定できているか</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph"><strong>10の観点が一冊の計画書にすべて詳しく書かれているとは限りません。</strong> 体制図、品質計画書、課題・リスク管理表などの関連資料も合わせて確認します。大切なのは、各観点について、確認先の文書や担当者を把握し、必要な質問ができることです。</p>


<h3 class="wp-block-heading">③ Vモデルを理解し、品質の確認方法に目を向けられる</h3>


<p class="wp-block-paragraph">Vモデルは、要件・設計の各段階と、それを検証する試験の対応を考えるための代表的なモデルです。詳細な開発手順が異なるプロジェクトでも、<strong>「その要求は、どの試験で確かめるのか」</strong>という問いは役立ちます。</p>


<p class="wp-block-paragraph">情シスの担当者がまず見るべきなのは、RFPや要件定義書に、機能だけでなく非機能要件が書かれているかという点です。非機能要件には、例えば性能、可用性、セキュリティ、バックアップ、障害時の復旧、運用条件などがあります。</p>
<p>非機能要件の中でも、セキュリティは発注側とSIerの認識を合わせておきたい重要な領域です。「セキュリティを強化する」といった抽象的な要求ではなく、どのリスクに、どこまで対応する必要があるのかを明確にすることが求められます。</p>
<p>具体的な検討方法は、次の記事「セキュリティ要件定義の進め方｜リスクアセスメントから対策・残存リスクを決める方法」で解説しています。</p>

<a href="https://sys-univ.com/dev/security/" title="セキュリティ要件定義の進め方｜リスクアセスメントから対策・残存リスクを決める方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-376x212.png 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">セキュリティ要件定義の進め方｜リスクアセスメントから対策・残存リスクを決める方法</div><div class="blogcard-snippet internal-blogcard-snippet">セキュリティ要件定義を、RFPや上位基準を起点に、リスクアセスメント、差異評価、対策、残存リスクまで具体化する方法を解説。脅威・脆弱性の分析、関係者との合意、変更時の再アセスメントまで実務例で整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.09.17</div></div></div></div></a>


<p class="wp-block-paragraph">次に、基本設計の内容が要件を反映しているか、<strong>基本設計に対応するシステム試験などで、必要な動作を検証できるか</strong>を確認します。正常系だけでなく、異常系、ピーク時の性能、障害復旧、外部連携の例外処理まで視野に入れます。今回の重複登録のケースは、まさにこの確認が欠けた例です。</p>


<p class="wp-block-paragraph">個々の詳細なテストケースを情シスがすべて作る必要はありません。しかし、<strong>重要な機能・非機能要件に対して、どの試験で何をもって合格とするのか</strong>を説明してもらえることは、品質レビューの基本です。発注側による受け入れ試験は、技術試験の繰り返しではなく、実際の業務が成立するかを判断する場です。</p>

<div id="attachment_3560" style="width: 1610px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-3560" class="wp-image-3560 size-full" src="https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a.png" alt="" width="1600" height="900" srcset="https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a.png 1600w, https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a-240x135.png 240w, https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a-640x360.png 640w, https://sys-univ.com/wp-content/uploads/2026/10/1752a9b8b1671bd6dc6c69cde6a8037a-752x423.png 752w" sizes="(max-width: 1600px) 100vw, 1600px" /><p id="caption-attachment-3560" class="wp-caption-text">図　Vモデルと要件試験の対応</p></div>

<p>重要なのは、試験項目の数だけを見ることではなく、要件や設計で決めた内容を、対応する試験で確認できるかという視点です。</p>
<p>この考え方については、次の記事「Vモデルは古くない｜設計とテストをつなぐ品質保証の考え方」で詳しく取り上げています。</p>

<a href="https://sys-univ.com/dev/v-model-quality-assurance/" title="Vモデルは古くない｜設計とテストをつなぐ品質保証の考え方" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2022/12/9bc6ac64c2c9eff90c882e3211abf571-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2022/12/9bc6ac64c2c9eff90c882e3211abf571-160x90.webp 160w, https://sys-univ.com/wp-content/uploads/2022/12/9bc6ac64c2c9eff90c882e3211abf571-120x68.webp 120w, https://sys-univ.com/wp-content/uploads/2022/12/9bc6ac64c2c9eff90c882e3211abf571-320x180.webp 320w, https://sys-univ.com/wp-content/uploads/2022/12/9bc6ac64c2c9eff90c882e3211abf571-376x212.webp 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Vモデルは古くない｜設計とテストをつなぐ品質保証の考え方</div><div class="blogcard-snippet internal-blogcard-snippet">Vモデルは古い開発手法の話ではなく、要件・設計で決めたことをテストで確認する品質保証の考え方です。バックアップ要件の具体例で各工程の対応関係を整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.07.13</div></div></div></div></a>


<h3 class="wp-block-heading">④ 会議体の目的・参加者・決定権限を見抜く</h3>


<p class="wp-block-paragraph">プロジェクト計画書に「週次定例会を実施」と書かれていても、それだけでは足りません。その会議が報告のためなのか、課題を解決する場なのか、正式に意思決定する場なのかを確認します。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>会議体の例</th>
<th>目的</th>
<th>特に確認したいこと</th>
</tr>
</thead>
<tbody>
<tr>
<td>進捗定例会</td>
<td>進捗・遅延・次の作業の確認</td>
<td>遅延時の対応責任者、判断が必要な事項の上申先</td>
</tr>
<tr>
<td>課題・リスク会議</td>
<td>未解決事項と重大リスクの管理</td>
<td>担当・期限・影響、解決できない場合の判断者</td>
</tr>
<tr>
<td>業務仕様の調整会議</td>
<td>部門をまたぐ要求や運用の合意</td>
<td>業務責任者が参加し、決定権限が明確か</td>
</tr>
<tr>
<td>品質・移行判定会議</td>
<td>工程完了、受け入れ、切替可否の判断</td>
<td>判定基準、証跡、承認者、持ち越し条件</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">ここで目を配りたいのは、<strong>「何を決める会議か」「決められる人が出席しているか」「決められないときは誰に上げるか」</strong>の3点です。会議が多くても、意思決定の経路が曖昧では意味がありません。</p>



<h4>【実体験】品質改善のための関与が、役割の曖昧さを生んだ話</h4>
<p class="wp-block-paragraph">複数のベンダが参加するシステム移行プロジェクトで、私は全体統括を担当したことがあります。</p>
<p>各社の作業には依存関係があり、全体の進捗や課題を把握するため、要員を増やして重要な会議の参加漏れを減らし、各社のキーマンとも直接連携していました。顧客側の責任者には毎日状況を報告していました。</p>
<p>こうした活動の中で、私たち統括グループは、個別ベンダが設定した会議にも参加していました。</p>
<p>後から分かったことですが、その背景には、担当ベンダのアプリケーション品質が一向に改善せず、テコ入れを図るために統括の関与を増やしていたという事情がありました。</p>
<p>あるとき、私が欠席した会議で、アプリケーション間の詳細な仕様調整まで全体統括が担う前提で話が進みかけていました。発注側の担当者から連絡を受け、私はこの進め方を見直す必要があると考えました。</p>
<p>全体統括グループは、個々のアプリケーションの詳細仕様を把握している立場ではありません。仕様を決定する権限もなく、個別のアプリケーションベンダとの契約関係もありませんでした。そもそも、その会議自体が、プロジェクト計画書に定められた会議体ではなかったのです。</p>
<p>私は発注側に、「アプリケーション間の詳細な仕様調整に、統括を挟む必要はない」と伝えました。</p>
<p>詳細な仕様調整は担当ベンダ同士で直接進め、全体統括は横断的な課題管理と必要な調整会議への参加を担う。この役割分担について、発注側の了承を得ました。</p>
<p>品質改善に向けて統括が状況を把握し、問題の解決を支援することには意味があります。しかし、それと個別ベンダが責任を持つべき詳細な仕様調整まで引き受けることは、別の話です。</p>
<p>また、ベンダ間の調整によって仕様変更や費用・納期への影響が生じる場合は、発注側を含む正式な場で判断・合意する必要があります。</p>
<p>今回の経験から、会議への参加や調整の範囲を広げる際には、その目的だけでなく、責任と権限を明確にしておくことが重要だと感じました。</p>
<p>これは情シスの現場担当者にも通じる話です。<strong>会議体の目的と参加者、各社の責任範囲、誰が何を決定するのか。</strong> 特に問題が発生して体制を変更するときこそ、こうした点を確認する必要があります。</p>


<h3 class="wp-block-heading">⑤ 導入効果を自分の言葉で報告できる</h3>


<p class="wp-block-paragraph">最後は、開発したシステムを「使った成果」で説明する力です。稼働後のKPIは改善したか、運用費に見合う効果があるか、どこに次の改善余地があるか。業務部門と計画値・実績値・差異の原因を確認し、<strong>改善の選択肢と次のアクションを添えて情シス管理者に報告できる</strong>水準を目指します。</p>


<p class="wp-block-paragraph">主任クラスに期待されるのは、すべてを一人で解決することではありません。<strong>構成・コスト・品質・関係者・導入効果をつないで、プロジェクトや運用の全体像を説明できること</strong>です。そこまで視野が広がれば、ベンダとの協議も、計画書のレビューも、単なる報告の受け手から一段進んだ仕事になります。</p>


<h2 class="wp-block-heading">まとめ：情シスは、ITを業務の成果につなげる仕事</h2>


<p class="wp-block-paragraph">情シスは、システムを発注するだけの部署ではありません。経営や業務の目的を理解し、関係部署とSIerをつなぎ、開発中の判断や品質確認を行い、導入後の効果まで確かめる役割を担います。</p>


<p class="wp-block-paragraph">新任担当者は、まず自分の周囲の関係者、担当システムの構成、費用、判断権限を把握してください。そのうえで、ベンダの計画書や試験方針を読み、「何を根拠に大丈夫と判断するのか」を質問できるようになることを目指しましょう。</p>


<p class="wp-block-paragraph"><strong>技術は専門家に任せる。しかし、業務上の判断と導入成果の確認まで丸投げしない。</strong> これが、SIerの立場から新任情シス担当者に最も伝えたいことです。</p>

<p>&nbsp;</p>]]></content:encoded>
					
					<wfw:commentRss>https://sys-univ.com/dev/corporate-it-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PHP2Shellへの緊急対応はSIerの想定内？｜なぜ大騒ぎになったのか</title>
		<link>https://sys-univ.com/dev/php2shell-vulnerability-response/</link>
					<comments>https://sys-univ.com/dev/php2shell-vulnerability-response/#respond</comments>
		
		<dc:creator><![CDATA[ナギ]]></dc:creator>
		<pubDate>Sat, 31 Oct 2026 01:52:48 +0000</pubDate>
				<category><![CDATA[トラブル]]></category>
		<category><![CDATA[システム開発]]></category>
		<guid isPermaLink="false">https://sys-univ.com/?p=3574</guid>

					<description><![CDATA[2026年10月21日の夜、国内の多くのWebサービスが緊急メンテナンスに入りました。原因は、PHP本体に見つかった2件の重大な脆弱性、通称「PHP2Shell」です。首相がWebサイトの一時停止まで呼びかけ、社会的にも [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>2026年10月21日の夜、国内の多くのWebサービスが緊急メンテナンスに入りました。原因は、PHP本体に見つかった2件の重大な脆弱性、通称「PHP2Shell」です。首相がWebサイトの一時停止まで呼びかけ、社会的にも大きな話題になりました。</p>
<p>大手SIerで20年超、大規模な業務システムの基盤構築や運用に携わってきた私が、今回の騒ぎを見て感じたのは、<strong>CVSS 9点台の重大な脆弱性が見つかり、緊急対応を迫られる事態は、私が携わってきたシステムでは想定内だった</strong>ということです。</p>
<p>PHP2Shellという個別の脆弱性を予測していたわけではありません。通常SIerでは、重大な脆弱性が発見されることを前提に、対応基準や正常性確認の手順を平時から整備しています。</p>
<p>本記事では、PHP2Shellが大きな問題になった背景を整理し、運用の現場が重大な脆弱性をどう判断し、どう対策しているのかを解説します。</p>
<blockquote>
<p>本記事は2026年10月30日時点の公開情報に基づいています。仮想事例と明記した部分は説明用に構成したものです。</p>
</blockquote>
<h2>PHP2Shellの重大性と社会的な影響</h2>
<h3>PHP本体に見つかった2件の重大な脆弱性</h3>
<p>PHP2Shellは、PHPの実行基盤に見つかった2件の脆弱性の総称です。CVE-2026-109618はメモリ不足（OOM）時のエラー処理に、CVE-2026-109619はリクエスト処理に関わる内部状態の管理に起因します。いずれも認証なしで遠隔からサーバー上の任意のコードを実行されるおそれがあり、PHPのセキュリティチームは2件ともCVSS v4.0で9.2と評価しています。修正版は10月21日に公開されました。</p>
<div style="overflow-x: auto; width: 100%;">
<table>
<thead>
<tr>
<th scope="col">PHPのバージョン系統</th>
<th scope="col">修正版</th>
<th scope="col">サポート状況</th>
</tr>
</thead>
<tbody>
<tr>
<td>PHP 8.2</td>
<td>8.2.35</td>
<td>2026年12月31日でサポート終了</td>
</tr>
<tr>
<td>PHP 8.3</td>
<td>8.3.36</td>
<td>セキュリティ修正のみ</td>
</tr>
<tr>
<td>PHP 8.4 / 8.5</td>
<td>8.4.27 / 8.5.12</td>
<td>サポート中</td>
</tr>
</tbody>
</table>
</div>
<p>注意したいのは、サポート切れの古いPHPだけが対象ではなかったことです。サポート中の8.2〜8.5系も、修正版より前はすべて影響を受けます。8.1以前には公式の修正版がなく、7.4・8.0・8.1向けに最小限の修正コードが出たのみです。IPAは、調査に関わったWiz社の情報として、PHP 5.4以降は少なくともいずれかの影響を受けると紹介しています。</p>
<p>悪用の状況について、IPAは10月27日の更新で、米国CISAが2件を「悪用が確認された脆弱性」の一覧（KEVカタログ）に追加したことを紹介し、国内での攻撃被害は把握していないとしています。攻撃が観測されたことと、実際に侵害された被害が確認されたことは、分けて受け止める必要があります。なお、JPCERT/CCは10月29日の更新で、あるファイアウォール製品の特定バージョンについて、侵害成功を示唆する痕跡が確認されたとの報告を紹介しています。</p>
<h3>CVSSとは何か</h3>
<p>CVSS（Common Vulnerability Scoring System）は、脆弱性の深刻度を0.0〜10.0で評価する共通指標です。CVSS v4.0では7.0〜8.9が「High（重要）」、9.0〜10.0が「Critical（緊急）」で、PHP2Shellの9.2は最も深刻な区分に当たります。ただし、公表される基本評価値は、個々のシステムで実際に攻撃が成立するか、どの順に対処すべきかまでは示しません。</p>
<h3>首相による注意喚起とWebサイトの一時停止</h3>
<p>高市首相は21日21時55分ごろ、Xで「今夜に対応して頂きたい大至急のお願い」としてパッチの適用準備を呼びかけ、適用が難しい場合は「ウェブサイト等を一時的に停止させることも、リスクを低減させるための有効策の一つ」と述べました。同じ夜、BASE、pixiv、niconico、DMM.comなどが予防的にメンテナンスに入ったと報じられています。</p>
<p>一般の利用者には前例のない非常事態に映ったかもしれません。しかし、OS、Webサーバー、Javaランタイム、RDBMSでも、重大な脆弱性は繰り返し報告されてきました。CVSS 9点台の脆弱性を調べ、緊急対応の要否を判断すること自体は、企業システムの運用では特別なことではありません。</p>
<h3>PHPの普及範囲と管理体制の多様さ</h3>
<p>では、なぜ今回はこれほど大きな問題になったのか。背景の一つは普及範囲の広さです。W3Techsの調査（2026年10月29日時点）では、サーバー側の言語を判別できるWebサイトの69.2%がPHPを使っています。</p>
<p>もう一つは、システムの管理体制と更新可能性の違いです。専門の運用組織が管理するシステムもあれば、ホスティング事業者や制作会社に運用を任せているサイトもあります。</p>
<p>W3Techsの2026年10月31日時点の集計では、PHPを使うサイトの26.4%が7系、7.6%が5系でした。<strong>少なくとも約3分の1が、PHP本家のサポートを終了したEOL（End of Life）のバージョンを利用していた</strong>ことになります。EOLとは製品やバージョンのサポート終了を意味し、通常は開発元からセキュリティ修正が提供されなくなります。</p>
<p>私が携わってきた企業システムでは、OSやミドルウェアがEOLを迎える前に、更新や移行を計画することを基本としていました。やむを得ずEOL後も利用する場合には、延長サポートや攻撃経路の制限など、代替策と残存リスクを評価する必要があります。期限や対策を管理したうえでの継続利用と、更新されないまま残っている状態とでは、緊急時に取れる対応が異なります。</p>
<p>今回のPHP2Shellは、サポート中のバージョンにも影響した重大な脆弱性です。広く普及したPHPに問題が見つかり、通常の更新が難しい環境も相当数存在していたことが、騒動を大きくした要因の一つではないかと考えています。</p>
<h2>重大な脆弱性への対応は、平時から設計している</h2>
<h3>CVSSに応じた対応基準を準備する</h3>
<p>ここからは、私が実際に携わってきたシステムの運用を紹介します。すべてのSIerや企業システムが同じ水準にあるという意味ではなく、あくまで私の経験の範囲です。</p>
<p>私が関わったシステムでは、ベンダーのセキュリティアドバイザリ、IPAやJPCERT/CCの注意喚起、OSやミドルウェアの更新情報を継続的に監視し、管理対象の製品に関係する脆弱性を抽出していました。そのうえで、CVSSの重大度に応じた対応基準に照らし、対象サーバーの範囲、対応期限、緊急対応の要否を判断します。CVSS 9点台で緊急対応になることも、運用上の想定に含めて手順を整えていました。</p>
<p>ただし、CVSSは初期判断の材料です。9点台でも、攻撃に必要な機能を使っておらず成立条件がない場合があります。逆に8点台でも、インターネットから直接攻撃でき、すでに悪用が確認されているなら優先すべきです。<strong>脆弱性の重大度と、自分たちのシステムでの実際のリスクは、分けて評価する必要があります。</strong></p>
<h3>業務重要度によって対応方法を変える</h3>
<p>もう一つの軸が業務重要度です。私が関わったシステムでは、業務への影響に応じて区分していました。以下に簡略化したイメージを示します。</p>
<div style="overflow-x: auto; width: 100%;">
<table>
<thead>
<tr>
<th scope="col">区分</th>
<th scope="col">特徴</th>
<th scope="col">緊急対応で重視すること</th>
</tr>
</thead>
<tbody>
<tr>
<td>超クリティカルな基幹系</td>
<td>停止が業務や顧客に大きな影響を及ぼす</td>
<td>継続性、安全な切替方法、代替手段</td>
</tr>
<tr>
<td>中間的な業務システム</td>
<td>短時間の計画停止であれば調整可能</td>
<td>停止時間の調整、影響範囲の確認</td>
</tr>
<tr>
<td>バックオフィス系</td>
<td>一時的な停止を許容できる</td>
<td>必要に応じた迅速な停止と確実な復旧</td>
</tr>
</tbody>
</table>
</div>
<p>この区分に脆弱性の攻撃可能性を組み合わせて判断します。停止できるシステムにCritical級の脆弱性があり、外部からの攻撃を防げないなら、止めて修正します。停止の影響が大きい基幹系では、冗長構成や代替手段で業務への影響を抑える方法を検討します。</p>
<p>ただし、冗長構成があるからといって、未修正のサーバーを攻撃可能なまま公開し続けてよいわけではありません。片系ずつ適用する場合も、未修正側の攻撃経路を遮断できることが前提です。安全な暫定策がなければ、基幹系でも緊急停止を選ぶ場合があります。</p>
<h3>正常性確認まで事前に準備しておく</h3>
<p>特に重要だと考えているのが、パッチ適用後の正常性確認です。携わってきたシステムでは、業務重要度の区分ごとに正常性確認スクリプトとテスト項目一覧を整備していました。確認するのは、プロセスの稼働、Web/APサーバーからのDB接続、主要な業務画面やトランザクション、外部システムとの連携、ログ出力と監視、冗長構成での切替や負荷分散です。範囲と深さは、重要度と変更内容に応じて変えます。</p>
<p>緊急時の深夜に確認項目を一から洗い出せば、時間がかかり確認漏れも起きます。手順が手元にあれば、再開の判断を速く下せます。想定内とは、対応が楽に済むという意味ではありません。徹夜になっても、何をどの順に確認し、誰が再開を判断するかが決まっていることです。何から手を付けるか分からず、手探りで朝を迎える徹夜とは違います。</p>
<p>このような準備は運用設計の一部です。NISTのパッチ管理ガイド（SP 800-40 Rev.4）も、定期適用、緊急適用、緊急の緩和策、パッチを適用できない資産といった場面ごとに、対応を事前に計画することを推奨しています。パッチ・脆弱性管理に加え、起動停止や開局・閉塞などの具体的な設計項目は、運用設計書の目次サンプルを解説した次の記事で整理しています。</p>

<a href="https://sys-univ.com/dev/opedesign/" title="運用設計とは？運用設計書の目次サンプルと項目一覧｜システム基盤エンジニア視点" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">運用設計とは？運用設計書の目次サンプルと項目一覧｜システム基盤エンジニア視点</div><div class="blogcard-snippet internal-blogcard-snippet">運用設計とは何かをシステム基盤エンジニアの実務目線で解説します。運用設計書の目次サンプルと検討項目一覧を示し、監視・ログ・バックアップ・ジョブ管理、誰がやるのか、要件定義・基本設計との関係、処理方式設計との双方向連携を整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.14</div></div></div></div></a>
<h2>CVSSが高くても、必ずパッチを適用するわけではない</h2>
<h3>仮想事例：未使用の管理サービスにCVSS 8点台の脆弱性</h3>
<p>ここでは、パッチを当てるかどうかを判断する技術を、説明用の仮想事例で考えます。</p>
<p>あるミドルウェアの管理用サービスに、CVSS 8点台の脆弱性が公表されたとします。特定のTCPポートで待ち受ける管理サービスを通じて攻撃が成立しますが、このサービスは業務では使っていません。この場合、全サーバーへの即時適用の前に、成立条件を確認します。</p>
<ol>
<li><strong>影響条件の確認</strong>：対象製品、バージョン、機能、攻撃経路を確認する。</li>
<li><strong>対象サーバーの特定</strong>：管理台帳から、該当製品を使うサーバーを洗い出す。</li>
<li><strong>利用状況の確認</strong>：管理サービスを業務で使っていないことを、設計書と実機の設定で確認する。</li>
<li><strong>稼働状態の確認</strong>：管理サービスが起動していないことを確認する。</li>
<li><strong>不要サービスの停止</strong>：起動していれば停止し、自動起動も無効化する。</li>
<li><strong>有効性の確認</strong>：該当ポートが待ち受けていないこと、別の経路から同じ脆弱性を悪用できないことを確認する。</li>
<li><strong>記録と判断</strong>：実施内容と残存リスクを記録し、承認を経て緊急パッチの適用を見送る。</li>
</ol>
<h3>パッチを適用しないことは、放置することではない</h3>
<p>この例で伝えたいのは、<strong>パッチを見送る判断にも技術的な根拠が必要</strong>だということです。攻撃経路が特定のサービスに限られ、そのサービスを確実に無効化できるなら、緊急のリスク低減策として成立する場合があります。</p>
<p>ただし、攻撃経路が実際に遮断されていることを確認できなければなりません。ポートを閉じただけでは、別のインターフェースから攻撃が成立する可能性も残ります。脆弱性そのものは残っているため、構成変更やサービスの再有効化でリスクは戻ります。緊急適用を見送っても、定期メンテナンスでの更新計画は別途必要です。すでに侵害されている疑いがあれば、停止とは別に調査も欠かせません。</p>
<p dir="ltr">「脆弱性のある製品を使っている」ことと「その脆弱性を悪用できる状態にある」ことは、必ずしも同じではありません。この違いを実際のシステム構成や設定から調べ、対応方針を決めるのが、システム基盤エンジニアの仕事です。</p>
<p dir="ltr">パッチを当てるか、代わりの対策で済ませるか、どのリスクを残すか。この判断の考え方は、システムを作るときのセキュリティ要件定義で行うリスクアセスメントと同じです。対策の選び方から、残存リスクを関係者と合意するところまでは、次の記事で詳しく解説しています。</p>

<a href="https://sys-univ.com/dev/security/" title="セキュリティ要件定義の進め方｜リスクアセスメントから対策・残存リスクを決める方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-376x212.png 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">セキュリティ要件定義の進め方｜リスクアセスメントから対策・残存リスクを決める方法</div><div class="blogcard-snippet internal-blogcard-snippet">セキュリティ要件定義を、RFPや上位基準を起点に、リスクアセスメント、差異評価、対策、残存リスクまで具体化する方法を解説。脅威・脆弱性の分析、関係者との合意、変更時の再アセスメントまで実務例で整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.09.17</div></div></div></div></a>
<h2>PHP2Shellなら、現場ではどう対応するか</h2>
<h3>PHPの採用領域と運用体制の違い</h3>
<p>まず、PHPがどのようなシステムで使われているかを整理します。</p>
<div style="overflow-x: auto; width: 100%;">
<table>
<thead>
<tr>
<th scope="col">領域</th>
<th scope="col">主な特徴</th>
</tr>
</thead>
<tbody>
<tr>
<td>従来型エンタープライズ基幹系</td>
<td>Java、.NET、COBOLなどの技術資産が多く、長期的な運用管理が重視される</td>
</tr>
<tr>
<td>一般Webサイト・CMS</td>
<td>WordPressなどを通じてPHPが普及し、管理主体や保守体制が多様</td>
</tr>
<tr>
<td>SaaS・EC・Webサービス</td>
<td>PHPが注文、在庫、契約など、事業の中核となる処理を担う場合がある</td>
</tr>
</tbody>
</table>
</div>
<p>たとえばBASEは、PHPによる大規模な商用ECを継続的にリアーキテクチャしてきた経緯を技術ブログで公開しています。システムの種類だけで管理水準が決まるわけではなく、SIerが管理するシステムにも古い環境は残り、一般のWebサイトにも高度な管理をしている例はあります。今回問われたのは、実行環境を誰が管理し、どれだけ迅速に更新できるかでした。</p>
<h3>影響対象はアプリケーションではなくPHPランタイム</h3>
<p>PHP2Shellは、PHP本体の脆弱性です。WordPressやLaravelを更新しても解消しません。確認すべきなのは、実際にWebリクエストを処理しているPHPのバージョンと実行方式です。</p>
<p>PHP公式は、PHP-FPM、Apacheのmod_php、php-cgi、FrankenPHP、LiteSpeedなどを影響対象に挙げています。mod_phpではアプリケーションのコードが動く前に攻撃が成立することが実証され、最もリスクが高いとされました。PHP-FPMでも、CVE-2026-109619で条件付きの攻撃成立が確認されています。設定変更で一部の経路は減らせますが、PHP公式は完全な緩和策はないとし、更新を強く求めています。</p>
<h3>仮想事例：LB配下の公開Webシステム</h3>
<p>ここからは説明用の仮想事例です。インターネットに公開されたWebシステムで、ロードバランサー（LB）の配下に複数台のWeb/APサーバーがあり、それぞれでPHPが動いているとします。DBや外部APIと接続しており、一時的なサービス停止は業務上許容できます。私なら、次の流れを基本に検討します。</p>
<div style="overflow-x: auto; width: 100%;">
<table>
<thead>
<tr>
<th scope="col">段階</th>
<th scope="col">対応内容</th>
<th scope="col">主な確認事項</th>
</tr>
</thead>
<tbody>
<tr>
<td>① 影響調査</td>
<td>PHPのバージョン、実行方式、公開経路、対象サーバーを確認</td>
<td>実際に稼働するPHPが影響対象か</td>
</tr>
<tr>
<td>② 停止判断</td>
<td>攻撃リスクと停止による業務影響を評価</td>
<td>公開の継続を許容できるか</td>
</tr>
<tr>
<td>③ 公開の閉塞</td>
<td>LBをSorry画面に切り替える</td>
<td>バックエンドへの迂回経路がないか</td>
</tr>
<tr>
<td>④ 修正適用</td>
<td>全対象ノードへ修正版を適用</td>
<td>修正済みのランタイムが稼働しているか</td>
</tr>
<tr>
<td>⑤ 安全性・正常性確認</td>
<td>侵害調査と業務動作の確認</td>
<td>セキュリティ上・業務上の問題がないか</td>
</tr>
<tr>
<td>⑥ 再公開</td>
<td>LB配下へ段階的に戻す</td>
<td>エラーや性能劣化が発生していないか</td>
</tr>
</tbody>
</table>
</div>
<h4>①〜③ 影響を調査し、必要なら公開を止める</h4>
<p>構成管理台帳だけでなく実際の稼働環境と照合して、どのサーバーでPHPが動いているかを確認します。攻撃可能で修正まで安全を確保できなければ、LBでSorry画面に切り替えます。Sorry画面はPHPに依存しないLBの固定応答や静的コンテンツで返し、Web/APサーバーへの直接アクセス、管理用の別ポート、公開API、IPv6など、LBを迂回する経路も確認します。</p>
<h4>④ パッチを適用し、実際の稼働状態を確認する</h4>
<p>見落としやすいのがこの段階です。パッケージを更新しても、PHP-FPMやApacheを再起動しなければ古いランタイムが動き続けます。Webサーバーが使うPHPとコマンドラインのPHPで、バージョンが異なることもあります。コンテナは修正版のイメージで置き換え、オートスケールの起動テンプレートも更新しなければ、後から増えたサーバーが修正前の状態で立ち上がります。ディストリビューションが修正をバックポートしている場合は、表示バージョンではなくベンダーのアドバイザリやパッケージの修正履歴で判断します。</p>
<h4>⑤ セキュリティ確認と正常性確認を行う</h4>
<p>修正前に侵害を受けていなかったかも調べます。JPCERT/CCは、不自然に長い、または異常な形式のPHPSESSID Cookie、不審なmultipart/form-data形式のリクエストとその前後のメモリ上限エラーやHTTP 500、PHPワーカーの異常終了や頻繁な再起動の3点の確認を推奨しています。痕跡がないことは侵害がなかった証明にはならず、疑わしい兆候があれば証拠保全や再構築も検討します。</p>
<p data-pm-slice="1 1 []">パッチ適用後は、既存機能に不具合が生じていないかを確認するデグレード確認（無影響確認）が必要です。私が携わったシステムでは、この確認のために正常性確認スクリプトとテスト項目一覧を平時から作成・整備していました。今回のようなケースでも、それらを使ってDB接続、主要業務画面、外部連携、ログ出力や監視の動作を確認する想定です。ただし、すべてのケースで正常性確認スクリプトで対応できわけるではなく、事象事に適用可否を検討します。</p>
<h4>⑥ LB配下へ段階的に再公開する</h4>
<p>修正済みのノードを1台ずつLB配下に戻し、エラー率、応答時間、CPU使用率、DB接続数を見ながら範囲を広げます。これは全対象ノードの安全を確保したうえでの段階的な復旧であり、未修正のサーバーを公開したまま順番にパッチを当てるという意味ではありません。</p>
<h3>PHPだけに特別な対処をしているわけではない</h3>
<p>この流れはPHPに固有のものではありません。Javaのランタイムでも、Webサーバーでも、OSやRDBMSでも、影響を確認し、リスクを評価して対策を選び、安全と業務の両面を確かめて再開する考え方は共通です。差を生むのは、判断基準と確認手順を平時から持っているかどうかです。</p>
<p dir="ltr">こうした判断と準備は、システム基盤エンジニアの日常業務の延長にあります。平時に構成と手順を整え、稼働を保ち、いざというときには安全な状態へ戻す。基盤エンジニアの仕事の全体像は、次の記事で紹介しています。</p>

<a href="https://sys-univ.com/dev/system-infrastructure-engineer/" title="システム基盤・クラウドエンジニアの仕事｜整える、保つ、戻す" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/08/769693434e6531947a35f1606041df3d-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/08/769693434e6531947a35f1606041df3d-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/08/769693434e6531947a35f1606041df3d-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/08/769693434e6531947a35f1606041df3d-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/08/769693434e6531947a35f1606041df3d-376x212.png 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">システム基盤・クラウドエンジニアの仕事｜整える、保つ、戻す</div><div class="blogcard-snippet internal-blogcard-snippet">システム基盤エンジニアの仕事内容を、インフラエンジニアとの違いから実務まで解説。サイジング、標準化、監視、可用性、バックアップ、AWS移行、障害対応を大規模SIの実例を交えて紹介します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.17</div></div></div></div></a>
<h2>脆弱性対応で本当に重要なのは、更新できる状態を維持すること</h2>
<h3>緊急時に「すぐ更新できない」理由</h3>
<p>今回は、サポート終了バージョンへの対応も課題になりました。8.1以前は公式の修正版がなく、サポート中の版への移行にはアプリケーションやプラグインの互換性確認と改修が必要です。長く更新されていないシステムでは、設計資料が不足していたり、当時の担当者がいなかったり、保守契約が終わっていたりもします。IPAも今回の注意喚起で、こうした理由で更新が難しくなる場合があると指摘しています。パッチが出ても、安全に適用できるとは限らないのです。</p>
<p>こうした事態を避けるため、企業システムではOSやミドルウェアのサポート終了を見据え、計画的にバージョンアップやシステム更改を行います。重大な脆弱性が見つかってから更新方法を検討するのではなく、平時から更新可能な状態を維持しておくことが重要です。</p>
<p>保守終了を契機としたシステム更改については、システム更改で学ぶ、プログラミングだけではない仕事の全体像で、基盤設計からテスト、移行までの進め方を解説しています。</p>

<a href="https://sys-univ.com/dev/base2/" title="【システム開発とは何か】システム更改で学ぶ、プログラミングだけではない仕事の全体像" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-500x281.jpg 500w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-800x450.jpg 800w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-300x169.jpg 300w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-768x432.jpg 768w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-1536x864.jpg 1536w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f-376x212.jpg 376w, https://sys-univ.com/wp-content/uploads/2022/01/661447202f61355a29b111a9031b127f.jpg 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【システム開発とは何か】システム更改で学ぶ、プログラミングだけではない仕事の全体像</div><div class="blogcard-snippet internal-blogcard-snippet">システム開発はプログラミングだけではありません。A銀行のクラウドリフトを例に、現行調査、基盤設計、データ移行、テスト、運用引継ぎ、ステークホルダーや責任共有モデルまで、初心者向けに解説します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.07.17</div></div></div></div></a>
<h3>更新できる状態を維持することも運用設計</h3>
<p>迅速に動くには、平時から次の状態を保つ必要があります。使っているOSやミドルウェアの製品とバージョン、サポート期限を把握していること。パッチ適用時の影響範囲を確認でき、正常性確認手順が整っていること。サービスの停止と再開の判断基準と責任者が決まっていること。そして、更新後の監視と復旧の手順を用意していることです。</p>
<p>これらは脆弱性が見つかってから短期間で整えられるものではありません。正常性確認の手順も、機能追加や構成変更に合わせて更新し続けて初めて、緊急時に使えるものになります。</p>
<h3>脆弱性対応とは、パッチを当てる作業ではない</h3>
<p>重大な脆弱性への緊急対応を「想定内」にできるのは、重大な脆弱性が見つかることを前提に、情報収集から対応基準、対象の特定、適用の要否、正常性確認、再開までを平時に準備しているからです。成立条件を確実に排除できるなら緊急パッチを見送る判断もあり、PHP2Shellのように攻撃リスクが高く修正まで安全を確保できなければ、一時停止も合理的な選択です。どちらも、脆弱性の特徴と実際のシステム構成を確かめたうえで下す判断です。</p>
<p>PHP2Shellが社会問題になった背景には、普及範囲の広さに加え、管理体制や更新のしやすさがシステムごとに異なるという事情がありました。これはPHPに限った話ではありません。</p>
<p><strong>脆弱性対応とは、単にパッチを当てる作業ではありません。影響を調査し、対策を選択し、安全に業務を継続・再開するための運用設計なのです。</strong></p>
<h2>参考文献</h2>
<ol>
<li>IPA「PHPの脆弱性対策について（CVE-2026-109618、CVE-2026-109619：PHP2shell）」（2026年10月22日公開、10月27日更新） <a href="https://www.ipa.go.jp/security/security-alert/2026/alert20261022.html">https://www.ipa.go.jp/security/security-alert/2026/alert20261022.html</a></li>
<li>IPA「【事前準備のお願い】PHPのセキュリティリリース公開予定について」（2026年10月21日） <a href="https://www.ipa.go.jp/security/security-alert/2026/pre-alert20261021.html">https://www.ipa.go.jp/security/security-alert/2026/pre-alert20261021.html</a></li>
<li>PHP公式「Security advisory: Critical remote code execution vulnerabilities, update now」（2026年10月21日） <a href="https://www.php.net/archive/2026.php#2026-10-21-5">https://www.php.net/archive/2026.php#2026-10-21-5</a></li>
<li>PHP公式「Supported Versions」 <a href="https://www.php.net/supported-versions.php">https://www.php.net/supported-versions.php</a></li>
<li>JPCERT/CC「PHPにおける複数の脆弱性（CVE-2026-109618、CVE-2026-109619）に関する注意喚起」（2026年10月22日公開、10月29日更新） <a href="https://www.jpcert.or.jp/at/2026/at260033.html">https://www.jpcert.or.jp/at/2026/at260033.html</a></li>
<li>FIRST「Common Vulnerability Scoring System Version 4.0」 <a href="https://www.first.org/cvss/v4.0/">https://www.first.org/cvss/v4.0/</a></li>
<li>NIST「Guide to Enterprise Patch Management Planning, SP 800-40 Rev.4」 <a href="https://csrc.nist.gov/pubs/sp/800/40/r4/final">https://csrc.nist.gov/pubs/sp/800/40/r4/final</a></li>
<li>W3Techs「Usage statistics of PHP」 <a href="https://w3techs.com/technologies/details/pl-php">https://w3techs.com/technologies/details/pl-php</a></li>
<li>BASEプロダクトチームブログ「事業継続のためにPHPを使ったサービスを継続的に進化させていくこと」 <a href="https://devblog.thebase.in/entry/leverage_php">https://devblog.thebase.in/entry/leverage_php</a></li>
<li>ITmedia NEWS「高市総理『大至急、PHPパッチ適用を』Xで異例の要請」（2026年10月22日） <a href="https://www.itmedia.co.jp/news/article/2610/22/2000002483/">https://www.itmedia.co.jp/news/article/2610/22/2000002483/</a></li>
<li>Impress Watch「国内大手サービスで緊急メンテやサービス停止 PHP脆弱性で対策」（2026年10月21日） <a href="https://watch.impress.co.jp/docs/news/2150159.html">https://watch.impress.co.jp/docs/news/2150159.html</a></li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://sys-univ.com/dev/php2shell-vulnerability-response/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OracleのLIKE検索でほぼ全件ヒット？全角アンダースコアの不具合とSQL改修・再発防止の実例</title>
		<link>https://sys-univ.com/incident/oracle-like-fullwidth-underscore/</link>
					<comments>https://sys-univ.com/incident/oracle-like-fullwidth-underscore/#respond</comments>
		
		<dc:creator><![CDATA[ナギ]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 10:20:39 +0000</pubDate>
				<category><![CDATA[テクノロジー]]></category>
		<category><![CDATA[トラブル]]></category>
		<guid isPermaLink="false">https://sys-univ.com/?p=3506</guid>

					<description><![CDATA[データベースの検索結果が想定より多いとき、SQLの書き方だけを疑っていないでしょうか。検索条件が正しく見えても、データ型や文字セット、データベースのリリースによって文字の解釈が変わることがあります。 ある処理で、全角アン [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">データベースの検索結果が想定より多いとき、SQLの書き方だけを疑っていないでしょうか。検索条件が正しく見えても、データ型や文字セット、データベースのリリースによって文字の解釈が変わることがあります。</p>


<p class="wp-block-paragraph">ある処理で、全角アンダースコア「＿」を含むデータを探したところ、意図しない大量のレコードが検索対象になる事象が発生しました。調査では、公開されていたサポート情報と実機の動作が食い違い、最終的にOracle側の不具合と確認されました。しかし、製品側に修正があるからといって、パッチ適用がプロジェクトの最適解とは限りません。</p>


<p class="wp-block-paragraph">本記事では、<strong>事象の把握→原因の切り分け→対策の比較→実施→効果確認→再発防止</strong>の過程を紹介します。あわせて、Oracle Database 19cの公式仕様に基づく現在の書き方と、読者自身が確認するための検証SQLを示します。</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>先に結論：Oracle 19cでのLIKE検索</strong></p>


<ul class="wp-block-list">
	<li>ワイルドカードは半角の<code>%</code>（0文字以上）と<code>_</code>（1文字）。全角の<code>％</code>と<code>＿</code>は通常の文字として扱うのが公式仕様です。</li>


	<li>利用者が入力した半角<code>%</code>・<code>_</code>を文字として探すときは、<code>ESCAPE</code>句で明示的にエスケープします。バインド変数だけではワイルドカード化を防げません。</li>


	<li>過去の案件で採用した<code>LIKEC</code>への一律変更は、19cでの一般的な推奨規約ではありません。照合順序・データ型も含めて、<strong>実際に使用するDB環境で検証して判断します</strong>。</li>
</ul>


<p class="wp-block-paragraph">※障害事例は特定リリースの記録ですが、Oracle 19cの説明・SQL例は公式仕様に基づいており、筆者は19c実機での再現・効果検証を実施していません。利用するリリース、文字セット、データ型、照合順序で読者自身が検証してください。</p>
</blockquote>


<h2 class="wp-block-heading">1. 事象発生：全角アンダースコアの検索で想定外の大量ヒット</h2>


<h3 class="wp-block-heading">何を検索したかったのか</h3>


<p class="wp-block-paragraph">アプリケーションでは、データに含まれる全角アンダースコア「＿」を、<strong>文字そのもの</strong>として検索したいという要件がありました。ところが、問題が発生したOracle Database 11.2.0.1環境では、次のような検索が想定外の結果になりました。</p>


<pre class="wp-block-code"><code>-- 過去の障害を説明するために匿名化したSQL
-- 両端の % は半角、中央の ＿ は全角
SELECT *
FROM TEST
WHERE EFG LIKE '%＿%';
</code></pre>


<p class="wp-block-paragraph">本来は「全角アンダースコア（＿）を含む行」だけを検索するはずでした。ところが、当時のOracle環境では、全角＿が「任意の1文字」を表すワイルドカードとして扱われる不具合がありました。</p>
<p>この結果、<code>LIKE '%＿%'</code> という条件で、全角＿を含まない1文字以上の値まで一致し、ほぼ全件がヒットしてしまいました。</p>
<p><strong>問題は、検索結果が誤るだけでなく、不要なデータまで検索対象となり、処理負荷も増大することです。</strong> 実際、この案件でも性能問題をきっかけに調査を開始しました。</p>


<h3 class="wp-block-heading">半角・全角の違いは目視では分かりにくい</h3>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>文字</th>
<th>表示</th>
<th>本来の役割（19cの標準仕様）</th>
</tr>
</thead>
<tbody>
<tr>
<td>半角パーセント</td>
<td><code>%</code></td>
<td>0文字以上に一致するワイルドカード</td>
</tr>
<tr>
<td>半角アンダースコア</td>
<td><code>_</code></td>
<td>ちょうど1文字に一致するワイルドカード</td>
</tr>
<tr>
<td>全角パーセント</td>
<td><code>％</code></td>
<td>通常の文字</td>
</tr>
<tr>
<td>全角アンダースコア</td>
<td><code>＿</code></td>
<td>通常の文字</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">SQLのレビュー画面では、特に半角<code>_</code>と全角<code>＿</code>を見落としやすくなります。また、問題の本質は「全角文字が常にワイルドカードになる」ことではありません。過去の検証記録では、<strong>パターンに半角の<code>%</code>や<code>_</code>が混在したとき、全角<code>％</code>・<code>＿</code>がワイルドカードとして動作する現象</strong>が問題となりました。</p>


<h2 class="wp-block-heading">2. 現状把握・原因調査：仕様、データ型、実機結果を突き合わせる</h2>


<h3 class="wp-block-heading">まず再現条件を小さくする</h3>


<p class="wp-block-paragraph">障害対応では、いきなり本番SQLを広範囲に修正するのではなく、現象を小さな表と短いSQLで再現します。この案件でも、<code>CHAR</code>、<code>NCHAR</code>、<code>NVARCHAR2</code>、<code>VARCHAR2</code>を使い、半角・全角のアンダースコアを格納したテストデータで挙動を確認しました。</p>


<p class="wp-block-paragraph">調査の観点は、次の4つに分けられます。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>確認項目</th>
<th>確認の目的</th>
<th>具体例</th>
</tr>
</thead>
<tbody>
<tr>
<td>検索文字</td>
<td>半角・全角の混同がないか</td>
<td><code>%</code>と<code>％</code>、<code>_</code>と<code>＿</code>を区別</td>
</tr>
<tr>
<td>データ型</td>
<td>列と検索パターンの変換があるか</td>
<td><code>VARCHAR2</code>、<code>NVARCHAR2</code>など</td>
</tr>
<tr>
<td>文字セット</td>
<td>各国語キャラクタセットの条件</td>
<td><code>NLS_NCHAR_CHARACTERSET</code>を確認</td>
</tr>
<tr>
<td>SQLの種類</td>
<td>比較方式とESCAPEの影響</td>
<td><code>LIKE</code>と<code>LIKEC</code>を比較</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">各国語キャラクタセットは、例えば次のSQLで確認できます。</p>


<pre class="wp-block-code"><code>SELECT parameter, value
FROM NLS_DATABASE_PARAMETERS
WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
</code></pre>


<p class="wp-block-paragraph">過去のサポート調査では、各国語キャラクタセットが固定幅かどうかも論点になりました。再現性を評価するときは、実際の環境で確認した文字セット名と、対象列の型を記録します。</p>


<h3 class="wp-block-heading">サポート文書と実測結果が一致しなかった</h3>


<p class="wp-block-paragraph">当時のサポート情報には、特定の<code>NCHAR</code>・<code>NVARCHAR2</code>環境では、全角の<code>％</code>をワイルドカードとして扱わないという説明がありました。しかし、検証環境では半角記号との組合せなどにより、説明と一致しない結果が得られました。</p>


<p class="wp-block-paragraph">サポート窓口への初期問い合わせでは、特定リリースの「仕様」とする説明が提示されました。しかし、当時のサポート文書では全角記号をワイルドカードとして扱わないと説明されている一方、手元の実機では半角記号が混じると一致範囲が広がりました。<strong>私は、仕様の説明だけでは今回のSQL実行結果を説明できないと考えました。</strong> そこでSQL、データ型、再現条件、エラーを具体的に提示し、継続調査を依頼しました。その後、Oracle側から<strong>製品の不具合に起因する事象と考えられる</strong>との回答があり、11.2.0.4で修正済みと報告されました。</p>


<p class="wp-block-paragraph">ここで重要なのは「メーカーの回答を疑う」という姿勢ではありません。<strong>文書の記述と実測が異なる場合に、同じ条件で再現できる証拠をそろえ、技術的な説明がつくまで調べること</strong>です。技術的な事実を確定させると、対策を比較する土台ができます。</p>


<h2 class="wp-block-heading">3. 対策の立案・評価：ORA-01424と将来互換性まで比較する</h2>


<h3 class="wp-block-heading">対策を「直せるか」ではなく「全体コスト」で比べる</h3>


<p class="wp-block-paragraph">原因が製品不具合だと分かると、パッチ適用が第一候補に見えます。しかし、稼働中システムのパッチ適用では、問題の検索処理以外の業務機能にも影響しないかを確認する必要があります。今回の案件では、パッチの適用作業そのものより、<strong>広範囲の影響調査・回帰テスト・リリース調整にかかる工数</strong>が大きいと評価しました。</p>


<p class="wp-block-paragraph">複数の業務グループを集めてアクション会議を開催し、方式・基盤側が技術評価・再現検証を主導、業務側には影響範囲と運用上の回避可否の確認を依頼しました。GLとして、技術的な正しさに加え、PMと業務側が費用・リスク・運用制約を含めて選択できるよう整理したのです。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>対策候補</th>
<th>長所</th>
<th>案件での評価・採用範囲</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>A. パッチセット適用</strong></td>
<td>製品不具合そのものの修正が期待できる</td>
<td>DB全体の影響調査・回帰テストが大きい。今回の障害対応を目的とする適用は見送る</td>
</tr>
<tr>
<td><strong>B. <code>LIKE</code>＋全角記号の<code>ESCAPE</code></strong></td>
<td>一見、修正量を限定できる</td>
<td>11.2.0.1の再現SQLですでに<code>ORA-01424</code>。有効な回避策にならない</td>
</tr>
<tr>
<td><strong>C. <code>LIKEC</code>への変更とエスケープ方式の整理</strong></td>
<td>旧環境では<code>LIKEC</code>＋全角エスケープが動作し、保守サポートもSQL書き換えを回避策として提示。原因と対策候補について技術的な認識をそろえられた</td>
<td><strong>新規・改修SQLの記述方針として採用</strong>。将来の修正済みリリースで問題になる全角エスケープは規約で禁止。既存処理の残存リスクには運用回避を併用</td>
</tr>
<tr>
<td><strong>D. 運用回避</strong></td>
<td>大量の既存SQL改修を避け、限定的な対象データ・業務だけで対応できる</td>
<td><strong>改修工数が大きく、対象データが少ない既存機能で採用</strong>。回避手順と影響範囲を業務側と共有し、SQL規約と組み合わせて案件として対応</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">これは特定案件での費用・リスク評価です。パッチにセキュリティ修正が含まれる場合、サポート要件がある場合などは、別の結論になることがあります。</p>


<h3 class="wp-block-heading">ORA-01424を生んだのはどの書き方か</h3>


<p class="wp-block-paragraph">実機確認で明らかになったのは、<strong>「全角記号をエスケープする」という方針自体が、リリースの違いによって成立しなくなる</strong>ことでした。</p>


<pre class="wp-block-code"><code>-- 旧リリース（11.2.0.1）では ORA-01424 を確認
SELECT * FROM TEST WHERE EFG LIKE '%\＿%' ESCAPE '\';

-- 同じ旧リリースで実行できた、LIKEC＋全角エスケープ
SELECT * FROM TEST WHERE EFG LIKEC '%\＿%' ESCAPE '\';

-- ただし上のLIKEC文は11.2.0.4の検証環境では ORA-01424
</code></pre>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>SQL方式・パターン</th>
<th>11.2.0.1での記録</th>
<th>11.2.0.4での記録・仕様</th>
<th>判断</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>LIKE '%\＿%' ESCAPE '\'</code></td>
<td><code>ORA-01424</code></td>
<td>全角記号はリテラルとなり、同じエスケープは無効</td>
<td>旧環境の対策にはできない</td>
</tr>
<tr>
<td><code>LIKEC '%\＿%' ESCAPE '\'</code></td>
<td>実行できた</td>
<td><code>ORA-01424</code>を実機確認</td>
<td>将来互換性がない</td>
</tr>
<tr>
<td><code>LIKEC '%＿%'</code>（全角をエスケープしない）</td>
<td>半角・全角が混在する旧環境の検索条件では、SQL記述の統一だけでリスクをなくせない</td>
<td>全角<code>＿</code>を通常文字として扱う仕様</td>
<td><strong>新規・改修SQLの規約として採用</strong>。旧環境で影響を受ける既存処理は運用回避と組み合わせ、案件の対応目的を達成</td>
</tr>
<tr>
<td><code>LIKE '%＿%'</code>（全角をエスケープしない）</td>
<td>半角<code>%</code>との組合せで想定外にヒット</td>
<td>全角<code>＿</code>を通常文字として扱う仕様</td>
<td>修正済みリリースでは基本形</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph"><code>ORA-01424</code>が発生するのは、<code>ESCAPE '\'</code>に指定したエスケープ文字の次に、リテラル化の対象となる半角<code>%</code>・<code>_</code>やエスケープ文字自身ではなく、通常文字である全角<code>＿</code>が続くためです。<strong>修正前に成立した「全角記号のエスケープ」が、修正後には無効な指定になる</strong>ことを理解する必要があります。</p>


<p class="wp-block-paragraph">対策を採用する前に、<strong>修正対象の現行環境だけでなく、将来のアップグレード先でも同じSQLが成立するか</strong>を確認したことが、二度の改修を避けるうえで重要でした。</p>


<h3 class="wp-block-heading">なぜLIKECをSQL規約として採用したのか――保守サポートと技術的な認識をそろえる</h3>


<p class="wp-block-paragraph">今回重視したのは、<code>LIKE</code>と<code>LIKEC</code>のどちらが一般的に優れているかではありません。調査では、旧環境の<code>NCHAR</code>・<code>NVARCHAR2</code>列に対し、<code>LIKE</code>に全角エスケープを付けると<code>ORA-01424</code>になる一方、<code>LIKEC</code>なら実行できる組合せを確認しました。保守サポートからも<code>LIKEC</code>への書き換えが回避策として提示され、<strong>原因、成立する回避方法、リリースによる挙動の違いについて、サポートと技術的な認識をそろえることができました。</strong></p>


<p class="wp-block-paragraph">ただし、将来のアップグレード後には、全角記号をエスケープした<code>LIKEC</code>が<code>ORA-01424</code>になることも実機で確認しました。そこでプロジェクトのSQL規約では、<strong>「パターンマッチングには<code>LIKEC</code>を使い、半角<code>%</code>・<code>_</code>を文字として探す場合にエスケープする。全角<code>％</code>・<code>＿</code>はエスケープしない」</strong>という方針を定めました。</p>


<p class="wp-block-paragraph">この規約は、旧環境に存在した全角記号の問題をすべてSQLだけで解消するという意味ではありません。今回の対応目的を、<strong>新規・改修SQLの記述を統一すること、影響のある既存機能のリスクを抑えながら業務を継続すること、将来のアップグレード時に同じ箇所を再改修しないこと</strong>と定め、改修量が大きい一方で対象データが限定的な部分には運用回避を併用しました。</p>


<p class="wp-block-paragraph"><strong>この対策で目的を達成できることについて、保守サポートから得た技術的根拠を持ち、PMや業務側に説明して実施方針の合意につなげられたことが重要です。</strong> 自分たちの推測だけではなく、問い合わせ結果と実機検証に基づいて判断したことは、後から対応理由を説明する際にも役立ちます。保守サポートが確認したのは製品動作と回避策に関する技術的見解であり、改修・運用回避の適用範囲や工数の判断はプロジェクト側の責任で決めました。</p>


<h3 class="wp-block-heading">今回パッチを見送り、SQL規約と運用回避を選んだ理由</h3>


<p class="wp-block-paragraph">今回の障害への個別対処としてパッチを当てることは選択しませんでした。製品修正を適用すれば問題箇所は直っても、影響調査を対象SQLだけで済ませられず、調査・試験の総コストが大きかったためです。</p>


<p class="wp-block-paragraph">一方、SQL修正であれば対象機能を絞って検証できます。ただし、既存SQLの改修箇所が膨大なのに、問題となるデータや利用場面が少ない場合は、改修・試験の工数が効果に見合いません。そこで<strong>影響の大きさと対象データの量、運用で吸収できる負担を比較し、必要なSQL修正と運用回避を使い分ける</strong>方針を選びました。新規・改修SQLには<code>LIKEC</code>の規約を適用し、既存機能のうち費用対効果が見合わない範囲は運用面で対処します。</p>


<h2 class="wp-block-heading">4. 対策の実施：変更範囲を絞り、SQL規約と運用を整える</h2>


<h3 class="wp-block-heading">改修対象と運用対象を分けて展開する</h3>


<p class="wp-block-paragraph">SQL規約を改訂し、パターンマッチングには<code>LIKEC</code>を利用すること、半角の<code>%</code>と<code>_</code>をリテラルとして検索するときはエスケープすること、全角の<code>％</code>と<code>＿</code>にはエスケープを付けないことを定めました。新規・改修SQLではこの方針を使い、既存機能については改修の費用対効果と業務影響を見て対応方法を選びました。</p>


<p class="wp-block-paragraph">SQL改修が膨大でも、対象データが限られ、現場で無理なく回避できるなら、運用対応の方が合理的な場合があります。運用回避を選んだ機能については、対象条件と対処手順を業務側に周知する必要があります。</p>


<h3 class="wp-block-heading">GLの役割は、技術評価と業務上の判断をつなぐこと</h3>


<p class="wp-block-paragraph">今回、複数の業務グループを集めたアクション会議で、影響調査と対応の方向性を整理しました。方式・基盤側がSQLの再現検証と対策評価を主導し、業務側には対象機能や対象データ、運用回避の可否を確認してもらいました。</p>


<p class="wp-block-paragraph">PMへの説明では、パッチ適用の作業費だけでなく、DB全体の影響調査・回帰テスト・変更管理の総コストと、SQL改修後の将来互換性を比較しました。さらに、保守サポートに確認した技術的な内容を対策の根拠として示し、業務側とは修正する範囲と運用回避する範囲を調整しました。<strong>技術的に可能な対策と、プロジェクトとして選ぶべき対策は必ずしも同じではありません。</strong> GLには、製品側の技術的見解を確認するだけでなく、PM・業務側の合意形成を通じて実行可能な対策へ落とし込む役割があります。</p>
<p>今回のように、データベースで発生した問題が必ずしもDB側の設定だけで解決するとは限りません。SQLの実装や業務要件にも踏み込み、アプリケーション担当者や保守サポートと連携して原因を切り分けることも、DBAの重要な仕事です。</p>
<p>DBAが担う物理設計、性能管理、障害対応、バックアップ・復旧などの役割については、次の記事で詳しく解説しています。</p>

<a href="https://sys-univ.com/dev/database-engineer-dba/" title="データベースエンジニア（DBA）の仕事｜止めない、失わない、遅くさせない" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-500x281.jpg 500w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-800x450.jpg 800w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-300x169.jpg 300w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-768x432.jpg 768w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-1536x864.jpg 1536w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-376x212.jpg 376w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384.jpg 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">データベースエンジニア（DBA）の仕事｜止めない、失わない、遅くさせない</div><div class="blogcard-snippet internal-blogcard-snippet">データベースエンジニア（DBA）は何をする職種なのか。Oracle DBAの実務経験をもとに、物理設計・構築、性能と容量管理、権限・監査、監視、バックアップ、障害復旧、データ移行まで、構築後も続く仕事と責任をわかりやすく解説します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.03</div></div></div></div></a>


<h2 class="wp-block-heading">5. 効果の確認：検索結果の正しさと将来互換性を確認する</h2>


<h3 class="wp-block-heading">SQLの実行可否・検索結果・将来互換性を確認する</h3>


<p class="wp-block-paragraph">SQLの検証では、エラーが出ないだけでは合格にできません。「全角<code>＿</code>を含む行だけを返す」という要件を満たすか、含まない行が混ざらないかまで確認します。さらに、同じ検索処理が将来のアップグレード後にも成立するかを調べます。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>検証観点</th>
<th>確認内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>事象の再現</td>
<td>旧リリースの<code>LIKE '%＿%'</code>で、全角<code>＿</code>を含まない値も検索対象となる</td>
</tr>
<tr>
<td>SQLの実行可否</td>
<td><code>LIKE '%\＿%' ESCAPE '\'</code>では旧環境で<code>ORA-01424</code>、<code>LIKEC '%\＿%' ESCAPE '\'</code>では旧環境で実行可能</td>
</tr>
<tr>
<td>将来互換性</td>
<td>修正済みリリースでは<code>LIKEC</code>＋全角エスケープが<code>ORA-01424</code>となる</td>
</tr>
<tr>
<td>文字の組み合わせ</td>
<td>全角<code>＿</code>・<code>％</code>と半角<code>_</code>・<code>%</code>を混在させ、意図しない一致がないか確認する</td>
</tr>
<tr>
<td>列型と環境条件</td>
<td><code>VARCHAR2</code>・<code>NVARCHAR2</code>、文字セット、照合順序を記録する</td>
</tr>
<tr>
<td>運用回避の成立</td>
<td>改修しない部分について、対象データと回避手順が実際の業務で扱えるかを確認する</td>
</tr>
<tr>
<td>性能への影響</td>
<td>ヒット件数、実行計画、I/O、応答時間を確認する</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph"><strong>実行できるSQLと、業務要件どおりの結果を返すSQLは別です。</strong> この区別が、原因調査でも、対策評価でも重要でした。</p>


<p class="wp-block-paragraph">次章以降の規約・テスト項目に反映する際は、全角と半角を混ぜた入力、エスケープ文字、NULLや空文字なども含め、同じ不具合を再び見落とさないようにします。現行Oracle向けの具体的なSQL例は第7章で紹介します。</p>


<h2 class="wp-block-heading">6. 歯止め：個別対処をプロジェクト全体のルールにする</h2>


<h3 class="wp-block-heading">SQL規約に判断結果を反映する</h3>


<p class="wp-block-paragraph">実案件では、SQL規約に「パターンマッチングにおけるLIKECの利用」を新設し、設計・コーディング時の確認基準としてプロジェクトに展開しました。</p>


<p class="wp-block-paragraph">重要なのは、<strong>調査担当者だけが知っている注意点を、ほかの開発メンバーも実践できるルールに変えた</strong>ことです。規約、レビュー観点、テストデータまで揃えてこそ、障害対応が再発防止につながります。</p>


<p class="wp-block-paragraph">当時の規約改訂は、その案件の環境と将来のリリース変更を考慮したものです。現在のOracle 19c向けの規約としては、そのままコピーせず、次節に示すように<code>LIKE</code>を原則としたうえで、必要な例外条件を整理します。</p>


<h3 class="wp-block-heading">再発防止は「注意喚起」で終わらせない</h3>


<p class="wp-block-paragraph">プロジェクト内へ周知するだけでなく、SQLレビューで確認する項目と、テストで使う文字の組合せを具体化します。例えば、検索条件に利用者入力が含まれる処理では、半角<code>%</code>・<code>_</code>・エスケープ文字、全角<code>％</code>・<code>＿</code>、NULLや空文字をテストデータに含めます。</p>


<p class="wp-block-paragraph">修正箇所だけでなく、<strong>SQLの作り方とレビュー観点を変えること</strong>が歯止めになります。既存の機能が大きく、全面改修が現実的でない場合には、運用制約を明示し、将来の改修時に見直す対象として管理することも必要です。</p>


<h2 class="wp-block-heading">7. Oracle 19cではどう書くか：LIKE・ESCAPE・照合順序</h2>


<h3 class="wp-block-heading">Oracle 19cの公式仕様では全角は通常の文字</h3>


<p class="wp-block-paragraph">Oracle Database 19cのSQL言語リファレンスでは、<code>LIKE</code>のワイルドカードとして認識するのはASCII相当の半角<code>%</code>と<code>_</code>で、<strong>全角の<code>％</code>と<code>＿</code>は通常の文字として扱う</strong>と説明されています。また、Oracleはほとんどの場合に<code>LIKE</code>を推奨し、<code>LIKEC</code>はUnicodeの完全な文字単位で比較する必要がある場合の選択肢と位置付けています。</p>


<p class="wp-block-paragraph">そのため、<strong>19cで旧案件のSQL規約をそのまま移植し、すべての<code>LIKE</code>を<code>LIKEC</code>へ変更する必要はありません</strong>。適切な演算子は検索要件に基づいて選択します。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>検索要件</th>
<th>SQLの考え方</th>
</tr>
</thead>
<tbody>
<tr>
<td>全角<code>＿</code>を含む値を探す</td>
<td>原則として<code>LIKE '%＿%'</code></td>
</tr>
<tr>
<td>半角<code>_</code>を文字として探す</td>
<td><code>LIKE '%\_%' ESCAPE '\'</code></td>
</tr>
<tr>
<td>半角<code>%</code>を文字として探す</td>
<td><code>LIKE '%\%%' ESCAPE '\'</code></td>
</tr>
<tr>
<td>利用者入力を部分一致検索する</td>
<td>入力中の<code>\</code>・<code>%</code>・<code>_</code>をエスケープし、バインド変数で渡す</td>
</tr>
<tr>
<td>Unicodeの複合文字を1文字として評価する</td>
<td>要件に応じて<code>LIKEC</code>を検討</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">適用時は列のデータ型・照合順序・入力値の取り扱いを確認します。</p>


<h3 class="wp-block-heading">入力値のワイルドカードはバインド変数だけでは防げない</h3>


<p class="wp-block-paragraph">現行システムで起こりやすいのは、検索欄に利用者が入力した<code>%</code>や<code>_</code>がそのままワイルドカードとして解釈され、想定より広い範囲に一致してしまう問題です。</p>


<p class="wp-block-paragraph">例えば次のSQLは、SQLインジェクションを防ぐ目的でバインド変数を使用していても、<strong><code>:keyword</code>中のワイルドカードが有効なまま</strong>です。</p>


<pre class="wp-block-code"><code>-- バインド変数を使っていても、入力中の % や _ はワイルドカードとして働く
SELECT *
FROM TEST
WHERE EFG LIKE '%' || :keyword || '%';
</code></pre>


<p class="wp-block-paragraph">利用者入力を<strong>通常の文字列として部分一致検索したい</strong>場合は、先にエスケープ文字自体を二重化し、その後<code>%</code>と<code>_</code>をエスケープします。次は説明用のSQLです。</p>


<pre class="wp-block-code"><code>-- :keyword を1か所でバインドするSQL例
-- 未入力はNULLとして扱い、検索対象としない
WITH input_keyword AS (
    SELECT :keyword AS keyword FROM dual
)
SELECT t.*
FROM TEST t
CROSS JOIN input_keyword k
WHERE k.keyword IS NOT NULL
  AND t.EFG LIKE
      '%' ||
      REPLACE(
        REPLACE(
          REPLACE(k.keyword, '\', '\\'),
          '%', '\%'
        ),
        '_', '\_'
      ) || '%'
      ESCAPE '\';
</code></pre>


<p class="wp-block-paragraph"><code>REPLACE</code>は、<strong>エスケープ文字→<code>%</code>→<code>_</code>の順序</strong>で適用します。逆順にすると、新たに挿入したエスケープ文字が再度処理され、意図しない検索パターンになる可能性があります。</p>


<p class="wp-block-paragraph">Oracleは空文字列をNULLとして扱うため、未入力を検出する条件として<code>LENGTH(:keyword) &gt; 0</code>を追加する必要はありません。未入力で全件表示する仕様の場合は別途分岐してください。また、上の例ではバインド変数はSQL中の1か所です。実運用ではアプリケーション側で文字列をエスケープしてから単一のバインド変数として渡す方法も選べます。</p>


<p class="wp-block-paragraph">データ型が<code>NVARCHAR2</code>の場合は、文字列リテラルとバインド値の型変換も検証してください。また、検索語にSQL構文を連結するのではなく、値をバインドして渡す方針は維持します。</p>


<h3 class="wp-block-heading">実機で確認するSQL：VARCHAR2とNVARCHAR2を比較</h3>


<p class="wp-block-paragraph">以下は読者のOracle 19c環境で試せる検証手順です。<strong>テスト専用スキーマで作成し、DBの文字セット・セッション設定も記録</strong>してください。全角・半角の字形が入力時に変換されていないかにも注意します。</p>


<pre class="wp-block-code"><code>-- 検証用テーブル（業務データは使用しない）
CREATE TABLE LIKE_TEST (
    ID NUMBER PRIMARY KEY,
    TXT_V VARCHAR2(40 CHAR),
    TXT_N NVARCHAR2(40)
);

INSERT INTO LIKE_TEST VALUES (1, '東京＿本店', N'東京＿本店');
INSERT INTO LIKE_TEST VALUES (2, '東京_本店',  N'東京_本店');
INSERT INTO LIKE_TEST VALUES (3, '東京％本店', N'東京％本店');
INSERT INTO LIKE_TEST VALUES (4, '東京%本店',  N'東京%本店');
INSERT INTO LIKE_TEST VALUES (5, '東京本店',   N'東京本店');
INSERT INTO LIKE_TEST VALUES (6, NULL, NULL);
COMMIT;

-- ① 全角＿を含む値の検索：VARCHAR2／NVARCHAR2で比較
SELECT ID, TXT_V FROM LIKE_TEST WHERE TXT_V LIKE '%＿%' ORDER BY ID;
SELECT ID, TXT_N FROM LIKE_TEST WHERE TXT_N LIKE N'%＿%' ORDER BY ID;

-- ② 半角_はESCAPEを付け、文字として検索
SELECT ID, TXT_V FROM LIKE_TEST WHERE TXT_V LIKE '%\_%' ESCAPE '\' ORDER BY ID;
SELECT ID, TXT_N FROM LIKE_TEST WHERE TXT_N LIKE N'%\_%' ESCAPE '\' ORDER BY ID;

-- ③ 全角＿にESCAPEを付けるとどうなるか（エラー確認用）
SELECT ID, TXT_V FROM LIKE_TEST WHERE TXT_V LIKE '%\＿%' ESCAPE '\' ORDER BY ID;
SELECT ID, TXT_N FROM LIKE_TEST WHERE TXT_N LIKE N'%\＿%' ESCAPE '\' ORDER BY ID;

-- ④ LIKECを使用した全角＿の検索
SELECT ID, TXT_V FROM LIKE_TEST WHERE TXT_V LIKEC '%＿%' ORDER BY ID;
SELECT ID, TXT_N FROM LIKE_TEST WHERE TXT_N LIKEC N'%＿%' ORDER BY ID;

-- 確認終了後、必要な場合のみ実行
-- DROP TABLE LIKE_TEST PURGE;
</code></pre>


<p class="wp-block-paragraph">公式仕様上、①と④では全角<code>＿</code>を通常文字として扱い、②では半角<code>_</code>をエスケープし、③は無効なエスケープ指定となることが想定されます。<strong>実際の結果は照合順序・文字セットを含めて検証し、条件ごとの一致行・エラー番号を記録</strong>してください。必要に応じて、後述する照合順序の条件も記録してください。</p>


<h3 class="wp-block-heading">照合順序によって文字の一致判定が変わる場合がある</h3>


<p class="wp-block-paragraph">Oracle 19cで全角<code>＿</code>をワイルドカードとして扱わないことと、全角・半角の文字が比較上同じと見なされるかは別の問題です。<code>LIKE</code>の一致判定は、列・式の照合順序（collation）の影響を受けます。大文字・小文字、アクセント、文字幅など、区別したい属性がある場合は、対象DBの照合設定と実際の検索結果を確認してください。</p>


<pre class="wp-block-code"><code>-- セッションの比較設定を記録する
SELECT parameter, value
FROM NLS_SESSION_PARAMETERS
WHERE parameter IN ('NLS_COMP', 'NLS_SORT');
</code></pre>


<p class="wp-block-paragraph"><code>NLS_COMP</code>や<code>NLS_SORT</code>に加え、列・式で指定された照合順序が評価に影響する場合もあります。検索結果の差を調査するときは、SQLだけでなく、これらの環境条件を合わせて記録することが重要です。</p>


<p class="wp-block-paragraph">検索パターンの先頭に<code>%</code>を置く部分一致検索は、通常のB-tree索引の範囲検索を効率よく利用しにくくなります。大量データを対象にする場合は、実行計画やI/Oを確認し、必要に応じて検索方式・索引設計を見直します。</p>


<h2 class="wp-block-heading">8. まとめ：サポートと根拠をそろえ、説明できる対策を選ぶ</h2>


<p class="wp-block-paragraph">今回の事例で重要だったのは、Oracleに不具合があったという事実だけではありません。検索結果の異常から出発し、再現条件を切り分け、サポート文書と実機の矛盾を根拠とともに提示して調査を依頼しました。</p>


<p class="wp-block-paragraph">不具合を修正するパッチが存在しても、稼働中のシステムでは影響調査や回帰テスト、展開の負担まで含めて判断しなければなりません。今回の案件では、パッチ適用を見送り、<strong>新規・改修SQLの規約整備と、改修量に比べ対象データが少ない既存機能での運用回避を組み合わせる</strong>方針を選びました。さらに、旧環境で有効なエスケープ方式がアップグレード先では<code>ORA-01424</code>になることを検証し、将来の保守も考慮した規約としました。</p>


<p class="wp-block-paragraph">こうした対策を選ぶうえで大きかったのは、<strong>保守サポートと技術的な認識をそろえ、その回答と実機検証を根拠にPM・業務側へ説明し、実施方針の合意を得られたこと</strong>です。製品の動作についてはサポートに確認し、どの範囲を改修して何を運用で回避するかはプロジェクトで決める。その責任分界と判断根拠を明確にしたことで、対応を実行に移すことができました。</p>


<p class="wp-block-paragraph"><strong>障害対応の本質は、技術的な解決策を見つけることだけではありません。品質・コスト・リスクを比較し、ベンダーと関係者の技術的な認識をそろえ、後から理由を説明できる対策を選ぶことです。</strong> この進め方こそが、別の障害に直面したときにも再利用できる実務上のノウハウだと考えます。</p>


<p class="wp-block-paragraph">なお、現在のOracle 19cでは、全角記号を通常文字として扱う仕様が明記されています。個々のシステムでは、利用者入力のワイルドカード化、文字セット、照合順序、性能面も含め、対象環境で検証して最終判断してください。</p>


<hr class="wp-block-separator has-alpha-channel-opacity" />

<h3 class="wp-block-heading">参考資料</h3>


<ul class="wp-block-list">
	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Pattern-matching-Conditions.html">Oracle Database 19c SQL言語リファレンス：Pattern-matching Conditions</a> — LIKE、LIKEC、ESCAPE、全角記号の扱い</li>


	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/nlspg/linguistic-sorting-and-matching.html">Oracle Database 19c Globalization Support Guide：Linguistic Sorting and Matching</a> — NLS_COMP、NLS_SORT、照合順序</li>
</ul>

]]></content:encoded>
					
					<wfw:commentRss>https://sys-univ.com/incident/oracle-like-fullwidth-underscore/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ECS/FargateでDockerfileのchownが効かない｜非rootコンテナがPermission deniedになる理由</title>
		<link>https://sys-univ.com/incident/ecs-fargate-permission-denied/</link>
					<comments>https://sys-univ.com/incident/ecs-fargate-permission-denied/#respond</comments>
		
		<dc:creator><![CDATA[ナギ]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 01:18:51 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[トラブル]]></category>
		<guid isPermaLink="false">https://sys-univ.com/?p=3094</guid>

					<description><![CDATA[はじめに ECS/Fargateでコンテナを非rootユーザーとして実行したところ、ログ出力先のディレクトリでPermission deniedが発生したことがありました。 Dockerfileでは、ログ出力先のディレク [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><span style="font-size: 18px;"><strong>はじめに</strong></span></p>
<p>ECS/Fargateでコンテナを非rootユーザーとして実行したところ、ログ出力先のディレクトリで<code>Permission denied</code>が発生したことがありました。</p>
<p>Dockerfileでは、ログ出力先のディレクトリを作成し、アプリケーションを実行するユーザーへ<code>chown</code>していました。Dockerイメージだけを見ると、書き込みできるように設定されています。</p>
<p>問題が起きたのは、アプリケーションコンテナとFluent Bitコンテナでログ用のVolumeを共有する構成にしたときでした。</p>
<p>原因を調べていくと、Dockerfileの設定が常に無効になるという単純な話ではありませんでした。Dockerfile、ECSタスク定義、Volumeを個別に確認するだけではなく、<strong>それらを組み合わせた実行時の最終状態まで設計対象にできていたか</strong>という問題に行き着きました。</p>
<p>この記事では、実際に発生した事象と採用した対策を、AWS公式ドキュメントで確認できる仕様と照らし合わせて整理します。採用しなかった対策候補との違いも明確にしながら、設計段階で見落とした点と、事前のPoCで確認すべきだった内容を振り返ります。</p>
<h2>ECS/FargateでPermission deniedが発生した</h2>
<p>今回の構成を単純化すると、アプリケーションがファイルへログを書き込み、同じVolumeをマウントしたFluent Bitがそのログを読み取る構成でした。</p>
<pre><code class="language-text">Application Container
非rootユーザー
        │
        │ ログ書き込み
        ↓
    Shared Volume
        │
        │ ログ読み込み
        ↓
Fluent Bit Container
</code></pre>
<p>ECSのタスク定義では、Volumeを定義し、アプリケーションコンテナとFluent Bitコンテナの双方へマウントしていました。</p>
<p>本記事では、タスク定義でボリューム名を定義した空のデータVolumeを、AWS公式ドキュメントに合わせて<strong>bind mount</strong>と呼びます。AWS公式でも、bind mountの用途として、1つ以上のコンテナにマウントする空のデータVolumeが示されています。Fargateでは、bind mountにタスクへ割り当てられたエフェメラルストレージが利用されます。</p>
<p>詳細は、<a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/bind-mounts.html">AWS公式「Amazon ECSでのバインドマウントの使用」</a>と<a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/fargate-task-storage.html">AWS公式「Amazon ECS向けのFargateタスクエフェメラルストレージ」</a>で確認できます。</p>
<p>アプリケーションコンテナは非rootユーザーで動作させていました。Dockerfileでは、概念的には次のようにログ出力先を作成し、所有者を変更しています。</p>
<pre><code class="language-dockerfile">RUN mkdir -p /app/logs
RUN chown appuser:appgroup /app/logs

USER appuser
</code></pre>
<p>タスク定義側の<code>user</code>による上書きはなく、実行ユーザーはDockerfileの<code>USER</code>で指定した非rootユーザーでした。</p>
<p>このDockerイメージだけを見ると、<code>appuser</code>が<code>/app/logs</code>へ書き込めるように見えます。</p>
<p>ところがECS/Fargate上でタスクを起動すると、アプリケーションがログを書き込む際に<code>Permission denied</code>が発生しました。</p>
<h2>Dockerfileでchownしたのに、なぜ書き込めなかったのか</h2>
<p>問題のポイントは、<strong>Dockerfileで<code>chown</code>したディレクトリと、ECS/Fargate上でアプリケーションが実際に書き込むディレクトリが、Volumeマウント後は同じものではなかったこと</strong>です。</p>
<p>Dockerイメージ内では、<code>/app/logs</code>の所有者を<code>appuser</code>へ変更していました。</p>
<pre class="wp-block-code"><code>Docker Image
    │
    └─ /app/logs
         owner = appuser</code></pre>
<p>この状態だけを見れば、<code>appuser</code>は<code>/app/logs</code>へ書き込めるように見えます。</p>
<p>ECSで同じ<code>/app/logs</code>へVolumeをマウントすると、イメージ内のディレクトリはマウントによって覆い隠されます。実行中のコンテナから見えるのは、Dockerfileで<code>chown</code>したイメージ側の<code>/app/logs</code>ではなく、<strong>Volume側の<code>/app/logs</code></strong>です。</p>
<pre class="wp-block-code"><code>Docker Image
/app/logs
owner = appuser
        │
        │ ECS Task起動
        ↓
Volumeを /app/logs へmount
        │
        ↓
イメージ側の /app/logs は隠蔽
        │
        ↓
コンテナから見える /app/logs
＝ Volume側</code></pre>
<p>Dockerfileで設定したディレクトリが削除されたわけではありません。同じパスへVolumeをマウントしたことで、イメージ側のディレクトリが実行中のコンテナから見えなくなっています。</p>
<p><strong>Dockerfileで<code>chown</code>していても、Volumeマウント後の<code>/app/logs</code>が同じ所有者・権限になるとは限りません。</strong></p>
<p>今回見落としていたのは、この<strong>「イメージ作成時の権限」と「Volumeマウント後の実効権限」の違い</strong>でした。</p>
<h3>DockerfileのVOLUMEとcontainerPathが一致する場合</h3>
<p>ここまでだけを見ると、「VolumeをマウントするとDockerfile側の権限設定は使われない」と考えたくなります。</p>
<p>Amazon ECSには、もう一つ重要な仕様があります。</p>
<p>Dockerfileの<code>VOLUME</code>で指定した絶対パスと、タスク定義の<code>containerPath</code>が一致する場合、ECSはそのパス内のデータをデータVolumeへコピーします。</p>
<p>AWS公式ドキュメントには、非rootユーザー向けに対象ディレクトリを<code>chown</code>し、<code>USER</code>を指定した後に<code>VOLUME</code>を宣言する例も掲載されています。この説明の中では、既定のVolume権限を<code>0755</code>、所有者を<code>root</code>とし、Dockerfileでカスタマイズできることも示されています。</p>
<p>詳細は、<a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/bind-mounts.html">AWS公式「Amazon ECSでのバインドマウントの使用」</a>を参照してください。</p>
<p>概念的には次のような記述です。</p>
<pre class="wp-block-code"><code>RUN mkdir -p /app/logs
RUN chown appuser:appgroup /app/logs

USER appuser
VOLUME ["/app/logs"]</code></pre>
<p>今回使用していたDockerfileには、<strong>ログ出力先を<code>VOLUME</code>として宣言する記述はありませんでした。</strong></p>
<pre class="wp-block-code"><code>Dockerfile
/app/logs を appuser に chown
        │
        ↓
ECSで同じパスへVolumeをmount
        │
        ↓
イメージ側の /app/logs は隠蔽
        │
        ↓
VOLUME宣言なし
        │
        ↓
Volumeマウント後の権限で
書き込み可否が決まる</code></pre>
<p class="PDq2pG_selectionAnchorContainer" data-start="308" data-end="485">今回の構成では、Dockerfileで<code data-start="327" data-end="334">chown</code>した<code data-start="336" data-end="347">/app/logs</code>へVolumeをマウントしたことで、イメージ側のディレクトリは隠蔽されました。また、Dockerfileに対象パスの<code data-start="405" data-end="413">VOLUME</code>宣言がなく、<code data-start="419" data-end="427">VOLUME</code>と<code data-start="428" data-end="443">containerPath</code>を一致させてイメージ側の状態をVolumeへ引き継ぐ仕組みも利用していませんでした。</p>
<p data-start="490" data-end="566">当時は、この<strong data-start="496" data-end="547">DockerfileとECS Volumeを組み合わせた後に、実行時にどのような状態になるのか</strong>を設計観点として持っていませんでした。</p>
<p data-start="571" data-end="712"><code data-start="571" data-end="579">VOLUME</code>宣言がなかったことだけで、Permission deniedの原因をすべて説明できるわけではありません。実際の書き込み可否は、Volumeマウント後のowner、group、modeと、アプリケーションの実効UID/GID、書き込み対象パスの組み合わせで決まります。</p>
<p>今回の問題で重要だったのは、<strong>Dockerfileで<code>chown</code>したという設定だけを見て書き込み可能と判断し、Volumeマウント後にどの所有者・権限になるのかを確認していなかったこと</strong>です。</p>
<p>今回の案件では<code>VOLUME</code>を利用する方法は採用していないため、ここではAWS公式仕様から確認できる対策候補の一つとして扱います。</p>
<h3 data-section-id="ouun3s" data-start="2343" data-end="2372">実効ユーザーもDockerfileだけで確認しない</h3>
<p data-start="2374" data-end="2434">ファイルやディレクトリの権限とあわせて確認する必要があるのが、<strong data-start="2405" data-end="2431">コンテナを実際にどのユーザーで実行しているか</strong>です。</p>
<p data-start="2436" data-end="2529">ECSでは、Dockerfileの<code data-start="2453" data-end="2459">USER</code>とは別に、タスク定義の<code data-start="2470" data-end="2476">user</code>でも実行ユーザーを指定できます。このパラメータはDockerの<code data-start="2507" data-end="2513">User</code>や<code data-start="2514" data-end="2522">--user</code>に対応します。</p>
<p data-start="2531" data-end="2591">今回のタスク定義では<code data-start="2541" data-end="2547">user</code>を指定しておらず、Dockerfileの<code data-start="2567" data-end="2573">USER</code>を上書きする設定はありませんでした。</p>
<p data-start="2593" data-end="2652">設計レビューで確認すべきなのは、「Dockerfileに<code data-start="2621" data-end="2635">USER appuser</code>と書いてある」ことではありません。</p>
<p data-start="2654" data-end="2731"><strong data-start="2654" data-end="2717">ECS上で最終的にどのUID/GIDでプロセスが動き、そのユーザーがVolumeマウント後のパスへ必要な操作をできるか</strong>まで確認する必要があります。</p>
<p data-start="2733" data-end="2814">Volumeの権限と同じく、Dockerfileやタスク定義を個別に見るだけでは不十分です。設計対象にすべきなのは、それらを組み合わせた後の実行時の最終状態です。</p>
<p data-start="2816" data-end="2977"><code data-start="2816" data-end="2822">user</code>パラメータの仕様は、<a class="decorated-link" href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html" target="_new" data-start="2832" data-end="2969">AWS公式「FargateでのAmazon ECSタスク定義パラメータ」</a>で確認できます。</p>
<h2>対策はchownの方法だけで考えない</h2>
<p>Permission deniedが発生すると、<code>chmod</code>や<code>chown</code>の方法から考えたくなります。</p>
<p>今回の構成を設計の観点から見直すと、その前に確認すべきことがあります。</p>
<p><strong>アプリケーションコンテナとFluent Bitの間に、そもそも共有Volumeが必要なのか。</strong></p>
<p>権限をどう合わせるかだけではなく、権限調整が必要になる境界そのものをなくせないかを最初に検討します。</p>
<h3>共有Volume自体をなくせないか</h3>
<p>今回の構成は次のようになっていました。</p>
<pre><code class="language-text">Application
    ↓ file
Shared Volume
    ↓ file
Fluent Bit
</code></pre>
<p>ログ出力要件が許せば、アプリケーションのログをファイルへ出力せず、<code>awsfirelens</code>ログドライバ経由でFluent Bitへ渡す構成も考えられます。</p>
<p>FireLensでは、アプリケーションコンテナに<code>awsfirelens</code>ログドライバを設定し、Fluent BitまたはFluentdをログルーターとして利用できます。</p>
<p>詳細は、<a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/firelens-taskdef.html">AWS公式「Amazon ECSタスク定義の例：FireLensにログをルーティングする」</a>を参照してください。</p>
<pre><code class="language-text">Application
    ↓ awsfirelens
Fluent Bit
</code></pre>
<p>この構成に変更できれば、アプリケーションとFluent Bitの間でログファイルを共有するVolumeをなくせる可能性があります。Volumeに付随するowner、group、mode、UID/GID、マウント後の権限といった設計項目も減らせます。</p>
<p>実案件でも、ログ出力方式そのものを変更して共有Volumeをなくす案を検討しました。既存のログ出力方式を変更するとAP側での改修と再テストが必要になるため、今回は共有Volumeを残したうえで権限設定方法を変更する判断としました。</p>
<p><strong>設計として上位の選択肢を検討しても、変更影響やプロジェクト条件によって採用できないことがあります。</strong></p>
<p>重要なのは、「権限エラーをどう直すか」から始めるのではなく、「その権限設計自体をなくせないか」を一度確認したうえで、案件条件に合った方法を選ぶことです。</p>
<h3>VOLUMEディレクティブを利用する方法</h3>
<p>共有Volumeを残す場合には、前述したDockerfileの<code>VOLUME</code>と<code>containerPath</code>の仕様を利用する方法も候補になります。</p>
<p>この方法ではDockerfile、すなわちコンテナイメージそのものを変更します。ECS上の課題を解決する目的で<code>VOLUME</code>を追加しても、同じイメージを別の環境で実行した場合の挙動にも影響します。</p>
<p>今回の環境ではこの方法を追加検証していないため、AWS公式仕様から確認できる対策候補としての紹介に留めます。</p>
<h3>補足：<code>configuredAtLaunch</code>はbind mountの設定ではない</h3>
<p>対策を調べる過程では、ECSのVolumeに関する情報を複数確認しました。その中で紛らわしかったのが<code>configuredAtLaunch</code>です。</p>
<p>名称からはVolumeの初期設定に使えるようにも見えますが、<code>configuredAtLaunch=true</code>は、ECSのデプロイ時にAmazon EBS Volumeを構成するための設定です。今回利用していたbind mountの権限を変更するためのオプションではありません。</p>
<p><a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/configure-ebs-volume.html">AWS公式「Amazon ECSのデプロイ時にAmazon EBSボリューム設定を指定する」</a>でも、<code>configuredAtLaunch</code>を<code>true</code>に設定したタスク定義に対して、デプロイ時にAmazon EBS Volumeを構成する仕組みとして説明されています。</p>
<p><strong>同じ「Volume」という言葉で扱われていても、bind mount、EBS、EFSでは仕様も設定方法も異なります。目にした情報をそのまま設計判断に使うのではなく、自分が利用しているVolume方式を特定したうえで、該当する公式ドキュメントを確認する必要があります。</strong></p>
<h3>権限設定用コンテナを先行して実行する</h3>
<p>別の方法として、Volumeの所有者や権限を設定するコンテナを先に実行し、正常終了した後にアプリケーションコンテナを起動する構成があります。</p>
<p>ECSでは<code>dependsOn</code>でコンテナ間の起動依存関係を設定できます。<code>SUCCESS</code>を指定すると、依存先コンテナが終了コード0で完了するまで後続コンテナを開始しません。<code>SUCCESS</code>と<code>COMPLETE</code>の依存先にはessential containerを指定できません。</p>
<p>詳細は、<a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html">AWS公式「FargateでのAmazon ECSタスク定義パラメータ」</a>を参照してください。</p>
<pre><code class="language-text">Permission Setting Container
        │
        │ Volumeの所有者・権限を設定
        │ exit 0
        ↓
Application Container
        ↓
Fluent Bit Container
</code></pre>
<p class="PDq2pG_selectionAnchorContainer" data-start="131" data-end="212">権限設定用コンテナには、共有Volumeへ必要な所有者・権限を設定できる権限を持たせます。アプリケーションコンテナ自体は従来どおり非rootユーザーで実行します。</p>
<p data-start="217" data-end="269">この方法であれば、アプリケーションイメージを変更せず、タスク定義を中心とした基盤側の変更で対応できます。</p>
<p data-start="274" data-end="446"><strong data-start="274" data-end="446">なお、権限設定用コンテナでVolumeの初期権限を整えても、その後アプリケーションが生成するファイルを別コンテナから読めるとは限りません。TomcatとFluent BitでVolumeを共有した際に実際に発生したPermission deniedと、UID/GID・setgid・umaskを含む権限設計について、続編で整理しました。</strong></p>

<a href="https://sys-univ.com/dev/ecs-fargate-fluent-bit-permission-denied/" title="Fluent BitがPermission deniedでログを読めない｜ECS/Fargate共有VolumeのUID/GID設計" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/08/c93b625ff36561072a4ad9fa2e52e6a8-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/08/c93b625ff36561072a4ad9fa2e52e6a8-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/08/c93b625ff36561072a4ad9fa2e52e6a8-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/08/c93b625ff36561072a4ad9fa2e52e6a8-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/08/c93b625ff36561072a4ad9fa2e52e6a8-376x212.png 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Fluent BitがPermission deniedでログを読めない｜ECS/Fargate共有VolumeのUID/GID設計</div><div class="blogcard-snippet internal-blogcard-snippet">ECS/FargateでTomcatとFluent Bitが共有Volumeを利用する構成でPermission deniedが発生。Fluent BitのUID/GID、setgid、umask、read-onlyマウントなど、Dockerコンテナ間でログを共有する際の権限設計を実例から解説します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.24</div></div></div></div></a>
<h3>rootユーザーで実行する</h3>
<p>アプリケーションコンテナ自体をrootユーザーで実行する方法もあります。</p>
<p>権限問題は回避しやすくなりますが、非root実行を前提としていたセキュリティ設計との整合を確認する必要があります。動作するかどうかだけではなく、なぜ非rootユーザーで実行する設計にしていたのかまで戻って判断する必要があります。</p>
<h3>技術的に動く対策と、プロジェクトで採用できる対策は違う</h3>
<p>今回検討した方法を、変更対象まで含めて整理すると次のようになります。</p>
<table>
<thead>
<tr>
<th>対策</th>
<th>主な変更対象</th>
<th>実務上の論点</th>
</tr>
</thead>
<tbody>
<tr>
<td>共有Volumeをなくす</td>
<td>アプリケーション／ログ出力設定／タスク定義</td>
<td>既存のログ出力方式を変更できるか</td>
</tr>
<tr>
<td><code>VOLUME</code>を利用</td>
<td>Dockerfile／コンテナイメージ</td>
<td>AP側成果物の変更と再テストが必要</td>
</tr>
<tr>
<td>権限設定用コンテナ</td>
<td>タスク定義</td>
<td>基盤側で完結しやすいが構成要素が増える</td>
</tr>
<tr>
<td>rootで実行</td>
<td>実行ユーザー／セキュリティ設計</td>
<td>非root要件との整合が必要</td>
</tr>
</tbody>
</table>
<p><strong>最終的には、権限設定用コンテナを先行して実行する構成を採用しました。</strong></p>
<p>アプリケーション側を修正したりログ出力仕様を変更したりする場合、AP側での改修とテストが必要になります。権限設定用コンテナの追加であれば、タスク定義を管理する基盤側で変更を完結でき、既存のコンテナイメージにも影響を与えません。</p>
<p><strong>変更範囲を基盤側に限定できることから、この方式を採用しました。</strong> この構成への変更後は、非rootユーザーで実行するアプリケーションからログを正常に書き込めるようになり、Permission deniedは解消しました。</p>
<p>技術的に成立する対策と、プロジェクトとして採用しやすい対策は同じとは限りません。変更主体、責任分界、変更影響、追加試験の範囲まで含めて対策を決める必要があります。</p>
<h2>なぜ設計段階で気づけなかったのか</h2>
<p>今回の問題で重要なのは、ECSのVolume仕様を知っていたかどうかだけではありません。</p>
<p>結果として、Dockerfileで設定した権限と、ECSがVolumeをマウントした後の実効権限との接続部分を、設計時に十分確認できていませんでした。</p>
<p>Dockerfileだけを見れば、確認対象は次の範囲です。</p>
<pre><code class="language-text">Dockerfile
 ├ mkdir
 ├ chown
 └ USER
</code></pre>
<p>実際には、その後ろまで設計する必要があります。</p>
<pre><code class="language-text">Docker Image
      ↓
ECS Task Definition
      ↓
Volume生成
      ↓
containerPathへmount
      ↓
実効UID/GID
      ↓
Applicationからwrite
      ↓
Fluent Bitからread
</code></pre>
<p><strong>「Dockerfileで対象ディレクトリをchownしたこと」と、「Volumeをマウントした実行環境でアプリケーションユーザーが書き込めること」は同じではありません。</strong></p>
<p>前者は設定内容です。設計で最終的に保証したいのは後者です。</p>
<h3>「担当者が知らなかった」で終わらせない</h3>
<p>今回のECS Volumeの仕様を知っている担当者であれば、設計段階で問題に気づけた可能性があります。</p>
<p>原因を「担当者が仕様を知らなかった」で終わらせても、次の案件で同じ問題を防ぐ仕組みにはなりません。</p>
<p>クラウドでは、自分たちがDockerfileや設定ファイルへ直接記述するものだけでなく、クラウドサービスが実行時に生成、マウント、変更するものがあります。必要なのは、それらを含めた<strong>実行時の最終状態を設計する観点</strong>です。</p>
<p>今回であれば、設計レビューでは次のような項目を確認すべきでした。</p>
<table>
<thead>
<tr>
<th>設計項目</th>
<th>確認する内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>Volume方式</td>
<td>bind mount、EBS、EFSなど、どの方式を利用するか</td>
</tr>
<tr>
<td>Volume生成</td>
<td>誰が、いつ生成するか</td>
</tr>
<tr>
<td><code>containerPath</code></td>
<td>どのパスへマウントするか</td>
</tr>
<tr>
<td>Dockerfile <code>VOLUME</code></td>
<td>定義の有無と<code>containerPath</code>との関係</td>
</tr>
<tr>
<td>実効UID/GID</td>
<td>Dockerfileの<code>USER</code>、タスク定義の<code>user</code>を踏まえて誰が実行するか</td>
</tr>
<tr>
<td>Application側権限</td>
<td>誰が、どのパスへwriteするか</td>
</tr>
<tr>
<td>Fluent Bit側権限</td>
<td>誰が、どのパスをreadするか</td>
</tr>
<tr>
<td>owner/group/mode</td>
<td>Volumeマウント後にどうなるべきか</td>
</tr>
<tr>
<td>起動順</td>
<td>権限設定が必要な場合、いつ実施するか</td>
</tr>
<tr>
<td>Volumeライフサイクル</td>
<td>タスク停止・再作成時にデータや設定がどうなるか</td>
</tr>
<tr>
<td>変更主体</td>
<td>Dockerfile、タスク定義、ログ設定の誰が変更するか</td>
</tr>
</tbody>
</table>
<p>Fargateで利用するbind mountはタスクのエフェメラルストレージ上にあり、bind mountを使用するすべてのコンテナが停止するとデータは削除されます。今回のようなFargateタスクでは、タスク停止時のライフサイクルまで含めて設計する必要があります。</p>
<p>詳細は、<a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/bind-mounts.html">AWS公式「Amazon ECSでのバインドマウントの使用」</a>を参照してください。</p>
<p><strong>設計書に「Dockerfileでchownする」と書くだけでは足りません。Volumeをマウントした後に、どのUID/GIDが、どのパスへ、どの権限でアクセスできるのかを定義する必要があります。</strong></p>
<p>ここまで書いて、初めて実行時の権限設計になります。</p>
<p>この考え方は、ECSだけに限りません。基本設計で決めた方式を、構築・テストできる状態までどう落とすかについては、次の記事で詳しく整理しています。</p>
<ul>
<li><a href="https://sys-univ.com/dev/basic-design-infrastructure/">基本設計で決めること｜画面設計だけでは終わらない基盤SEの設計工程</a></li>
<li><a href="https://sys-univ.com/dev/detailed-design-overview/">【前編】詳細設計で決めること｜基本設計を「構築・テスト・運用できる形」に落とし込む工程</a></li>
</ul>
<h2>事前PoCでは、ここまで確認すべきだった</h2>
<p>今回の問題は、設計段階のPoCで発見できた可能性があります。</p>
<p>ECSでコンテナが起動することだけを確認するPoCでは足りません。</p>
<p>今回のPermission deniedを検出するだけなら、大掛かりな試験は必要ありませんでした。本番と同じ非rootユーザーとVolume構成でタスクを起動し、次の範囲を確認すれば、書き込み権限の問題を設計段階で検出できた可能性があります。</p>
<pre><code class="language-text">ECS Task起動
      ↓
実効UID/GIDを確認
      ↓
Volume mount後のowner/group/modeを確認
      ↓
Applicationからファイル作成
      ↓
Applicationからディレクトリ作成
</code></pre>
<p>これが、今回の問題を発見するために必要だった<strong>最低限のPoC</strong>です。</p>
<p>ログ機構全体の成立性まで確認するのであれば、その先にFluent Bitからの読み取り、ログ転送、Task再作成後の動作まで確認します。</p>
<pre><code class="language-text">Applicationからwrite
      ↓
Fluent Bitからread
      ↓
ログ転送
      ↓
Task再作成後も成立するか
</code></pre>
<p>設計レビュー表とPoCで似た項目を確認するのには理由があります。</p>
<p><strong>設計では、実行時に成立すべき状態を定義する。PoCでは、その状態が実際の環境で成立することを確認する。</strong></p>
<p>今回なら、設計では「非rootのアプリケーションユーザーがVolumeマウント後のログ出力先へwriteできる」と定義します。PoCでは、本番相当のユーザーとVolume構成で実際にファイルを作成して確認します。</p>
<p>PoCは「AWSのサービスが使えるか」を試すだけの工程ではありません。</p>
<p><strong>本番と同じ境界を通したときに、設計したシステムが成立するかを確認する工程です。</strong></p>
<p>クラウドリフトでも、AWSサービス単体の機能確認だけを行い、オンプレミスからクラウドへ移した後の実際の処理や運用まで通さなければ、問題が後工程で表面化します。今回のVolume権限も規模は小さいものの、構造は同じでした。</p>
<p>クラウドリフトでPoCに何を含めるべきかは、次の記事で詳しく整理しています。</p>
<ul style="list-style-type: disc;">
<li><a href="https://sys-univ.com/dev/cloudlift/">クラウドリフトの失敗は構築前に始まっている｜PoC不足が手戻り・コスト超過・納期遅延を招く理由</a></li>
<li><a href="https://sys-univ.com/dev/cloudlift-poc-risk-1/">クラウドリフトPoCで「動いた」は確認できた。しかし業務では使えなかった｜10の設計リスク① 可用性・性能・ストレージ・バックアップ・監視</a></li>
</ul>
<h2>今回の事象から得た3つの学び</h2>
<p>一つ目は、<strong>Dockerfileは設定であって、実行時の最終状態ではない</strong>ことです。</p>
<p>Dockerfileで<code>USER</code>や<code>chown</code>を指定しても、それだけでECS上の実効ユーザーやVolumeマウント後の権限は確定しません。設計で確認するべきなのは、各設定をECS上で組み合わせた後の最終状態です。</p>
<p>二つ目は、<strong>設計で抜けやすいのはコンポーネント単体ではなく、その接続部分である</strong>ことです。</p>
<p>Dockerfileの設定もECSのVolume定義も、それぞれ単体で存在しています。今回確認できていなかったのは、DockerイメージとECS Volumeを接続した後に、どのユーザーがどのファイルシステムへアクセスするのかという実行時の状態でした。</p>
<p>三つ目は、<strong>PoCでは本番と同じ境界を通す必要がある</strong>ことです。</p>
<p>コンテナが起動したことだけでは、システムとして成立したことにはなりません。本番と同じUID/GID、Volume、マウントポイント、サイドカーを含めて実際の処理を通し、設計した状態が成立することを確認する必要があります。</p>
<p>今回の事象を振り返ると、</p>
<p><strong>「Dockerfileでchownした」ではなく、「Volumeをマウントした後に、必要なユーザーが必要な操作をできる」まで確認して初めて権限設計は完了する</strong></p>
<p>ということになります。</p>
<p>クラウドでは、自分たちが直接構築・設定したものだけを見るのでは足りません。クラウドサービスが実行時に生成、変更、接続するものまで含めて最終状態を設計し、不確実性が残る境界は事前PoCで実際に通す。</p>
<p>今回のPermission deniedは小さな権限エラーでしたが、クラウド設計とPoCで何を確認するべきかを改めて考えるきっかけになりました。</p>
<h2>参考にしたAWS公式ドキュメント</h2>
<ul>
<li>
<p><a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/bind-mounts.html">Amazon ECSでのバインドマウントの使用</a></p>
</li>
<li>
<p><a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/fargate-task-storage.html">Amazon ECS向けのFargateタスクエフェメラルストレージ</a></p>
</li>
<li>
<p><a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html">FargateでのAmazon ECSタスク定義パラメータ</a></p>
</li>
<li>
<p><a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/configure-ebs-volume.html">Amazon ECSのデプロイ時にAmazon EBSボリューム設定を指定する</a></p>
</li>
<li>
<p><a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/firelens-taskdef.html">Amazon ECSタスク定義の例：FireLensにログをルーティングする</a></p>
</li>
</ul>
<hr />
<p><span style="font-size: 18px;"><strong>関連記事</strong></span></p>
<p class="PDq2pG_selectionAnchorContainer" data-start="49" data-end="112">ECS/Fargateの権限問題を、設計レビューで何を確認するかという観点を、運用設計や要件定義の工程まで広げて確認したい方は、以下の記事も参考にしてください。</p>
<ul data-start="114" data-end="193">
<li data-section-id="hata0n" data-start="114" data-end="193"><strong>運用設計とは？運用設計書の目次サンプルと項目一覧｜基盤SE視点</strong><br />
ログ、監視、ジョブ、バックアップ、障害対応など、本番運用を成立させるために設計しておくべき項目を整理しています。</li>
</ul>

<a href="https://sys-univ.com/dev/opedesign/" title="運用設計とは？運用設計書の目次サンプルと項目一覧｜システム基盤エンジニア視点" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">運用設計とは？運用設計書の目次サンプルと項目一覧｜システム基盤エンジニア視点</div><div class="blogcard-snippet internal-blogcard-snippet">運用設計とは何かをシステム基盤エンジニアの実務目線で解説します。運用設計書の目次サンプルと検討項目一覧を示し、監視・ログ・バックアップ・ジョブ管理、誰がやるのか、要件定義・基本設計との関係、処理方式設計との双方向連携を整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.14</div></div></div></div></a>
<ul data-start="231" data-end="312">
<li data-section-id="x4krsd" data-start="231" data-end="312"><strong>要件定義とは何をする工程か｜RFP・見積前提から認識差を潰す実務</strong><br />
RFPや提案内容を前提に、スコープや責任分界を確定し、設計・構築・テストできる水準まで具体化する実務を解説しています。</li>
</ul>

<a href="https://sys-univ.com/dev/requirements-definition/" title="要件定義とは何をする工程か｜RFP・見積前提から認識差を潰す実務" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-376x212.png 376w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a.png 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">要件定義とは何をする工程か｜RFP・見積前提から認識差を潰す実務</div><div class="blogcard-snippet internal-blogcard-snippet">要件定義とは何をする工程なのか。RFP、質問回答、提案書、見積前提から認識差を潰し、スコープや責任分界を確定する実務を、大規模SIの具体的な失敗事例とともに解説します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.12</div></div></div></div></a>
]]></content:encoded>
					
					<wfw:commentRss>https://sys-univ.com/incident/ecs-fargate-permission-denied/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Oracleのインデックス設計とは？付与判断・設計指針・性能試験の進め方を実例で解説</title>
		<link>https://sys-univ.com/dev/oracle-index-design/</link>
					<comments>https://sys-univ.com/dev/oracle-index-design/#respond</comments>
		
		<dc:creator><![CDATA[ナギ]]></dc:creator>
		<pubDate>Fri, 23 Oct 2026 02:59:59 +0000</pubDate>
				<category><![CDATA[システム開発]]></category>
		<guid isPermaLink="false">https://sys-univ.com/?p=3518</guid>

					<description><![CDATA[インデックスは、性能試験で遅いSQLが見つかってから追加すればよい。設計工程でそう割り切り、ほとんど検討しないまま単体性能試験を迎えるプロジェクトは少なくありません。大規模システムでこれをやると、膨大なSQLの中からボト [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>インデックスは、性能試験で遅いSQLが見つかってから追加すればよい。設計工程でそう割り切り、ほとんど検討しないまま単体性能試験を迎えるプロジェクトは少なくありません。大規模システムでこれをやると、膨大なSQLの中からボトルネックを探し、インデックスを設計し直す作業が試験工程に集中します。</p>
<p>とはいえ、SQLもデータ件数も固まっていない段階で、最適なインデックスを決めることはできません。必要なのは、設計段階で最低限の候補を抽出し、性能試験で効果を確かめながら見直す進め方です。</p>
<p>本記事では、業務側の設計がまだ本格的に動き出していない時期に、システム基盤側でインデックス設計を巻き取り、設計指針・実施要領・検討表を整えて業務チームへ展開した事例を紹介します。技術解説はOracle Database 19cを基準にしています。</p>
<blockquote>
<p>事例中に登場する「1万件」「3％」などの各種数値は架空の値です。案件で作業量を絞るために置いた仮の一次選別ルールであり、Oracle 19cの推奨値や実測結果ではありません。</p>
</blockquote>
<h2>1. インデックス設計とは？「作る・作らない」を根拠付きで決める</h2>
<h3>インデックスがあれば速くなる、とは限らない</h3>
<p>インデックスは、特定の検索条件に対して対象行を効率よく見つけるためのデータ構造です。Oracleで一般的なB-treeインデックスは、等価検索や範囲検索で有力なアクセスパスになります。</p>
<p>ただし、表の大部分を読むSQLでは、インデックス経由の行アクセスがかえって高コストになることがあります。インデックスはINSERT・UPDATE・DELETEのたびに維持されるので、増やすほど書き込み負荷と格納領域も増えます。</p>
<p>設計すべきなのは「どの列に索引を張るか」だけではありません。対象SQL、選択性、データ量、更新頻度、結合や並び替えの条件、既存索引との重複まで含めて、付与する理由と付与しない理由を説明できる状態にすることです。</p>
<div style="overflow-x: auto;">
<table>
<thead>
<tr>
<th>検討項目</th>
<th>確認したいこと</th>
<th>判断への影響</th>
</tr>
</thead>
<tbody>
<tr>
<td>SQLの使われ方</td>
<td>WHERE、JOIN、ORDER BY、実行頻度</td>
<td>対象となる列と列順を考える</td>
</tr>
<tr>
<td>データ量</td>
<td>現在件数、試験時件数、将来の増加</td>
<td>全表走査と索引アクセスを比較する</td>
</tr>
<tr>
<td>絞り込み</td>
<td>想定ヒット件数、値の分布、偏り</td>
<td>索引の選択性を見積もる</td>
</tr>
<tr>
<td>更新特性</td>
<td>更新頻度、更新される列、バッチ量</td>
<td>追加索引の維持コストを評価する</td>
</tr>
<tr>
<td>既存定義</td>
<td>PK、ユニーク制約、既存索引</td>
<td>重複した索引を避ける</td>
</tr>
<tr>
<td>外部キー</td>
<td>子表の外部キー列、親表の削除・主キー更新</td>
<td>子表のロック競合を避ける</td>
</tr>
<tr>
<td>業務要件</td>
<td>応答時間、夜間バッチの処理時間</td>
<td>検証の優先順位を付ける</td>
</tr>
</tbody>
</table>
</div>
<h3>インデックス設計は物理設計とアプリケーション設計の接点</h3>
<p>インデックスの判断には、DBAや基盤SEが持つDBの知識だけでなく、業務チームが把握しているSQL・検索条件・データ分布が必要です。設計書を一人で眺めて完結する作業ではありません。</p>
<p>データベース物理設計の全体像は、次の記事で紹介しています。インデックス設計は、その中でもSQLの処理特性に強く依存する領域です。</p>

<a href="https://sys-univ.com/dev/db-physical-design/" title="データベースの物理設計とは？設計項目・進め方・容量見積の実務をOracle 19cで解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-376x212.png 376w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f.png 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">データベースの物理設計とは？設計項目・進め方・容量見積の実務をOracle 19cで解説</div><div class="blogcard-snippet internal-blogcard-snippet">データベースの物理設計とは？設計項目・進め方・容量見積をOracle 19cで解説。大手SIer20年超の基盤SEが、実案件の物理設計書・課題管理表をもとに、暫定見積、PROCESSES算定、Data Guard設計の実例を紹介します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.10.21</div></div></div></div></a>
<p>&nbsp;</p>
<h2>2. なぜ単体性能試験の前にインデックス設計が必要なのか</h2>
<h3>「性能は基盤がやるもの」という空気</h3>
<p>このプロジェクトでは、設計が始まって間もない時期で、業務チームは画面や機能の設計に追われていました。インデックス設計どころではありません。加えて、性能は基盤の担当という空気がありました。</p>
<p>性能を基盤に預けたまま工程が進めば、そのツケは性能試験でまとめて返ってきます。単体性能試験では、ある程度のインデックスを付与した状態から性能を確認し、必要に応じて見直すのが現実的です。索引がほとんどない状態で大量のSQLを一斉に試験へ流せば、遅いSQLが多数出て、切り分けだけで工程が埋まります。</p>
<p>当時の設計指針にも、この考え方を明記していました。机上だけで正確に判断するのは難しい。ただ、インデックスをまったく作らずに試験すると、ボトルネックの特定が膨大になる。最低限のインデックス設計を先に行い、試験工程のSQLトレース等で見直す、という方針です。</p>
<h3>押し付け合いになる作業を、先に巻き取る</h3>
<p>担当が曖昧な作業は、どこのプロジェクトでも押し付け合いになり、誰も手を付けないまま期限を迎えます。インデックス設計はその典型です。</p>
<p>私はインデックス設計を基盤側で引き受けると宣言しました。作業を引き取るだけではなく、判断基準と進め方も基盤側で決める。その方針を示して、先行設計に着手しました。</p>
<p>開発プロセスを知らない人には、性能は基盤がやるものに見えていたようです。リーダークラスの中には、面倒な作業を基盤側が引き受けて助かった、と感じた人もいたように思います。私の見方は逆で、ここを握れば性能試験までの進め方を自分で組み立てられます。経験としても悪くないと考えました。</p>
<h3>何を材料に先行したか</h3>
<p>先行設計の材料は、SQLマップ、エンティティ定義書、想定レコード件数です。SQLは、プロトタイプアプリを作っていた業務チームと組んで集めました。完成したアプリケーションがなくても、主要な検索のパターンはプロトタイプの段階でかなり見えてきます。</p>
<p>ここで意識したのは、基盤側が業務の最終判断まで奪わないことです。私が作ろうとしたのは、業務側が後から検討を引き継げる共通の土台でした。</p>
<h2>3. 設計指針はどう作るか――判断基準と成果物を基盤側で定義する</h2>
<h3>指針・実施要領・検討表・定義書を分ける</h3>
<p>用意した成果物は、役割を明確に分けました。</p>
<div style="overflow-x: auto;">
<table>
<thead>
<tr>
<th>成果物</th>
<th>役割</th>
<th>主に記録すること</th>
</tr>
</thead>
<tbody>
<tr>
<td>インデックス設計指針</td>
<td>設計判断の原則をそろえる</td>
<td>索引種別、件数・ヒット率の目安、付与時の注意点</td>
</tr>
<tr>
<td>インデックス設計実施要領</td>
<td>作業手順をそろえる</td>
<td>SQL抽出、一次候補選別、定義書の作成方法</td>
</tr>
<tr>
<td>インデックス付与検討表</td>
<td>SQLごとの判断を残す</td>
<td>SQLマップ上の管理ID、参照表、除外理由、付与要否、見直し事項</td>
</tr>
<tr>
<td>インデックス定義書</td>
<td>実装可能な形にする</td>
<td>索引名、対象表、対象列・順序、索引種別、一意性、目的</td>
</tr>
<tr>
<td>付与分析資料</td>
<td>難しい候補を掘り下げる</td>
<td>選択性、複合索引の列順、代替案と検証課題</td>
</tr>
</tbody>
</table>
</div>
<p>この分け方の利点は、指針を変更したとき、どのSQLのどの判断に影響するかを追跡できることです。最終的なCREATE INDEX文だけを成果物にすると、「なぜ作ったのか」「なぜ作らなかったのか」が残りません。</p>
<h3>ルールは一次選別用の仮基準として置く</h3>
<p>指針には、候補を効率よく絞り込むための具体的な目安を入れました。</p>
<div style="overflow-x: auto;">
<table>
<thead>
<tr>
<th>当時の仮基準</th>
<th>設計上の狙い</th>
<th>Oracle 19cでの位置づけ</th>
</tr>
</thead>
<tbody>
<tr>
<td>1万件未満の表は一次候補から除外</td>
<td>小規模表の検討負荷を減らす</td>
<td>固定基準ではない。行長、ブロック数、アクセス頻度も確認</td>
</tr>
<tr>
<td>想定ヒット件数が表全体の3％以内</td>
<td>選択性の高い検索を優先</td>
<td>固定基準ではない。統計情報、Clustering Factor、実行計画で判断</td>
</tr>
<tr>
<td>非PK索引は原則5本以内</td>
<td>DML負荷と管理負荷を抑える</td>
<td>製品上限ではなく、案件内の設計抑制ルール</td>
</tr>
<tr>
<td>複合索引の構成列は原則10列以内</td>
<td>索引の肥大化を抑える</td>
<td>設計上の目安。必要な列と列順はSQL別に検証</td>
</tr>
<tr>
<td>複雑なJOIN・副問合せは「要注意」</td>
<td>机上判定が難しいSQLを明示</td>
<td>不要という意味ではなく、実行計画による検証対象</td>
</tr>
</tbody>
</table>
</div>
<p>「1万件」「3％」「5本」「10列」は、Oracle製品の仕様上限でも、一般に正しい性能境界でもありません。限られた時間で検討の優先順位を付けるための基準です。Oracle 19cのオプティマイザは、統計情報、値の分布、I/Oコストなどからアクセスパスを選びます。しきい値だけで採否を確定させないことが前提です。</p>
<h3>「例外」と「判断保留」の入口も決めておく</h3>
<p>指針を機械的に適用すると、重要なSQLを見落とします。小さい表でも呼び出し回数が多ければ問題になり得ますし、JOINを含むSQLこそ性能の主要因になる場合があります。</p>
<p>実務で作る規約には、「原則」と同じくらい「例外の入口」が必要です。一次選別で除外したSQLも、不要と確定したのか、情報不足で判断保留なのか、実機試験へ回したのかを区別して残します。</p>
<h2>4. SQLマップからインデックス付与候補を抽出する手順</h2>
<h3>手順1：SQLマップ上の管理IDと対象SQLを一覧化する</h3>
<p>実施要領では、SQLマップの名前空間と、select・insert・update・deleteに相当するSQLの管理IDを抽出し、付与検討表に転記する手順を定めました。ここでの管理IDはアプリケーション設計資料上の識別子であり、Oracleの<code>V$SQL.SQL_ID</code>とは別物です。</p>
<p>現在のプロジェクトなら、アプリケーションのSQL定義、ORMの生成SQL、SQL実行ログなども情報源になります。最初に押さえるべきは、SQLが「どの業務機能で使われるか」「どの表を参照・更新するか」を追跡できる状態にすることです。</p>
<h3>手順2：一次候補を機械的に絞り込む</h3>
<p>当時の実施要領では、次の順番でSQLを選別しました。</p>
<div style="overflow-x: auto;">
<table>
<thead>
<tr>
<th>判定順</th>
<th>確認内容</th>
<th>当時の一次選別</th>
<th>現在の実務での扱い</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>SQL種別</td>
<td>動的SQL・単純INSERTは一次候補から外す</td>
<td>動的SQLでも頻出条件があれば分析対象。INSERT…SELECTのSELECT側も確認</td>
</tr>
<tr>
<td>2</td>
<td>JOIN・副問合せの有無</td>
<td>複雑なSQLは「要注意」として後工程へ</td>
<td>重要SQLなら早期から実行計画を確認</td>
</tr>
<tr>
<td>3</td>
<td>主キーによる絞り込み</td>
<td>PKで十分なら追加不要候補</td>
<td>PK索引で十分か、実行計画と取得行数で確認</td>
</tr>
<tr>
<td>4</td>
<td>テーブル件数</td>
<td>1万件未満は一次候補から外す</td>
<td>件数不明なら保留とし、追加調査へ</td>
</tr>
<tr>
<td>5</td>
<td>想定ヒット件数</td>
<td>3％を超える場合は一次候補から外す</td>
<td>選択性の仮評価。頻度・Clustering Factorも考慮</td>
</tr>
<tr>
<td>6</td>
<td>最終判断</td>
<td>残ったSQLを一次候補とする</td>
<td>SQLをまたいで索引統合・DML影響を検討</td>
</tr>
</tbody>
</table>
</div>
<p>この方法の良いところは、すべてのSQLを同じ深さで分析しないことです。数の多いSQLから一次候補を機械的に選び、判断の難しいSQLと性能上重要なSQLへ検討工数を集中できます。</p>
<p>動的SQLやJOINを含むSQLでも、実行頻度が高いもの、業務上の応答時間が厳しいものは早い段階から実行計画を確認します。</p>
<h3>手順3：選択性を仮計算する</h3>
<p>想定100万行の表をCUSTOMER_IDで検索し、結果が500行と見積もられる場合、選択性は次のとおりです。</p>
<pre><code>500行 ÷ 1,000,000行 × 100 = 0.05％
</code></pre>
<p>当時の基準なら一次候補に残ります。ここから「必ず索引を作る」とは決めません。値の偏り、索引から表へ戻るアクセスの回数、SQLの実行頻度、更新時の負荷、似た索引の有無を確認します。</p>
<p>逆に、100万行中20万行を取得する検索（20％）でも、索引だけで必要な列を取得できるケースや、複数条件の組み合わせで効果が出るケースがあります。数字は候補を絞るための入口で、最終判定ではありません。</p>
<h3>手順4：複合インデックスの列順と、索引が使われない書き方を確認する</h3>
<pre><code class="language-sql">-- 説明用のSQL。実案件のSQLではありません。
SELECT ORDER_ID, ORDER_DATE, STATUS
FROM   ORDER_HEADER
WHERE  CUSTOMER_ID = :customer_id
AND    ORDER_DATE &gt;= :date_from
AND    ORDER_DATE &lt;  :date_to;
</code></pre>
<p>このSQLでは、CUSTOMER_IDの等価条件とORDER_DATEの範囲条件が候補になります。(CUSTOMER_ID, ORDER_DATE)の複合索引を比較対象にできますが、列順は他のSQLでの使われ方や値の分布も踏まえて決めます。</p>
<p>同じ表にCUSTOMER_ID単独、(CUSTOMER_ID, ORDER_DATE)、(CUSTOMER_ID, ORDER_DATE, STATUS)を無計画に重複作成しないことも大切です。Oracle 19cには先頭列を省略した場合のスキップ・スキャンもあるので、「先頭列がないと絶対に使われない」という古いルールをそのまま当てはめるのも適切ではありません。</p>
<p>索引を作っても、SQLの書き方で使われないケースもこの段階で拾っておきます。代表的なのは次の2つです。</p>
<ul>
<li><strong>列への関数適用</strong>：<code>WHERE TRUNC(ORDER_DATE) = :d</code> のように列を関数で包むと、ORDER_DATEの通常の索引を使った効率的な範囲検索が難しくなります。日付の範囲条件に書き換えるか、関数ベース索引を検討します。</li>
<li><strong>暗黙の型変換</strong>：VARCHAR2の列を数値のバインド変数と比較すると、列側にTO_NUMBERが適用され、索引が使われなくなります。SQL規約とバインド変数の型定義で防ぎます。</li>
</ul>
<p>もう一つ、Oracleで見落とされやすいのが<strong>外部キー列の索引</strong>です。子表の外部キー列に索引がないと、親表の行削除や主キー更新の際に子表に表レベルのロック（TMロック）がかかり、子表への同時更新が待たされることがあります。検索条件に出てこない列でも、親表を削除・更新する処理があれば付与を検討します。</p>
<h3>手順5：「不要」の理由まで記録する</h3>
<p>インデックスを付与しない場合も、判断の根拠を残します。付与検討表の記入イメージは次のとおりです。</p>
<div style="overflow-x: auto;">
<table>
<thead>
<tr>
<th>SQL管理ID（例）</th>
<th>機能</th>
<th>主な条件</th>
<th>一次判定</th>
<th>理由</th>
<th>次工程での確認</th>
</tr>
</thead>
<tbody>
<tr>
<td>SEL001</td>
<td>詳細照会</td>
<td>ORDER_ID = :id</td>
<td>追加不要候補</td>
<td>PK等価検索で十分と想定</td>
<td>想定行数と実行計画</td>
</tr>
<tr>
<td>SEL002</td>
<td>一覧照会</td>
<td>CUSTOMER_ID = :id</td>
<td>付与候補</td>
<td>大量表を少数行に絞り込む</td>
<td>索引有無の応答時間・I/O比較</td>
</tr>
<tr>
<td>SEL003</td>
<td>複合検索</td>
<td>JOIN＋期間条件</td>
<td>判断保留</td>
<td>JOIN順序と対象件数が未確定</td>
<td>データ整備後の実行計画</td>
</tr>
<tr>
<td>UPD001</td>
<td>状態更新</td>
<td>ORDER_ID = :id</td>
<td>追加不要候補</td>
<td>PK利用。索引追加による更新負荷も懸念</td>
<td>同時更新・バッチ時間</td>
</tr>
</tbody>
</table>
</div>
<p>※この表の管理ID・表名・SQL条件は説明用の例です。</p>
<h2>5. 実務事例：先行設計で「作らない」判断も残す</h2>
<h3>業務領域ごとに付与判断が分かれた</h3>
<p>業務グループが本格的に設計へ取りかかる前に、私は開発が先行する業務領域について、基盤側でインデックスを設計しました。結果は次のとおりです。</p>
<div style="overflow-x: auto;">
<table>
<thead>
<tr>
<th>業務領域　　</th>
<th>先行設計での判断</th>
<th>ポイント</th>
</tr>
</thead>
<tbody>
<tr>
<td>業務A</td>
<td>3テーブルにインデックスを付与</td>
<td>中間一致・後方一致検索への対応を含め、業務側に引き継ぎ</td>
</tr>
<tr>
<td>業務B</td>
<td>8テーブルにインデックスを付与</td>
<td>カーディナリティの想定が変われば再検討を依頼</td>
</tr>
<tr>
<td>業務C</td>
<td>付与なし</td>
<td>対象テーブルの想定件数がいずれも1万件未満で、一次候補条件に該当しなかった</td>
</tr>
</tbody>
</table>
</div>
<p>「3」「8」はインデックスの本数ではなく、インデックスを付与したテーブルの数です。業務Cでは当時の一次選別基準に該当する表がなく、後工程の再評価対象として判断を記録しました。</p>
<p>すべての業務領域に同じように索引を作るのではなく、候補を抽出し、作らない場合も理由を残して後から見直せるようにする。先行設計で狙ったのはそこです。</p>
<h3>中間一致・後方一致は、通常の選別とは切り分けた</h3>
<p>業務Aには、中間一致・後方一致検索の性能課題がありました。通常のB-tree索引は <code>LIKE 'ABC%'</code> のような前方一致には有効な場合がありますが、<code>LIKE '%ABC'</code> や <code>LIKE '%ABC%'</code> では、範囲スキャンで効率よく絞り込めません。</p>
<p>なお、LIKE検索では、インデックスの利用可否だけでなく、検索条件の解釈にも注意が必要です。</p>
<p>過去に私が担当したプロジェクトでは、Oracleの不具合により、全角アンダースコア「＿」がワイルドカードとして扱われ、想定外の大量ヒットが発生しました。</p>
<p>実機検証による原因調査から、LIKECの検証、SQL改修・運用回避の判断、再発防止までの経緯は、次の記事で解説しています。</p>

<a href="https://sys-univ.com/dev/oracle-like-fullwidth-underscore/" title="OracleのLIKE検索でほぼ全件ヒット？全角アンダースコアの不具合とSQL改修・再発防止の実例" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-376x212.png 376w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c.png 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">OracleのLIKE検索でほぼ全件ヒット？全角アンダースコアの不具合とSQL改修・再発防止の実例</div><div class="blogcard-snippet internal-blogcard-snippet">Oracle LIKE検索で全角アンダースコア「＿」がワイルドカード化した障害事例。ORA-01424とLIKECの検証、パッチと運用回避の対策比較、保守サポートと根拠をそろえた判断を解説。19cでは全角は通常文字、半角%・_を文字として探す場合はESCAPEを使用。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.10.21</div></div></div></div></a>
<p>この検索は一次選別の流れには乗せず、中間一致・後方一致に対応する索引を個別に設計し、定義書と分析資料に設計理由を残して業務側へ引き継ぎました。現在の案件で同じ要件が出た場合は、Oracle Textなどの適用可否も含め、検索要件、運用負担、ライセンス条件を合わせて評価します。</p>
<h3>設計に使った資料の「時点」を残して引き継ぐ</h3>
<p>先行設計で気をつけたのは、使った情報が必ずしも最新ではないことです。SQLマップ、エンティティ定義書、想定レコード件数は、それぞれ異なる時点の資料でした。列のカーディナリティも、一部は想定を置いて判断しています。</p>
<p>業務グループへの引き継ぎでは、設計に使った各資料の時点と前提条件を明記し、最新資料との差異やカーディナリティの見込み違いがあれば再評価するよう依頼しました。基盤側で設計を先行させることと、業務側の検証を省略することは別の話です。</p>
<p>入力となる件数やSQLが変われば、同じ判断表でも結論は変わります。使用した資料の版と判断日を残すことは、インデックス名を決めることと同じくらい重要です。</p>
<h2>6. 業務グループへ展開する――説明会・修正・引き継ぎ</h2>
<h3>説明会で手順をそろえる</h3>
<p>一部の業務領域を基盤側で先行設計できても、プロジェクト全体のSQLを基盤チームが把握し続けるのは現実的ではありません。SQLの機能要件や業務データの分布を一番よく知っているのは、各業務グループです。</p>
<p>そこで、業務GLとインデックス設計担当者を集めて説明会を開き、設計指針、実施要領、付与検討表、定義書の作り方を一通り説明しました。インデックスの一般的な仕組みではなく、SQLマップのどこを見て、どの条件で候補を絞り、検討表や定義書に何を記録するのか。基盤側の先行設計を実例として見せ、業務グループでも同じ手順を踏めるようにしました。</p>
<h3>たたき台を出すと、指摘が出てくる</h3>
<p>説明会では、作成した指針や検討結果について指摘が出ました。自分たちではなかなか手を付けないのに、たたき台には意見が出る。正直に言えば、カチンときたのも事実です。</p>
<p>ただ、指摘を受けてあるSQLの判定を「必要」から「不要」に改め、実施要領にも作業手順の説明を追記しています。白紙の段階では出てこなかった業務側の知見が、たたき台を出したことで初めて表に出てきたわけです。最終的に同じ基準で合意できたので、結果としては良かったと思っています。</p>
<p>指摘を反映した版を共通の設計資料として配布し、業務側の検討へ引き継ぎました。</p>
<h3>誰が何を更新するかまで決める</h3>
<p>引き継ぎでは、役割も整理しました。基盤・DBAは指針と技術上の制約、共通レビュー、実行計画の技術支援を持つ。業務・アプリケーション担当は、SQLとデータ件数の更新、候補抽出、定義書の作成を持つ。性能試験担当は、試験条件と実績値、SQLトレースや実行計画の取得を持つ。GLは役割分担と改訂ルールの周知、判断保留の解消を持つ。</p>
<p>肩書きはプロジェクトによって変わります。決めておくべきなのは、設計の根拠となった情報が更新されたとき、誰が再判定するかです。</p>
<h2>7. Oracle 19cでは、設計したインデックスをどう検証するか</h2>
<h3>机上見積と実機の結果を分けて見る</h3>
<p>インデックスの最終的な有効性は、実行計画と実行統計で確認します。見る対象は検索時間だけではありません。</p>
<div style="overflow-x: auto;">
<table>
<thead>
<tr>
<th>検証観点</th>
<th>具体的に見るもの</th>
</tr>
</thead>
<tbody>
<tr>
<td>選択性</td>
<td>想定行数と実際の取得行数、値の偏り</td>
</tr>
<tr>
<td>アクセスパス</td>
<td>INDEX RANGE SCAN、TABLE ACCESS FULLなど</td>
</tr>
<tr>
<td>実行統計</td>
<td>経過時間、Buffers、Reads、実行回数</td>
</tr>
<tr>
<td>推定精度</td>
<td>E-RowsとA-Rowsの乖離</td>
</tr>
<tr>
<td>索引の構造</td>
<td>DISTINCT_KEYS、CLUSTERING_FACTORなど</td>
</tr>
<tr>
<td>更新性能</td>
<td>INSERT／UPDATE／DELETEやバッチ処理への影響</td>
</tr>
<tr>
<td>再現性</td>
<td>統計情報、テストデータ、SQL、バインド条件の一致</td>
</tr>
</tbody>
</table>
</div>
<p>データ量、統計情報、バインド変数、SQLの条件をそろえ、索引がある場合とない場合を比較します。差が出ても索引だけが原因とは限らないので、実行計画の変化を必ず確認します。</p>
<h3>DBMS_XPLANで実行計画と実績値を見る</h3>
<p>Oracle 19cでは、DBMS_XPLAN.DISPLAY_CURSORで実際に実行したSQLの計画を確認できます。行数やBuffersの実績値を取るには、対象SQLにGATHER_PLAN_STATISTICSヒントを付けるのが影響範囲が狭く扱いやすい方法です。セッション全体で <code>statistics_level = ALL</code> にする方法もありますが、そのセッションのすべてのSQLに計測負荷がかかります。</p>
<pre><code class="language-sql">-- 説明用の手順例。実案件の実測結果ではありません。検証環境で実行してください。
SELECT /*+ GATHER_PLAN_STATISTICS */
       ORDER_ID, ORDER_DATE, STATUS
FROM   ORDER_HEADER
WHERE  CUSTOMER_ID = :customer_id
AND    ORDER_DATE &gt;= :date_from
AND    ORDER_DATE &lt;  :date_to;

SELECT *
FROM   TABLE(DBMS_XPLAN.DISPLAY_CURSOR(
         sql_id          =&gt; :target_sql_id,
         cursor_child_no =&gt; NULL,
         format          =&gt; 'ALLSTATS LAST'));
</code></pre>
<p>DBMS_XPLANの参照には、動的パフォーマンスビューへのアクセス権限が必要です。検索1回だけで判断せず、代表的なバインド値、データ量、実行頻度で確認します。</p>
<h3>統計情報とカーディナリティを確認する</h3>
<p>インデックスを作っても、オプティマイザが使うとは限りません。特定の値にアクセスが集中する列では、平均的な選択性と実態が一致しないことがあります。</p>
<pre><code class="language-sql">SELECT table_name, num_rows, blocks, last_analyzed
FROM   user_tables
WHERE  table_name = 'ORDER_HEADER';

SELECT index_name, blevel, leaf_blocks,
       distinct_keys, clustering_factor, last_analyzed
FROM   user_indexes
WHERE  table_name = 'ORDER_HEADER';
</code></pre>
<p>統計情報が古い場合は、検証条件を整えたうえでDBMS_STATSによる収集を検討します。収集前後で実行計画が変わる可能性があるので、性能検証の途中で無計画に統計情報を更新しないようにします。</p>
<h3>Invisible IndexとAutomatic Indexingの使いどころ</h3>
<p>Oracle 19cのInvisible Indexは、索引をオプティマイザから見えなくする機能です。検証用セッションで <code>ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES = TRUE;</code> とすれば、他のセッションに影響を与えずに、その索引がある場合の実行計画を確認できます。ただし、Invisible IndexもDMLのたびに維持されます。参照側の比較には使えますが、更新負荷の検証は別に必要です。</p>
<p>自動インデックス作成機能（Automatic Indexing）は、Oracle 19cの通常のEnterprise Edition（EE）だけでは利用できません。OracleのLicensing Informationでは、Exadata上のEnterprise Edition on Engineered Systems（EE-ES）や対象のExadata Database Serviceで利用可能とされています。Autonomous Databaseでも提供されています。導入を検討する際は、製品・サービスと契約上の利用条件を確認します。</p>
<p>特定の機能を使うことがゴールではありません。設計時の仮説を計測で更新し、その理由を記録することがゴールです。</p>
<h2>8. まとめ：インデックス設計は「試験前に仮説を作る仕事」</h2>
<p>インデックス設計は、すべてのSQLを完成させ、十分な試験データを揃えてから始める作業ではありません。大規模開発では、業務チームの設計進捗や資料の不足に関係なく、単体性能試験の準備期限が来ます。</p>
<p>今回の事例では、基盤側でSQLマップ・エンティティ定義・想定件数から一次候補を抽出し、設計指針、実施要領、付与検討表、インデックス定義書を用意しました。先行設計の結果は、資料の時点と前提を明記して業務チームへ引き継ぎ、説明会での指摘を受けて判定と手順を直しています。最終的な有効性は、Oracle 19cの実行計画と実績値で確かめる前提です。</p>
<h3>所感</h3>
<p>振り返ると、一番の収穫は、試験に入る時点で「なぜこの索引があり、なぜこの表にはないのか」を説明できる状態を作れたことです。単体性能試験で遅いSQLが出ても、付与検討表を見れば、当時の前提と判断理由に戻れます。前提が変わっていれば判断を更新し、変わっていなければ実行計画を見て原因を絞り込む。手戻りをゼロにはできなくても、手戻りの範囲は小さくできます。</p>
<p>指針も最初から完成していたわけではなく、説明会の指摘を受けて判定と手順を直しました。完璧な規約を目指して止まるより、たたき台を出して業務側の知見を取り込み、同じ版を全員で使う。大規模開発のインデックス設計は、この進め方が現実的だと考えています。</p>
<hr />
<p><strong>参考資料（Oracle公式）</strong></p>
<ul>
<li><a rel="noopener" href="https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/index.html" target="_blank">Oracle Database 19c SQL Tuning Guide</a></li>
<li><a rel="noopener" href="https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/query-optimizer-concepts.html" target="_blank">Query Optimizer Concepts：選択性・カーディナリティ</a></li>
<li><a rel="noopener" href="https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/optimizer-statistics-concepts.html" target="_blank">Optimizer Statistics Concepts：Clustering Factorなど</a></li>
<li><a rel="noopener" href="https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_XPLAN.html" target="_blank">DBMS_XPLAN：DISPLAY_CURSOR</a></li>
<li><a rel="noopener" href="https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-indexes.html" target="_blank">Managing Indexes：Invisible Indexなど</a></li>
<li><a rel="noopener" href="https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/Licensing-Information.html" target="_blank">Database Licensing Information：Automatic Indexingの利用条件</a></li>
</ul>
<p><strong>関連記事</strong></p>

<a href="https://sys-univ.com/dev/db-physical-design/" title="データベースの物理設計とは？設計項目・進め方・容量見積の実務をOracle 19cで解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-376x212.png 376w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f.png 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">データベースの物理設計とは？設計項目・進め方・容量見積の実務をOracle 19cで解説</div><div class="blogcard-snippet internal-blogcard-snippet">データベースの物理設計とは？設計項目・進め方・容量見積をOracle 19cで解説。大手SIer20年超の基盤SEが、実案件の物理設計書・課題管理表をもとに、暫定見積、PROCESSES算定、Data Guard設計の実例を紹介します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.10.21</div></div></div></div></a>

<a href="https://sys-univ.com/dev/database-engineer-dba/" title="データベースエンジニア（DBA）の仕事｜止めない、失わない、遅くさせない" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-500x281.jpg 500w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-800x450.jpg 800w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-300x169.jpg 300w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-768x432.jpg 768w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-1536x864.jpg 1536w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384-376x212.jpg 376w, https://sys-univ.com/wp-content/uploads/2026/08/251be8c60a42d58dcec6615bfa7aa384.jpg 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">データベースエンジニア（DBA）の仕事｜止めない、失わない、遅くさせない</div><div class="blogcard-snippet internal-blogcard-snippet">データベースエンジニア（DBA）は何をする職種なのか。Oracle DBAの実務経験をもとに、物理設計・構築、性能と容量管理、権限・監査、監視、バックアップ、障害復旧、データ移行まで、構築後も続く仕事と責任をわかりやすく解説します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.03</div></div></div></div></a>
<div style="border: 2px solid #1D9E75; border-radius: 8px; padding: 10px 14px; margin: 16px 0; background: #f3fbf8;">
<p style="margin: 0 0 4px; font-weight: bold; color: #1d9e75;">この記事の裏側をnoteに書きました</p>
<p style="margin: 0 0 6px;">「性能は基盤でしょ」という空気の中で、押し付け合いになっていたインデックス設計をなぜ引き受けたのか。その経緯と立ち回りは、noteの体験記にまとめています。</p>
<p style="margin: 0;"><a rel="noopener" style="color: #1d9e75; font-weight: bold;" href="https://note.com/k_s7906/n/nb36fa31acbfc" target="_blank">「性能は基盤でしょ」――誰もやらないインデックス設計を引き受け、主導権を握った話 →</a></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://sys-univ.com/dev/oracle-index-design/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>データベースエンジニア（DBA）の仕事｜止めない、失わない、遅くさせない</title>
		<link>https://sys-univ.com/dev/database-engineer-dba/</link>
					<comments>https://sys-univ.com/dev/database-engineer-dba/#respond</comments>
		
		<dc:creator><![CDATA[ナギ]]></dc:creator>
		<pubDate>Mon, 03 Aug 2026 01:58:15 +0000</pubDate>
				<category><![CDATA[システム開発]]></category>
		<guid isPermaLink="false">https://sys-univ.com/?p=2967</guid>

					<description><![CDATA[システム開発には、アプリケーション、AP基盤、システム基盤・クラウド、ネットワーク、データベースなど、異なる専門性を持つエンジニアが関わります。 本記事では、その中からデータベースエンジニア（DBA）を取り上げます。 S [&#8230;]]]></description>
										<content:encoded><![CDATA[<p id="ed38853a-b8d4-4974-856e-26f9d8d542eb" data-pm-slice="0 0 []">システム開発には、アプリケーション、AP基盤、システム基盤・クラウド、ネットワーク、データベースなど、異なる専門性を持つエンジニアが関わります。</p>
<p id="34bc1610-b1b3-455f-bee8-1ac8f8628093">本記事では、その中からデータベースエンジニア（DBA）を取り上げます。</p>
<p id="5c83bd3a-1ce7-49be-844c-5b31ee08bfa7">SEの職種全体と、それぞれの役割の違いについては、次の記事で詳しく解説しています。</p>

<a href="https://sys-univ.com/dev/se-roles/" title="システムエンジニアの種類と仕事内容｜SIerのSEはどこまで担当するのか" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/08/7fd644122c90897b53c2b78aa79a1438-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/08/7fd644122c90897b53c2b78aa79a1438-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/08/7fd644122c90897b53c2b78aa79a1438-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/08/7fd644122c90897b53c2b78aa79a1438-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/08/7fd644122c90897b53c2b78aa79a1438-376x212.png 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">システムエンジニアの種類と仕事内容｜SIerのSEはどこまで担当するのか</div><div class="blogcard-snippet internal-blogcard-snippet">システムエンジニアの種類と仕事内容を、PM、アプリ、AP基盤、インフラ、ネットワーク、DBに分けて解説。大手SIerで20年以上働いた筆者の経験から、SEのキャリアの広がりや求められるスキルも紹介します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.25</div></div></div></div></a>
<h2 id="9ae77cac-f7f2-4ebd-8be5-7da44b01b289">データベースエンジニアとは</h2>
<p id="71e28162-4bc9-49d4-95fe-86a5494c4e75">データベースエンジニアは、システムが扱うデータを安全に保存し、必要なときに正しく、十分な速度で利用できるデータベースを設計、構築、運用する職種です。</p>
<p id="ed434adb-7a9e-4193-a838-b789243df892">「データベースエンジニア」という言葉から、テーブル設計やデータモデリングを想像する人もいると思います。私が関わってきたSIerのプロジェクトでは、データベースの構築、性能管理、権限管理、監視、バックアップ、障害対応を担うDBA（データベース管理者）を指すことが一般的でした。</p>
<p id="820f2439-da08-432b-8676-ca0b59d5f0e2">ここからは、長く担当してきたOracle DBAの実務を軸に、物理設計、構築、性能管理、セキュリティと監査、運用、復旧を見ていきます。製品ごとにアーキテクチャや実装方法は異なりますが、DBAに求められる基本的な役割と考え方には共通する部分があります。</p>
<p id="870652b6-e8c9-4b22-b9bc-72c7d347af9e">DBAの中心的な役割は、論理的に整理されたデータモデルを、安定して稼働できる物理構成へ落とし込むことです。データベース製品をインストールして初期設定するだけではありません。アプリケーションが扱うデータ量、処理量、同時実行数、更新頻度、障害時の復旧要件を踏まえ、業務特性に合った物理構成と運用方式を設計します。</p>
<p id="b64e174f-91f9-4da4-b8ac-da8d9a17c307">ここでいうデータモデルは、顧客、契約、申請、承認など、業務で扱う情報を整理し、どのような単位で管理するのかを定めたものです。この構造を設計する作業をデータモデリングと呼びます。業務要件やアプリケーションの処理と密接に関わるため、概念モデルや論理モデルの作成は、アプリケーション側が中心になることが多い領域です。</p>
<p id="410af263-8506-492c-af70-edfbc0f9e31e">DBAも、完成したデータモデルを受け取るだけではありません。正規化の妥当性、テーブルや列の構成、主キーや外部キー、インデックス、データ量、検索や更新の特性を確認し、性能や運用の観点からレビューや助言を行います。</p>
<p id="ccec9bed-a517-4fba-ad69-2d3099d2eea0">テーブル設計は、稼働後に変更すると、SQL、画面、バッチ、外部システムとの連携、データ移行、テストまで広い範囲へ影響します。将来のデータ増加や機能追加も見据え、物理設計へ進む前の段階からDBAが関わることが重要です。</p>
<p id="46509602-ef97-4dee-b328-d8daae788bf0">主な担当領域は、大きく次のように分けられます。</p>
<p id="826b1d7f-39d5-422d-ab6f-a4dcd5187587"><strong>構築と物理設計</strong></p>
<ul id="da7daca7-ae24-4723-8842-4ce385bcb2f5">
<li>
<p id="1c7d0b77-6469-42bc-86c9-d3371734b25f">データベース製品と構成の選定</p>
</li>
<li>
<p id="add187d7-1cb1-4302-902b-360b65451c38">インストールと初期設定</p>
</li>
<li>
<p id="a5787a25-5de1-4650-bd48-1bf23338e9a3">表領域、データファイル、ログ領域の設計</p>
</li>
<li>
<p id="7626998f-97ae-4b72-9182-c7f51f672e9f">各種初期化パラメータの設計</p>
</li>
</ul>
<p id="607b0281-22bc-44a8-92b2-2eb26ef11ce8"><strong>性能と容量管理</strong></p>
<ul id="dbc7bf46-f0fb-4603-ae1d-640ac21eed1c">
<li>
<p id="bbcc9394-8fe6-4a6e-82d7-d9f2c3fe36ba">SQLと実行計画の分析</p>
</li>
<li>
<p id="4046e458-f628-431b-95e1-4a3065580f3c">インデックスや統計情報の管理</p>
</li>
<li>
<p id="5eae9ecf-b058-4fe0-9e86-6a518ce63b15">性能チューニング</p>
</li>
<li>
<p id="d6c896bb-1f04-4e82-ba0e-3c0823a40e52">データ容量と増加量の見積もり</p>
</li>
</ul>
<p id="9119926e-e27a-4974-ae58-548c46988f44"><strong>セキュリティと運用</strong></p>
<ul id="de552652-4d6c-4dc6-ba3f-c908d8762360">
<li>
<p id="ffae8a7c-a129-4a79-a336-5f69a5f6b220">ユーザー、権限、ロールの設計</p>
</li>
<li>
<p id="eeb76818-7160-4934-8c69-af380b724dc2">監査要件への対応</p>
</li>
<li>
<p id="8e3f47c9-8c60-49d9-9361-8f7b404fe6ab">監視とログ管理</p>
</li>
</ul>
<p id="b15f5598-3c25-4c5e-bf1e-b593e3ec77ba"><strong>可用性とデータ保護</strong></p>
<ul id="bc5d3784-3428-4e22-885d-315e53da75c7">
<li>
<p id="bbe45ff2-d93d-451d-95dd-7d6f7edb3e0e">冗長化と障害時の切り替え</p>
</li>
<li>
<p id="c5c8f3d1-4f24-420e-9ee6-87e486ba4b3f">バックアップとリカバリの設計</p>
</li>
</ul>
<p id="cbbd7e14-1723-430d-8318-d8a702e37be1"><strong>移行と製品管理</strong></p>
<ul id="70c91fcc-8a68-4a9a-b61d-9a2c0e7d9a1e">
<li>
<p id="b1871071-8f05-43d5-ac6c-48660ca03fb9">システム移行（データ・環境・運用）</p>
</li>
<li>
<p id="aaa85d81-7c79-4379-bbf1-207db4493436">バージョンアップや製品更改</p>
</li>
<li>
<p id="6150f8ed-7b61-4fe1-a30b-3589c209d24b">ライセンスと保守契約の管理</p>
</li>
</ul>
<p id="dd1e74be-65a8-4477-9f26-2dec06fe384b">製品ごとに仕組みや用語は異なりますが、アプリケーションの特性を踏まえて構成を決め、稼働後も性能、セキュリティ、可用性、復旧を管理するという役割は共通しています。</p>
<h2 id="16de4f87-aac1-4d3f-9613-79a3f009cf77">アプリケーションの特性から物理構成を設計する</h2>
<p id="4aa5636c-2739-4165-8e01-77b26d9b730c">データベースの構築は、アプリケーションの処理内容を理解しなければ始められません。</p>
<p id="6b952cb5-f2c1-4f4e-91d7-6e8d60b8456a">どの程度のデータを登録し、どの時間帯に更新が集中するのか。長時間の検索、大量更新、夜間バッチなどがあるのか。アプリケーションの処理特性によって、必要なデータベース構成は変わります。</p>
<p id="28fb3e74-3349-4fd2-9ba6-151201182574">Oracleでは、REDOログのグループ数やサイズ、UNDO表領域の容量と保持期間、各表領域の初期容量や自動拡張の可否などを決めます。これらは、製品の標準値をそのまま採用すればよいものではありません。</p>
<p id="02cb895e-1c47-4baa-8ebe-88eb41aaadfc">更新量に対してREDOログが小さすぎれば、ログスイッチが頻発し、チェックポイント処理の負荷も高まります。次に使用するロググループのチェックポイントやアーカイブが完了していなければ、更新処理に待機が発生することもあります。</p>
<p id="f5a566cb-2fc1-46d6-9c00-f92a386c4bc8">長時間の検索や大量更新に対してUNDO領域の容量や保持期間が不足すると、読み取り一貫性に必要な過去のデータを保持できません。ORA-01555（スナップショットが古すぎます）などによって、検索処理が失敗することもあります。</p>
<p id="7b5a9009-48a9-4696-ab0b-919bb95a7f51">表領域の容量や拡張方法が不適切であれば、データの増加によって業務処理が停止する可能性があります。</p>
<p id="2bf4c79a-a9fb-48d7-8a90-f044e680b73d">容量の見積もりは、初期構築時だけの作業ではありません。どの表が月次や年次でどれだけ増えるのかをアプリケーションチームから引き出し、拡張の余地とストレージの追加時期まで計画に落とします。</p>
<p>こうしたデータベースの物理設計では、設定値を決めること以上に、<strong>何を検討し、どのような根拠で判断するか</strong>が重要です。</p>
<p>具体的な設計項目や進め方については、実際のプロジェクトの容量見積や課題管理の事例をもとに次の記事で詳しく解説しています。</p>

<a href="https://sys-univ.com/dev/db-physical-design/" title="データベースの物理設計とは？設計項目・進め方・容量見積の実務をOracle 19cで解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f-376x212.png 376w, https://sys-univ.com/wp-content/uploads/2026/10/f8d6d335027302b6a0a0636e1df7f27f.png 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">データベースの物理設計とは？設計項目・進め方・容量見積の実務をOracle 19cで解説</div><div class="blogcard-snippet internal-blogcard-snippet">データベースの物理設計とは？設計項目・進め方・容量見積をOracle 19cで解説。大手SIer20年超の基盤SEが、実案件の物理設計書・課題管理表をもとに、暫定見積、PROCESSES算定、Data Guard設計の実例を紹介します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.10.21</div></div></div></div></a>
<h2 id="974462ee-ab0a-4323-a37d-d7290017b676">DBAが押さえるべきシステム移行の三要素</h2>
<p id="57fa808c-f45d-4a51-bf58-b8c22e88e33e">システム移行というと、旧システムのデータを新システムへ移し替える作業を想像しがちです。実際の移行は、<strong>データ移行、環境移行、運用移行</strong>の三つで構成されます。DBAはデータ移行を中心に、環境移行と運用移行にも関わります。</p>
<p id="abc0d4a8-b2ce-4912-b03c-36cbe7626113">データ移行では、移行対象、停止時間、移行方式、データ変換、移行後の確認方法を設計し、本番相当のデータ量でリハーサルを行います。移行後の統計情報が適切でなければ、データを正しく移せても、業務開始後に性能問題が発生することがあります。Oracle 19cへのバージョンアップでは、統計情報の更新を契機に実行計画が変化した事例もあり、移行後は主要なSQLの実行計画と性能まで確認する必要があります。</p>

<a href="https://sys-univ.com/dev/oracle-19c-partition-statistics-execution-plan/" title="Oracle 19c更改後に実行計画が変わる――パーティション削除時の統計情報更新と影響調査漏れ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/07/fa1d5bffc405596be4e476a9d5ce1668-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/07/fa1d5bffc405596be4e476a9d5ce1668-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2026/07/fa1d5bffc405596be4e476a9d5ce1668-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2026/07/fa1d5bffc405596be4e476a9d5ce1668-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2026/07/fa1d5bffc405596be4e476a9d5ce1668-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Oracle 19c更改後に実行計画が変わる――パーティション削除時の統計情報更新と影響調査漏れ</div><div class="blogcard-snippet internal-blogcard-snippet">Oracle Database 19cへの更改後、DROP PARTITIONを契機に表統計の一部が更新され、実行計画とSQL性能が変化した事例を解説。AWRやPLAN_HASH_VALUEによる原因調査、統計情報の再収集、SQL Plan Baseline、更改時の影響調査と試験の観点を整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.07.22</div></div></div></div></a>
<p id="bf6f2cf1-e6d0-4a02-8889-b9ca7a334771">環境移行では、データベースを構築するだけでなく、tnsnames.oraや接続文字列、DNS名などを新環境へ切り替えます。運用移行では、監視、バックアップ、ログ収集、ジョブ、障害対応などを新環境でどのように実現するのかを決めます。バージョンや提供形態が変われば、従来の運用ツールやスクリプトがそのまま動くとは限りません。</p>
<p id="9a609652-f523-4178-ba64-7e3ae45134f5">データを移し替えただけでは、システム移行は完了しません。移行の全体像と、どこで失敗が起きやすいのかは、別の記事で整理します。</p>
<h2 id="7509f8e3-02ad-43ca-85a8-6bf8f683ac5e">マネージドサービスでも設計は残る</h2>
<p id="f29dfcba-3473-49ad-bef4-05578b16c1d9">マネージドサービスを利用する場合も、この考え方は変わりません。</p>
<p id="6be8afe3-359b-4bd2-b20d-fe74371af5a7">RDSではパラメータグループを通じて設定を変更し、変更できる範囲は製品そのものより狭くなります。</p>
<p id="1e102f07-f603-4bfc-b595-1281c3542096">標準値のまま構築してよいという意味ではありません。決められる範囲が限られた中で、業務特性に合う値を選ぶ作業が残ります。</p>
<p id="3753e4ec-938e-4cd5-9cb1-d749f12d39a8">クラウドサービスが引き受けるのは、データベース運用の一部です。どのような性能が必要なのか、障害時にどこまで業務を継続するのか、どの時点までデータを戻すのかといった判断まで、クラウド側が決めてくれるわけではありません。</p>
<p id="2b0368e5-e8a8-4fb1-858b-a6e59048d24e">RDS for Oracleへ移行すると、SYSDBA権限やOSへのアクセス、ストレージ管理、監査ログの扱いなど、オンプレミスで前提としていた運用をそのまま持ち込めない場面があります。具体的な設計ギャップと代替方法は、次の記事で詳しく解説しています。</p>

<a href="https://sys-univ.com/aws/rdsforora/" title="RDS for Oracleを採用したら、オンプレ運用の前提が通用しなかった｜開発中に見えた設計ギャップと代替アプローチ" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/07/b87f444ed45d88e81401b2fbbfe2b0c1-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/07/b87f444ed45d88e81401b2fbbfe2b0c1-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/07/b87f444ed45d88e81401b2fbbfe2b0c1-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/07/b87f444ed45d88e81401b2fbbfe2b0c1-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/07/b87f444ed45d88e81401b2fbbfe2b0c1-376x212.png 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">RDS for Oracleを採用したら、オンプレ運用の前提が通用しなかった｜開発中に見えた設計ギャップと代替アプローチ</div><div class="blogcard-snippet internal-blogcard-snippet">RDS for Oracleではオンプレ運用の前提が通用しない。Storage-Full、アーカイブログ、SSH不可など、開発中に見えた9つの設計ギャップと代替アプローチを整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.30</div></div></div></div></a>
<h2 id="6124be39-b3c2-4d18-8492-7930764c60ca">データベースは構築後も変化し続ける</h2>
<p id="b12bd7b9-1e1d-4f1d-a12c-7fda9a8aa2ce">システム基盤との大きな違いの一つは、構築後も継続的な調整が必要になることです。</p>
<p id="30d30f27-8b00-4156-8e7c-dfc6a8933b24">サーバーやOSは、構築時に適切な構成を決めれば、稼働後に設定を大きく変えずに運用できるケースもあります。</p>
<p id="069afbc5-009a-49c9-b039-1128c40b29c1">データベースでは、データ量や分布、利用者数、業務処理の内容が日々変化します。昨日まで高速だったSQLが、データの増加や統計情報、実行計画の変化によって突然遅くなることもあります。</p>
<p id="73b4b517-6ce2-4bf8-9cf0-71c4f355b46f">一つのSQLを改善して終わりとは限りません。業務機能の追加やデータ量の増加によって別の処理が遅くなり、新たな実行計画の変化が発生します。</p>
<p id="42143f78-24df-4ee5-8a1f-c6cf9d8b966e">稼働後も監視、分析、改善を繰り返すのが、データベース運用の実態です。</p>
<h2 id="3a34b252-6c65-445e-925b-fc371ffe3779">性能問題はデータベースだけでは解決できない</h2>
<p id="f46719f3-b906-40df-9864-06da22a0d7db">性能問題が発生した場合、CPUやメモリの使用率を見るだけでは原因を特定できません。</p>
<p id="1776415f-a5ff-454d-9704-24d205bd89e5">遅いSQLを特定し、実行計画や待機状況を確認しながら、検索対象となるデータ量、結合順序、アクセスパス、統計情報、キャッシュの状態、I/O、ロック競合などを横断的に調べます。</p>
<p id="13d78a2c-a45b-4f7a-a9a7-fa46f1c12e8d">同じSQLでも、必要なデータがメモリ上にあるか、ストレージから読み込むかによって処理時間は変わります。過去に生成された実行計画が再利用されるか、新しい実行計画が選ばれるかによっても、性能は大きく変化します。</p>
<p id="12ecc1bc-0085-4e80-aa00-3c73b50f3916">性能問題をデータベースの設定だけで解決できるケースは、実際にはそれほど多くありません。</p>
<p id="8e04b11b-456e-4618-905c-341bff6492fc">SQLや業務ロジックそのものに原因があれば、データベース側のパラメータを変更しても根本的な改善にはなりません。</p>
<p id="b5884bf3-caad-49b8-8ed1-b55d0392de6f">改善策は、インデックスの追加や変更、統計情報の更新、必要に応じたSQLヒントの付与といったデータベース側の対応に限りません。SQLの書き換え、処理の分割、検索条件の見直し、データの持ち方の変更が必要になることもあります。</p>
<p id="6f316aee-635e-4334-b8e4-a67ade4382b2">接続数やトランザクション管理に問題があれば、AP基盤チームへコネクションプールや共通処理の修正を依頼します。</p>
<p id="4ebb28d3-773b-4e53-88bf-5a59e3739310">CPUやストレージI/Oが不足していれば、システム基盤チームとリソース増強や構成変更を検討します。業務ルールを実装した共通部品が非効率であれば、アプリケーションチームの改修が欠かせません。</p>
<figure id="01e764db-7ab8-4f76-b70b-ddf547ca06a0">
<blockquote>
<p id="fb89e981-9471-4f7d-907b-b84e92927209">私がOracle DBAを担当していたときも、性能問題が起きると、まずデータベースが疑われることが少なくありませんでした。<br />
調査を進めると、原因がSQL、業務ロジック、接続方式、共通部品、ストレージなど、別の領域にあるケースも多くありました。</p>
</blockquote><figcaption></figcaption></figure>
<p id="01ce462d-01bb-4dda-8e3e-f58058b64401">実際にあった例では、検索画面の入力にアンダースコアが含まれたことで、想定を大きく超えるデータが検索され、システムが高負荷になったことがありました。</p>
<p id="4711c883-e4da-49da-ad2f-269b3366eeb2">当時使用していたOracleのリリースでは、全角の「＿」や「％」がLIKE検索のワイルドカードとして扱われることがあり、NULL以外のほぼ全件が検索対象となっていました。</p>
<p id="00188a5a-9ece-4f7d-955b-bb7729c28c18">サポートへの照会とバージョンごとの再現試験を重ねると、旧リリース向けにエスケープ処理を入れた場合、新しいリリースへアップグレードした後には逆にエラーになることも分かりました。</p>
<p id="f4e9636f-b06f-40b6-bc86-cce8892a7cf2">最終的には、バージョンが変わっても動作が変わらない書き方をSQLコーディング規約へ反映しました。</p>
<p id="a1df8f8a-eb26-4b17-abfd-9aed78d24495">本来はアプリケーション側のSQL実装に関わる問題でも、データベースが最初に疑われ、DBAが製品仕様とSQLの両面から切り分け、再発防止まで取りまとめることがあります。</p>
<p>このLIKE検索の問題については、実際の障害対応をもとに、原因調査から対策の比較、保守サポートとの技術的な確認、SQL規約による再発防止までを次の記事で詳しく解説しています。</p>

<a href="https://sys-univ.com/dev/oracle-like-fullwidth-underscore/" title="OracleのLIKE検索でほぼ全件ヒット？全角アンダースコアの不具合とSQL改修・再発防止の実例" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c-376x212.png 376w, https://sys-univ.com/wp-content/uploads/2026/10/958c099a51bb2729a6588f08bd14d17c.png 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">OracleのLIKE検索でほぼ全件ヒット？全角アンダースコアの不具合とSQL改修・再発防止の実例</div><div class="blogcard-snippet internal-blogcard-snippet">Oracle LIKE検索で全角アンダースコア「＿」がワイルドカード化した障害事例。ORA-01424とLIKECの検証、パッチと運用回避の対策比較、保守サポートと根拠をそろえた判断を解説。19cでは全角は通常文字、半角%・_を文字として探す場合はESCAPEを使用。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.10.21</div></div></div></div></a>
<h2 id="490e96a1-f17f-48e4-9f7b-65e78c88b7d2">権限とロールはアプリケーションと切り離せない</h2>
<p id="aceec12c-f213-4c8a-8a0a-d0f05c7bec9e">権限とロールの設計も、アプリケーションとの調整が避けられない領域です。</p>
<p id="4fba3fc6-92f2-4331-85df-b54b6abfb2a3">既存システムを引き継いだとき、アプリケーションのスキーマにDBA相当のロールがそのまま付与されていたことがありました。</p>
<p id="e2afc2c0-3a04-454a-97e3-e4a6d386be82">セキュリティ要件の観点で認められる状態ではなく、必要な権限だけを個別に付与する形へ絞り込むことになりました。</p>
<p id="559590cd-0c1b-4795-965e-ec7aa66f8632">権限を外した結果、これまで動いていた処理が動かなくなりました。どの処理がどのオブジェクトへどう触れているのかを整理した資料はアプリケーションチームにも残っておらず、発生したエラーと処理を突き合わせながら、必要な権限を一つずつ特定していく作業になりました。</p>
<p id="8d4de74f-3382-4820-bee7-fe4cf7df8c11">権限を細かく制限するほど、影響確認と試験にも相応の工数がかかります。</p>
<p id="a228bc66-0897-4f02-9350-6e1496042171">マネージドサービスでは、この制約がさらに強くなります。</p>
<p id="1d1ca266-4bd1-49bc-af7e-7cf91ccf23e9">RDS for OracleではSYSDBA権限そのものが提供されず、管理操作は用意されたパッケージ経由に限定されます。オンプレミスで当たり前に実行していた手順が使えない前提で、権限の設計と運用手順を組み立て直す必要があります。</p>
<h2 id="f0202de3-2cc7-4c18-9497-f9682195b3a5">監査ログは出せばよいわけではない</h2>
<p id="2b9c1601-6eab-4aa4-bbe0-a7514264b425">監査も、要件を満たす設定を入れれば終わりという作業ではありません。</p>
<p id="46c903e3-3f82-45c0-91af-2b60568c189a">とりあえず監査ログを出力する設定にしたところ、膨大な量のログが出力され、何を監査対象とするのかを決める作業の方が大変でした。</p>
<p id="5fce93af-e2a4-4bc4-9e5d-7f73da536454">すべてのSQLを記録すれば、性能とストレージへ影響します。絞りすぎれば、問題が起きたときに誰が何をしたのか説明できません。</p>
<p id="b49ed1ad-e734-4be5-b3b3-999d423874d2">特定のテーブルへのアクセスだけを対象にするのか、更新だけでなく参照まで含めるのか、保持期間をどれだけにするのかを、業務要件と法令要件の両面から決めます。</p>
<p id="55f7ba87-f1dc-48d4-a1a6-dab5712e133c">個人情報や決済に関わるデータでは、誰がいつどのデータへ触れたのかを後から説明できることが求められます。</p>
<p id="e41f9514-b806-4d24-9db6-c9573bec9a28">共通のアプリケーションユーザーで接続していれば、データベース側の記録だけでは実際の利用者までたどれません。</p>
<p id="911b05f5-f16b-4c9a-852a-7f0636de7a2f">アプリケーションのログと突き合わせて追跡できる設計にするのか、クライアント識別情報をデータベースへ渡してもらうのかを、アプリケーションチームと事前に決めておく必要があります。</p>
<p id="8e91c426-86c6-44e6-b52a-eb1bfc41b7fe">監視も、稼働状況を眺めるためのものではありません。</p>
<p id="ad849108-d5f4-4891-8a90-29339b1990eb">表領域の使用率と増加傾向、権限の変更、想定外の接続元、監査ログが想定どおり出力・保管されているかなど、業務が止まる前に気づくべき事象と、後から説明を求められる事象の両方を対象にします。</p>
<h2 id="260836b5-32c2-45bd-96e8-7b55c77aa0b5">冗長化しても業務を継続できるとは限らない</h2>
<p id="a1b7a46b-e3db-457a-86e7-1eeb4d71b041">データベースの可用性を高めるには、障害が発生してからデータを復旧するだけでなく、待機系へ切り替えて業務を継続できる構成も設計します。</p>
<p id="aad08d40-1fd7-431f-95cd-391d504bdf40">オンプレミスではRACやData Guard、クラウドではRDSのMulti-AZなど、障害の範囲、許容停止時間、許容できるデータ損失、費用に応じて方式を選びます。</p>
<p id="f95588c3-6ddd-4c90-a967-0ec3cb638af5">冗長化構成を用意しても、データベースが待機系へ切り替わるだけで業務を継続できるとは限りません。</p>
<p id="a04bd22f-0967-4e58-a6bf-184566f38b38">アプリケーションの再接続、接続プールの回復、DNSキャッシュ、切り替え中に失敗した処理の扱いまで含め、システム全体の復旧動作を設計します。</p>
<p id="f4020eef-6f3a-436e-bc32-d694492ec558">私が担当したシステムでは、正常時の通信遅延を抑えるため、WebサーバーとAPサーバーをRDSのプライマリと同じAZ側へ寄せて稼働させていました。正常時の性能を優先しつつ、障害時にはRDSが別のAZへ切り替わることを前提とした構成です。</p>
<p id="4dea993f-de08-4ef5-939b-c603cdc15140">RDSが別のAZへフェイルオーバーすると、Web／APサーバーとデータベースの通信がAZをまたぐ場合があります。通信経路が変わればレイテンシーも変化し、データベースアクセスの多い業務では性能へ影響する可能性があります。</p>
<p id="fa0bc9ac-6433-4f1f-b1d5-566b152e3051">確認すべきなのは、フェイルオーバーが成功したかどうかだけではありません。RDSが反対側のAZへ切り替わった状態でも、オンライン処理の応答時間やバッチ処理時間が要件内に収まるのかを試験します。</p>
<p id="94c5cdeb-6068-40ce-93a4-4e49ff75fc28">通常時と同じ性能を維持できない場合には、あらかじめ定めた縮退運転の条件で業務を継続できることまで確認します。Web／APサーバーを別AZ側へ切り替える構成であれば、アプリケーションとデータベースを同じAZ側で動かせるかも検証対象です。</p>
<p id="b61df7c4-9898-436b-90fc-60f45dc830e8">RDS Multi-AZで自動化されるのは、データベース側の待機系への切り替えです。その後にアプリケーションが正常に再接続し、性能要件や縮退要件を満たして業務を再開できるかは、利用者側で設計し、試験しなければなりません。</p>
<h2 id="0fddbcd1-5c37-409e-9d31-fcaa7bb140d0">バックアップがあっても復旧できるとは限らない</h2>
<p id="df8b22f4-4613-4a25-aca3-828ca8fe6300">データベースに障害が発生すれば、システム全体が停止したり、複数の業務が同時に利用できなくなったりする可能性があります。データの破損や消失が起きれば、サーバーを再起動するだけでは復旧できません。</p>
<p id="6afe1257-d800-41b0-866f-a175f0494b21">重要なのは、どの時点まで戻すのかという要件を、事前にアプリケーションチームと合意しておくことです。</p>
<p id="7dde3dbe-7f54-44a4-8d92-6fe327067f88">前日の夜間バックアップまで戻してよいのか、障害の直前まで戻す必要があるのか。直前まで戻す要件があるなら、アーカイブログモードで運用し、アーカイブログの出力先、退避方法、保持期間まで設計に含めます。</p>
<p id="959c3844-9102-458b-ad90-3866fc860963">判断が難しいのは、夜間バッチの途中で障害が発生した場合です。</p>
<p id="4dc62c60-8a6f-439e-93a4-33ccd7e883b5">どのジョブまで完了していたのか、どこまで戻せば再実行できるのか、中途半端な状態で残ったデータをどう扱うのかは、データベース側だけでは決められません。</p>
<p id="16c6832e-8ad1-45ef-9ba5-e35bbe08ca3a">復旧の目標時間と、戻した後に業務をどの順番で再開するのかを含めて、アプリケーションチームと一緒に決めます。バックアップを取得しているだけでは不十分です。</p>
<p id="4c3ebfe7-144f-4863-9233-e89cf2bd5a44">データファイルが壊れた場合、誤って大量のデータを削除した場合、バッチの途中で停止した場合では、手順も所要時間も変わります。</p>
<p id="7bc7769b-8cf4-4a56-a122-ad099a027b85">ユースケースごとに、実際にリストアとリカバリを実施します。本当に戻るのか、目標時間内に終わるのか、戻した後にアプリケーションが正しく動くのかを、アプリケーションチームと合同で確認しておきます。</p>
<h2 id="c10aaab3-ab3c-4173-a0b7-9011826864ac">RDSの復元は元のインスタンスを巻き戻す処理ではない</h2>
<p id="c4734868-12ff-4493-a90a-cc213807c79a">マネージドサービスを利用する場合も、復旧方法を事前に決めておく必要があります。</p>
<p id="35db3d49-f0dc-4543-a1ce-c87ffd12e865">RDSのポイントインタイムリカバリでは、バックアップ保持期間内の任意の時点へ復元できます。直近については制約があります。トランザクションログは通常5分間隔でAmazon S3へアップロードされるため、指定できる最新の復元時点は現在時刻より数分前になることがあります。実際に復元可能な最新時点は、LatestRestorableTimeで確認します。</p>
<p id="c749523b-34bc-441c-b803-178432faa778">注意が必要なのは、指定した時点の状態が新しいDBインスタンスとして作成され、元のインスタンスが巻き戻るわけではないことです。</p>
<figure id="634e42c1-700a-4865-8d42-9830b1e70a61"><img loading="lazy" decoding="async" contenteditable="false" draggable="false" src="https://assets.st-note.com/img/1785572618-JnB0wTWSHC5sMQiV94ubgt7X.png" alt="" width="620" height="349" /><figcaption></figcaption></figure>
<p id="d1c678a7-02a9-43e9-bbfb-f07083800ffe">復旧時間には、新しいインスタンスの作成だけでなく、DB接続先情報の変更やDNSの切り替え、接続確認に要する時間も含まれます。</p>
<p id="f752402d-0921-46c5-bdad-9aa118b867bd">アプリケーションがRDSのエンドポイントを直接参照するのか、DNS名で接続先を抽象化するのかを含め、切り替え方式を事前に設計しておかなければ、復旧目標時間には収まりません。</p>
<p id="de3965b1-5a72-402f-95cd-c8db68b06d9c">旧インスタンスをいつ削除するのか、切り戻せる状態をどこまで残すのかも決めておきます。また、復元できる単位にも制約があります。</p>
<p id="9e37c588-5d58-4323-b10e-90ec8760a682">この復元方式では、DBインスタンス全体が新しいインスタンスとして作成されます。既存のDBインスタンスを過去の状態へ戻したり、特定のテーブルだけを1時間前の状態へ戻したりする機能ではありません。</p>
<p id="eef9dd70-c4f3-401d-9481-23bcc207f208">誤更新への対応では、復元した別インスタンスから対象データを抽出して取り込むなど、別の方式を組み合わせる必要があります。</p>
<h2 id="9652ba2b-d914-4d8a-a73b-faeea5c2ad58">データベース製品によって、アーキテクチャと設計上の判断は変わる</h2>
<p id="b7064ddc-6627-4d98-87ab-a51862d7a930">以上、Oracleを主な例として説明しました。</p>
<p id="c00cabd1-2a1a-400a-9003-bc96c187a099">近年は、一つのシステムでも、業務データにはリレーショナルデータベース、ログや非定型データには別のデータストアを利用するなど、用途に応じて複数の製品を組み合わせる構成も増えています。</p>
<p id="6e7fb060-6145-403d-bddd-fba6129639ad">OSはAmazon LinuxからRed Hat Enterprise Linuxへ変わっても、プロセス、メモリ、ファイルシステム、権限管理など、基本的な仕組みや設計の考え方には共通する部分があります。データベースは、製品の種類が変わると設計思想そのものが大きく変わることがあります。</p>
<p id="9e0ecf51-02df-45f8-9d99-0fca79bd8035">同じリレーショナルデータベースでも、Oracle、PostgreSQL、MySQLでは、運用機能、可用性構成、拡張方式、チューニングの考え方に違いがあります。OracleとMongoDBのようなドキュメント指向データベースであれば、データの持ち方、整合性の考え方、検索方法、拡張方式まで異なります。</p>
<p id="d119edbc-d4e0-4b0a-8678-53dbdba52683">製品が変わっても、DBAに求められる基本的な役割や考え方には共通する部分があります。変わるのは、その役割を実現するためのアーキテクチャ、機能、制約、管理方法です。</p>
<p id="bbef96e6-0803-47e6-9624-882c82ea05fa">操作方法だけでなく、データモデルやトランザクション、可用性、性能設計の前提から学び直さなければならないこともあり、ここにDBAという職種の難しさがあります。</p>
<h2 id="551f4ca6-3d21-483f-8907-590a4c044d80">まとめ</h2>
<p id="08b31b87-242e-488d-b815-11381c16a07b">DBAは、データベース製品を構築するだけの担当者ではありません。</p>
<p id="be392c2e-30bd-409e-a881-4523fc2e09c7">アプリケーションの処理を理解して性能問題の原因を横断的に分析し、権限や監査の要件を業務と擦り合わせ、障害が起きてもデータを失わずに業務を再開できる状態を維持し続ける役割です。</p>
<p id="43dce8e9-4c97-4071-a687-16ccea5f5632">構築が終わっても仕事は終わらず、性能問題や障害が起きれば、DBAが原因分析と関係チームの調整の中心に立ちます。</p>
<p id="d2af53a4-cc08-4bae-bf7b-e21c65e93f17">データ量が増えても必要な性能を保ち、稼働後もデータの安全性と業務継続を支える。その責任を担いながら、採用する製品や要件の変化に応じて知識を更新し、新しい設計思想へ適応し続けるところに、DBAの専門性があります。</p>
<p id="301d5a58-9dd4-4bc8-9149-140551c28818"><strong>関連記事</strong></p>
<p id="60ad32b2-1082-42db-b7d0-53e06c3de7d4">システム開発では、データベースエンジニアだけで仕事が完結することはありません。 アプリケーション、ネットワーク、システム基盤など、それぞれの担当が連携してシステム全体を作ります。</p>
<p id="2297d0fc-61f1-410b-9d3e-ae6f6f580cea"><strong>アプリケーションエンジニアの仕事</strong><br />
業務要件を仕様へ落とし込み、設計・実装・テスト・障害対応まで担当するアプリケーションエンジニアの仕事を解説しています。</p>

<a href="https://sys-univ.com/dev/application-engineer/" title="アプリケーションエンジニアの仕事｜決める、そろえる、動かし続ける" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf-500x281.jpg 500w, https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf-800x450.jpg 800w, https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf-300x169.jpg 300w, https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf-768x432.jpg 768w, https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf-1536x864.jpg 1536w, https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf-376x212.jpg 376w, https://sys-univ.com/wp-content/uploads/2026/08/ad98a3ef5d9f4217bfc19895031dc0cf.jpg 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">アプリケーションエンジニアの仕事｜決める、そろえる、動かし続ける</div><div class="blogcard-snippet internal-blogcard-snippet">アプリケーションエンジニアの仕事内容を、SIerでの実務経験をもとに解説。曖昧な要望を仕様へ変換する設計、画面・帳票・バッチ・API、テスト、性能問題、障害対応まで、担当範囲と責任を具体例で整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.05</div></div></div></div></a>
<p id="a49450ff-9ad9-426c-8aa1-e3a095ad9b6d"><strong>ネットワークエンジニアの仕事<br />
</strong>通信経路、ルーティング、通信制御、冗長化、外部ネットワーク接続、障害時の切り分けなど、ネットワークエンジニアの仕事を解説しています。</p>

<a href="https://sys-univ.com/dev/dev-network-engineer/" title="ネットワークエンジニアの仕事｜通す、通さない、切り替える" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/08/c77c568738dbd613fcd1672710f63809-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/08/c77c568738dbd613fcd1672710f63809-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/08/c77c568738dbd613fcd1672710f63809-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/08/c77c568738dbd613fcd1672710f63809-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/08/c77c568738dbd613fcd1672710f63809-376x212.png 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">ネットワークエンジニアの仕事｜通す、通さない、切り替える</div><div class="blogcard-snippet internal-blogcard-snippet">ネットワークエンジニアの仕事内容を、通信経路、VLAN、ルーティング、ファイアウォール、冗長化、外部ネットワーク接続、障害切り分け、AWSまで実務経験をもとに解説します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.11</div></div></div></div></a>
<div id="gtx-trans" style="position: absolute; left: -13px; top: 7235.48px;">
<div class="gtx-trans-icon"> </div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://sys-univ.com/dev/database-engineer-dba/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>データベースの物理設計とは？設計項目・進め方・容量見積の実務をOracle 19cで解説</title>
		<link>https://sys-univ.com/dev/db-physical-design/</link>
					<comments>https://sys-univ.com/dev/db-physical-design/#respond</comments>
		
		<dc:creator><![CDATA[ナギ]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 05:08:01 +0000</pubDate>
				<category><![CDATA[システム開発]]></category>
		<guid isPermaLink="false">https://sys-univ.com/?p=3495</guid>

					<description><![CDATA[データベースの物理設計と聞いて、具体的に何を検討し、どのような根拠で設計値を決めればよいのか、迷うシステムエンジニアは少なくないのではないでしょうか。 実際のプロジェクトでは、Oracleのデフォルト設定をほぼそのまま使 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">データベースの物理設計と聞いて、具体的に何を検討し、どのような根拠で設計値を決めればよいのか、迷うシステムエンジニアは少なくないのではないでしょうか。</p>
<p>実際のプロジェクトでは、Oracleのデフォルト設定をほぼそのまま使用し、表領域の初期容量を決めて自動拡張を有効にするだけで、データベースを構築しているケースも見受けられます。しかし、データが格納でき、システムが正常に動作することと、性能・可用性・運用性まで考慮した物理設計ができていることは別です。</p>
<p>物理設計で重要なのは、設定値そのものではなく、業務特性やデータ量、アクセス傾向、将来の増加量などを把握し、<strong>何を検討し、どのような根拠で判断し、どう検証するか</strong>というプロセスです。</p>
<p>本記事では、実際のプロジェクトで使用した物理設計書、課題管理表、容量見積Excelをもとに、データベースの物理設計で押さえるべき検討項目と、設計を進めるための具体的なアプローチを解説します。技術解説にはOracle Database 19cを使用し、容量見積や接続数の算定、性能・運用面での設計判断を実例とともに紹介します。</p>
<p>なお、実務事例は過去のプロジェクト資料を匿名化・再構成したものであり、掲載する設定値は案件固有のものです。個々の数値を正解として示すのではなく、<strong>自分のプロジェクトで適切な設計値にたどり着くための考え方</strong>を伝えることを目的としています。</p>


<h2 class="wp-block-heading">データベースの物理設計とは？</h2>


<p class="wp-block-paragraph">データベースの物理設計とは、論理設計で定義されたデータを、実際のデータベース環境にどのように格納し、安定して稼働させるかを具体化する工程です。</p>


<p class="wp-block-paragraph">表領域やデータファイル、メモリ、REDOログ、バックアップなどを設計し、性能・容量・可用性・運用性に関する要件を実現します。</p>


<h3 class="wp-block-heading">概念設計・論理設計・物理設計の違い</h3>


<p class="wp-block-paragraph">データベース設計は、大きく概念設計・論理設計・物理設計の3段階に分けられます。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>設計工程</th>
<th>主な内容</th>
<th>成果物の例</th>
</tr>
</thead>
<tbody>
<tr>
<td>概念設計</td>
<td>業務に必要な情報とその関連を整理する</td>
<td>概念ER図</td>
</tr>
<tr>
<td>論理設計</td>
<td>テーブル、カラム、主キー、外部キーなどを定義する</td>
<td>論理ER図、テーブル定義書</td>
</tr>
<tr>
<td>物理設計</td>
<td>DB製品の仕様や非機能要件に合わせて格納方式と稼働環境を具体化する</td>
<td>物理設計書、パラメータ一覧、容量見積書</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">例えば、注文データを5年間保存するシステムを考えます。</p>


<p class="wp-block-paragraph">論理設計では注文テーブルの項目やキー、テーブル間の関連を定義します。</p>


<p class="wp-block-paragraph">一方、物理設計では、初期データ120万件、年間増加30万件という条件から5年後の件数を270万件と見積もり、必要な表領域容量、データファイルの拡張方法、バックアップ方針などを決めます。</p>


<p class="wp-block-paragraph">つまり、論理設計が「どのようなデータを管理するか」を決める工程であるのに対し、物理設計は「そのデータをどのような構成で稼働・管理するか」を具体化する工程です。</p>


<h3 class="wp-block-heading">物理設計は誰が担当するのか</h3>


<p class="wp-block-paragraph">物理設計は、インフラエンジニア、DBA、アプリケーション担当者が連携して進めます。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>担当</th>
<th>主な設計範囲</th>
</tr>
</thead>
<tbody>
<tr>
<td>インフラエンジニア</td>
<td>サーバ、OS、ストレージ、DB構成、可用性、バックアップ基盤</td>
</tr>
<tr>
<td>DBA</td>
<td>表領域、初期化パラメータ、REDOログ、メモリ、権限、DB運用</td>
</tr>
<tr>
<td>アプリケーション担当</td>
<td>テーブル構造、索引、パーティショニング、SQLアクセス特性</td>
</tr>
<tr>
<td>パッケージ・ミドルウェアベンダー</td>
<td>製品固有のDB要件、専用スキーマ、必要テーブル、接続方式</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">担当領域の違いや連携については、以下の記事で詳しく解説しています。</p>

<a href="https://sys-univ.com/dev/se-roles/" title="システムエンジニアの種類と仕事内容｜SIerのSEはどこまで担当するのか" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/08/7fd644122c90897b53c2b78aa79a1438-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/08/7fd644122c90897b53c2b78aa79a1438-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/08/7fd644122c90897b53c2b78aa79a1438-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/08/7fd644122c90897b53c2b78aa79a1438-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/08/7fd644122c90897b53c2b78aa79a1438-376x212.png 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">システムエンジニアの種類と仕事内容｜SIerのSEはどこまで担当するのか</div><div class="blogcard-snippet internal-blogcard-snippet">システムエンジニアの種類と仕事内容を、PM、アプリ、AP基盤、インフラ、ネットワーク、DBに分けて解説。大手SIerで20年以上働いた筆者の経験から、SEのキャリアの広がりや求められるスキルも紹介します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.25</div></div></div></div></a>


<p class="wp-block-paragraph">実際のプロジェクトでは、この担当範囲の境界で情報が不足することがあります。</p>


<p class="wp-block-paragraph">私が携わった案件でも、ミドルウェア製品が使用するセッション管理用テーブルについて、製品ベンダーに仕様を確認してからスキーマや表領域を決定しました。また、帳票データの型がBLOBなのかCLOBなのかについて、関係者間で認識が異なっていたこともありました。</p>


<p class="wp-block-paragraph">物理設計では担当者間の役割分担を明確にするとともに、必要な情報の提供元も確認する必要があります。</p>


<p class="wp-block-paragraph">本記事では、インフラエンジニア・DBAの立場から行う物理設計に焦点を当て、Oracle Database 19cを例に解説します。</p>


<h2 class="wp-block-heading">データベース物理設計でやること・設計項目一覧</h2>


<p class="wp-block-paragraph">物理設計では、ソフトウェア構成、表領域、初期化パラメータ、可用性、通信、運用、セキュリティなどを決定します。</p>


<p class="wp-block-paragraph">実務で使用した物理設計書の章立ても参考にしながら、Oracle 19cで検討する設計項目と成果物、実務上の進め方を整理します。</p>


<h3 class="wp-block-heading">物理設計の主要設計項目と成果物</h3>


<p class="wp-block-paragraph"><strong>【実務事例：物理設計書の章立てから必要項目を把握する】</strong></p>


<p class="wp-block-paragraph">実際の物理設計書は全10章で構成されていました。次の表は、その章立てを手がかりに、Oracle 19cの物理設計で確認すべき項目を整理したものです。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>実際の物理設計書の章立て</th>
<th>Oracle 19cでの主な検討項目</th>
<th>本記事での扱い</th>
</tr>
</thead>
<tbody>
<tr>
<td>第1章 ソフトウェア構成</td>
<td>エディション、ライセンス、RU・パッチ方針</td>
<td>H2-3</td>
</tr>
<tr>
<td>第2章 インスタンス設計</td>
<td>CDB/PDB、インスタンス、DBブロックサイズ、キャラクタセット</td>
<td>H2-3</td>
</tr>
<tr>
<td>第3章 表領域設計</td>
<td>SYSTEM等の表領域、業務表領域、データファイル</td>
<td>H2-3・H2-4</td>
</tr>
<tr>
<td>第4章 REDOログ設計</td>
<td>オンラインREDO、スタンバイREDO、アーカイブログ</td>
<td>H2-3・H2-5</td>
</tr>
<tr>
<td>第5章 制御ファイル設計</td>
<td>制御ファイルの多重化・配置・復旧</td>
<td>H2-3で要点</td>
</tr>
<tr>
<td>第6章 通信設計</td>
<td>リスナー、サービス、接続方式</td>
<td>H2-3で要点</td>
</tr>
<tr>
<td>第7章 初期化パラメータ設計</td>
<td>メモリ、PROCESSES、SESSIONS、UNDO</td>
<td>H2-3・H2-5</td>
</tr>
<tr>
<td>第8章 ユーザ設計</td>
<td>スキーマ、ロール、プロファイル、最小権限</td>
<td>H2-3で要点</td>
</tr>
<tr>
<td>第9章 運用設計</td>
<td>RMAN、ログ管理、統計情報、性能監視、PDB間のリソース管理</td>
<td>H2-3で要点</td>
</tr>
<tr>
<td>第10章 セキュリティ設計</td>
<td>Unified Auditing、暗号化、アクセス制御</td>
<td>H2-3で要点</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">OS・ストレージやHugePages、ASMなどは、設計書の章立てとは別に、基盤設計側との責任分界を決めて確認します。表は設計項目の把握に使い、実際の成果物の構成はプロジェクトごとに合意します。</p>


<p class="wp-block-paragraph">最初にエディション・ライセンスとCDB/PDBの設計単位を確定し、後続の表領域やメモリ設計の制約条件を整理します。</p>


<p class="wp-block-paragraph"><strong>物理設計の主な成果物</strong></p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>成果物</th>
<th>主な内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>データベース詳細設計書（物理設計書）</td>
<td>DB構成、表領域、REDO、通信、運用等の設計方針</td>
</tr>
<tr>
<td>環境定義書</td>
<td>環境ごとの設定値、サーバ・ソフトウェア構成等</td>
</tr>
<tr>
<td>初期化パラメータ一覧</td>
<td>パラメータ値、設定理由、適用範囲</td>
</tr>
<tr>
<td>容量見積書</td>
<td>テーブル、索引、LOB、表領域等の容量</td>
</tr>
<tr>
<td>設計課題管理表</td>
<td>未確定事項、対応方針、担当、期限</td>
</tr>
<tr>
<td>設計進捗管理表</td>
<td>設計・レビュー・完了の状況</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">成果物の名称や分け方はプロジェクトによって異なり、初期化パラメータ一覧などを環境定義書に含める場合もあります。</p>


<p class="wp-block-paragraph"><strong>【実務事例：成果物とフォーマットの合意】</strong></p>


<p class="wp-block-paragraph">実際の課題管理表では、設計作業の初期に、設計書のフォーマットについて確認を行っていました。</p>


<p class="wp-block-paragraph">その後、成果物を「データベース詳細設計書」と「環境定義書」の2つとする方針で合意しています。</p>


<p class="wp-block-paragraph">さらに設計途中で、統一テンプレートが提供され次第、差し替える方針が決まりました。</p>


<p class="wp-block-paragraph">この経験から、物理設計では内容の検討に入る前に、成果物の名称、記載範囲、使用するテンプレート、レビュー方法を関係者と合意することが重要だと考えています。</p>


<h3 class="wp-block-heading">物理設計の進め方と依存関係</h3>


<p class="wp-block-paragraph">物理設計の実務では、最初に必要な情報がすべて揃うとは限りません。</p>


<p class="wp-block-paragraph">実案件の課題管理表にも、システム特性、テーブル定義、データ件数、同時接続数、LOB容量、バッチ処理量などの情報を関係者へ依頼した記録が多数残っています。</p>


<p class="wp-block-paragraph"><strong>設計項目と必要情報の依存関係</strong></p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>必要な入力情報</th>
<th>影響する設計項目</th>
<th>本記事の解説</th>
</tr>
</thead>
<tbody>
<tr>
<td>システム特性・アクセス傾向</td>
<td>DBブロックサイズ、性能設計</td>
<td>H2-3</td>
</tr>
<tr>
<td>テーブル定義・件数・増加率</td>
<td>表領域、データファイル容量</td>
<td>H2-4</td>
</tr>
<tr>
<td>LOBの型・件数・平均サイズ</td>
<td>LOB格納方式、容量見積</td>
<td>H2-4</td>
</tr>
<tr>
<td>同時接続数・接続プール</td>
<td>PROCESSES、SESSIONS</td>
<td>H2-3・H2-5</td>
</tr>
<tr>
<td>トランザクション量・バッチ処理量</td>
<td>UNDO、REDO、アーカイブ</td>
<td>H2-3・H2-5</td>
</tr>
<tr>
<td>運用フロー・ログ保持期間</td>
<td>バックアップ、ログ管理</td>
<td>H2-3で要点</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph"><strong>【実務事例：設計FIXの延期】</strong></p>


<p class="wp-block-paragraph">実案件の課題管理表では、1月中旬から課題が起票されていました。</p>


<p class="wp-block-paragraph">物理設計書のFIXは当初2月末を予定していましたが、容量見積に必要なデータを2月中に提供できないことが判明し、3月末へ延期されています。</p>


<p class="wp-block-paragraph">一方、データが揃うまで設計を止めたわけではありません。未確定の情報には暫定値を置いて設計を進め、資料の受領後に見直しました。具体的な方法は後述の容量見積の章で解説します。</p>


<p class="wp-block-paragraph"><strong>物理設計を進める6つのステップ</strong></p>


<p class="wp-block-paragraph"><strong>⓪ 成果物とフォーマットを合意する</strong></p>


<p class="wp-block-paragraph">設計書、環境定義書、容量見積書などの成果物、記載範囲、テンプレートを関係者と合意します。</p>


<p class="wp-block-paragraph"><strong>① 必要な情報を確認し、不足分を課題として起票する</strong></p>


<p class="wp-block-paragraph">非機能要件、論理設計書、テーブル定義、業務処理量などを確認し、不足する情報は提供元と期限を明確にして管理します。</p>


<p class="wp-block-paragraph"><strong>② 基本構成を決める</strong></p>


<p class="wp-block-paragraph">Oracleのエディションとライセンス、CDB/PDB構成、可用性構成、OS・ストレージ方式などを決定します。</p>


<p class="wp-block-paragraph"><strong>③ 未確定事項を管理しながら詳細設計を進める</strong></p>


<p class="wp-block-paragraph">表領域、容量、REDOログ、メモリ、初期化パラメータなどを設計し、未確定事項には暫定値と根拠を記録します。</p>


<p class="wp-block-paragraph"><strong>④ 設計レビューを実施し、課題を解決する</strong></p>


<p class="wp-block-paragraph">関係者から提供された情報やレビュー結果を設計書に反映し、未解決課題の影響範囲と確定条件を明らかにします。</p>


<p class="wp-block-paragraph"><strong>⑤ 構築・試験で設計を検証する</strong></p>


<p class="wp-block-paragraph">構築時に設定値を確認し、移行リハーサルや性能試験で容量、接続数、REDO生成量などを検証します。</p>


<p class="wp-block-paragraph">次章では、これらの設計項目について、Oracle Database 19cを例に具体的な判断とその根拠を解説します。</p>


<h2 class="wp-block-heading">Oracle 19cの物理設計で具体的に決めること</h2>


<p class="wp-block-paragraph">Oracle Database 19cを例に、物理設計で決定する主要な項目と、その判断基準を解説します。単なる設定項目の紹介ではなく、実際の設計判断を具体例とともに示します。</p>


<h3 class="wp-block-heading">最初に決めるソフトウェア構成とライセンス</h3>


<p class="wp-block-paragraph">物理設計では、まずOracleのエディションと利用できる機能を確認します。</p>


<p class="wp-block-paragraph">Oracle 19cのStandard Edition 2（SE2）ではRACとData Guardを利用できません。また、Enterprise Edition（EE）でも追加ライセンスが必要な機能があります。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>機能</th>
<th>Oracle 19cでの主な利用条件</th>
</tr>
</thead>
<tbody>
<tr>
<td>RAC</td>
<td>EE＋RACオプション</td>
</tr>
<tr>
<td>Data Guard</td>
<td>EEで利用可能</td>
</tr>
<tr>
<td>Active Data Guard</td>
<td>EE＋Active Data Guardオプション</td>
</tr>
<tr>
<td>Partitioning</td>
<td>EE＋Partitioningオプション</td>
</tr>
<tr>
<td>TDE</td>
<td>EE＋Advanced Securityオプション</td>
</tr>
<tr>
<td>AWR・ASH</td>
<td>Diagnostics Packの利用権が必要</td>
</tr>
<tr>
<td>STATSPACK</td>
<td>Diagnostics Packなしで利用可能</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">※実際の利用条件は、契約、導入形態、クラウドサービスなどによって異なります。</p>


<p class="wp-block-paragraph"><strong>【設計判断例：Data Guardによる待機系の参照利用】</strong></p>


<p class="wp-block-paragraph">障害対策としてData Guardを採用し、待機系を帳票検索にも利用したい場合を考えます。</p>


<p class="wp-block-paragraph">フィジカル・スタンバイを読み取り専用で開くだけなら基本Data Guardでも可能ですが、REDOの適用を継続しながら参照処理を実行するには、Active Data Guardオプションが必要です。</p>


<p class="wp-block-paragraph">また、Diagnostics Packを契約しない場合は、<code>CONTROL_MANAGEMENT_PACK_ACCESS</code>を<code>NONE</code>に設定して、有償の診断・チューニング機能を誤使用しないようにします。性能監視にはSTATSPACKなどを採用します。</p>


<p class="wp-block-paragraph">このように、<strong>技術的に実現できる構成と、契約上利用できる構成は区別</strong>しなければなりません。</p>


<p class="wp-block-paragraph">Oracle 19cでは、採用するRelease Update（RU）やパッチ適用方針も物理設計時に決定します。</p>


<h3 class="wp-block-heading">CDB/PDB構成と設計単位</h3>


<p class="wp-block-paragraph">Oracle 19cでは、CDB（Container Database）とPDB（Pluggable Database）によるマルチテナント構成を基本として設計します。</p>


<p class="wp-block-paragraph">19cでは非CDB構成も利用できますが非推奨であり、21c以降ではサポートされません。将来のアップグレードを考慮すれば、CDB/PDB構成が基本的な選択となります。</p>


<p class="wp-block-paragraph"><strong>【設計判断例：PDB数とライセンス】</strong></p>


<p class="wp-block-paragraph">Oracle 19cでは、SE2・EEともにMultitenantオプションを追加契約せず、1つのCDBにユーザー作成PDBを最大3個まで配置できます。</p>


<p class="wp-block-paragraph">例えば、3つの業務データベースを統合する場合、ライセンス上は1つのCDBに3つのPDBを構成できます。</p>


<p class="wp-block-paragraph">一方、4つ以上を統合する場合には、Multitenantオプションの利用条件などを確認する必要があります。</p>


<p class="wp-block-paragraph">ただし、3個まで配置できるからといって、必ず統合するべきではありません。業務ごとの可用性、負荷特性、リソース競合、運用体制を踏まえて決定します。</p>


<p class="wp-block-paragraph"><strong>OS・インスタンス・CDB・PDBの設計境界</strong></p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>設計単位</th>
<th>主な設計項目</th>
</tr>
</thead>
<tbody>
<tr>
<td>OS・Grid Infrastructure</td>
<td>HugePages、カーネルパラメータ、ASM、リスナー</td>
</tr>
<tr>
<td>インスタンス</td>
<td>SGA、PGA、PROCESSES</td>
</tr>
<tr>
<td>CDB全体</td>
<td>標準ブロックサイズ、CDBのキャラクタセット、オンラインREDO、制御ファイル、ARCHIVELOG、Data Guard、Flashback Database</td>
</tr>
<tr>
<td>PDBごと</td>
<td>SYSTEM、SYSAUX、TEMP、業務表領域、ローカルUNDOモードでのUNDO、アプリ用サービス、ローカルユーザ・ロール</td>
</tr>
<tr>
<td>複数階層</td>
<td>初期化パラメータ、監査、バックアップ・リカバリ、リソース管理</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">PDB内で変更できる初期化パラメータは限定されています。次のSQLで変更可能なパラメータを確認できます。</p>


<pre class="wp-block-code"><code>SELECT name, ispdb_modifiable
FROM v$parameter
WHERE ispdb_modifiable = 'TRUE'
ORDER BY name;
</code></pre>


<p class="wp-block-paragraph">RAC構成では、1つのCDBを複数のインスタンスで稼働させます。そのため、SGAなどの資源はインスタンス単位で管理する必要があります。</p>


<h3 class="wp-block-heading">データベース作成時に決める重要項目</h3>


<p class="wp-block-paragraph">DBブロックサイズとキャラクタセットは、作成後の変更が容易ではないため、慎重に決定します。</p>


<p class="wp-block-paragraph"><strong>【実務事例：8KBと16KBをどう選ぶか】</strong></p>


<p class="wp-block-paragraph">Oracle 19cでは一般的な8KBを基準に検討します。実際に担当した案件では、標準ブロックサイズに16KBを採用しました。判断材料として記録されていたのは次の3点です。</p>


<ul class="wp-block-list">
	<li>DSS系のシステム特性</li>
	<li>行連鎖の発生を抑える</li>
	<li>テーブルフルスキャン時のI/Oコストを低減する</li>
</ul>


<p class="wp-block-paragraph">16KBを採用するかどうかは、これらをそのまま結論にせず、対象システムの行長とI/O・更新特性から判断します。</p>


<p class="wp-block-paragraph"><strong>① フルスキャンのI/O</strong></p>


<p class="wp-block-paragraph">Oracleの<code>DB_FILE_MULTIBLOCK_READ_COUNT</code>は、シーケンシャルスキャンで1回のI/Oに読み込む最大ブロック数を指定します。</p>


<p class="wp-block-paragraph">19cの既定値はプラットフォームに応じて決まり、多くの環境で最大約1MBの効率的な読み込みに対応するよう自動設定されます。</p>


<p class="wp-block-paragraph">そのため、8KBから16KBに変更しても、マルチブロック読み込みの総バイト数が単純に2倍になるわけではありません。</p>


<p class="wp-block-paragraph">フルスキャンが多いという理由だけでは、16KBを採用する十分な根拠にはなりません。</p>


<p class="wp-block-paragraph"><strong>② 行連鎖</strong></p>


<p class="wp-block-paragraph">レコード長が大きい場合には、大きなブロックを採用することで、行連鎖の発生を抑えられる可能性があります。</p>


<p class="wp-block-paragraph">一方、平均行長が十分小さければ、16KBを採用する理由としては弱くなります。</p>


<p class="wp-block-paragraph">移行元のOracleが存在する場合は、<code>DBA_TABLES.AVG_ROW_LEN</code>などを確認し、実データの特性を把握します。</p>


<p class="wp-block-paragraph"><strong>③ 更新処理とブロック競合</strong></p>


<p class="wp-block-paragraph">ブロックサイズを大きくすると、1ブロックに格納できる行数も増えます。</p>


<p class="wp-block-paragraph">更新が集中するOLTP系処理では、アクセスが同じブロックに集中する可能性があるため、ブロック競合やバッファキャッシュ効率への影響も評価する必要があります。</p>


<p class="wp-block-paragraph">したがって、19cでは8KBを基準とし、16KBを採用する場合は代表的なSQLによる性能検証と、実際の行長・アクセス特性を根拠に決定します。</p>


<p class="wp-block-paragraph"><strong>キャラクタセットの選択</strong></p>


<p class="wp-block-paragraph">Oracle 19cでは、CDBのキャラクタセットとしてAL32UTF8を基本に検討します。</p>


<p class="wp-block-paragraph">AL32UTF8のCDBには、条件を満たせば異なるキャラクタセットのPDBを収容できます。ただし、文字コード互換性やLOBアクセスの制約は確認が必要です。</p>


<p class="wp-block-paragraph">CLOBの内部表現と容量への影響については、次章の容量見積で詳しく説明します。</p>


<h3 class="wp-block-heading">表領域とストレージの設計</h3>


<p class="wp-block-paragraph">Oracle 19cでは、SYSTEM、SYSAUX、TEMPなどの表領域がCDBルートと各PDBに存在します。ローカルUNDOモードではPDBごとにUNDO表領域を管理します。</p>


<p class="wp-block-paragraph">通常のローカル管理表領域では、ASSMによる空き領域管理とAUTOALLOCATEによるエクステント自動割り当てを基本とします。</p>


<p class="wp-block-paragraph">エクステントサイズを明示的に管理する要件があればUNIFORMも選択できますが、既定の方式から変更する理由を設計書に残します。</p>


<p class="wp-block-paragraph"><strong>【実務事例：表領域を大・小に分けた見積】</strong></p>


<p class="wp-block-paragraph">実際の案件では、テーブルサイズや定義レコード長をもとに、表領域を大・小に分けて見積もっていました。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>区分</th>
<th style="text-align: right;">実務事例のExcel見積</th>
</tr>
</thead>
<tbody>
<tr>
<td>大区分</td>
<td style="text-align: right;">約68,646MB</td>
</tr>
<tr>
<td>小区分</td>
<td style="text-align: right;">約24,785MB</td>
</tr>
<tr>
<td>合計</td>
<td style="text-align: right;">約93,431MB</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">この案件では大きなテーブルと小さなテーブルで固定エクステントのサイズを変えていました。ただし、表領域の分類と固定エクステントの採用は別の判断です。</p>


<p class="wp-block-paragraph">Oracle 19cではAUTOALLOCATEを基本とし、固定サイズのUNIFORMを指定する場合は、その必要性を個別に検証します。</p>


<p class="wp-block-paragraph">表領域を分けるかどうかも、単に大きさで決めるのではなく、保存期間、容量監視、バックアップ、リカバリ、移行などの運用要件で判断します。</p>


<p class="wp-block-paragraph"><strong>【設計判断例：240GBの表領域をどう構成するか】</strong></p>


<p class="wp-block-paragraph">実務事例の容量見積では、テーブル格納表領域を240GBとしています（内訳と見積条件は次章で説明します）。これはファイル構成の考え方を示すための入力値です。</p>


<p class="wp-block-paragraph">Oracle 19cの8KBブロック環境で240GBを構成する場合、SMALLFILEとBIGFILEの2つの選択肢があります。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>比較項目</th>
<th>SMALLFILE</th>
<th>BIGFILE</th>
</tr>
</thead>
<tbody>
<tr>
<td>ファイル数</td>
<td>複数</td>
<td>1つ</td>
</tr>
<tr>
<td>8KB時の1ファイル上限</td>
<td>約32GB</td>
<td>約32TB</td>
</tr>
<tr>
<td>240GBの構成例</td>
<td>30GB×8ファイル</td>
<td>240GB×1ファイル</td>
</tr>
<tr>
<td>主な考慮点</td>
<td>ファイル数と管理</td>
<td>大容量ファイルのバックアップ・復旧</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">SMALLFILEの場合、240GBなら最低8ファイル必要です。運用方針に応じて10ファイル程度に分ける構成も考えられます。</p>


<p class="wp-block-paragraph">一方、BIGFILEなら1ファイルで構成できます。</p>


<p class="wp-block-paragraph">ただし、BIGFILEでは大きなデータファイルをどのようにバックアップ・復旧するかが重要になります。</p>


<p class="wp-block-paragraph">RMANでは<code>SECTION SIZE</code>を指定したマルチセクション・バックアップを利用でき、1つの大きなデータファイルを複数セクションに分け、並列にバックアップできます。</p>


<p class="wp-block-paragraph">例えば、CDBルートに接続したRMANからPDB1のAPP_DATA表領域をバックアップする場合は、次のように指定します。</p>


<pre class="wp-block-code"><code>BACKUP
  SECTION SIZE 8G
  TABLESPACE PDB1:APP_DATA;
</code></pre>


<p class="wp-block-paragraph">※バックアップの並列度は、RMANのチャネル設定などにも依存します。PDBに直接接続する場合は、そのPDB内の表領域名を指定します。</p>


<p class="wp-block-paragraph">このように、必要容量だけでなく、バックアップ時間、リカバリ方式、ASMやOMFの利用方針を踏まえてファイル構成を決定します。</p>


<h3 class="wp-block-heading">REDOログ・アーカイブログ・可用性の設計</h3>


<p class="wp-block-paragraph">REDOログの設計では、サイズ、グループ数、多重化、アーカイブ方式を決めます。</p>


<p class="wp-block-paragraph"><strong>【設計判断例：REDOログサイズの決定】</strong></p>


<p class="wp-block-paragraph">例えば、ピーク時のREDO生成量が毎分20MBで、ログスイッチ間隔の目安を30分とした場合、</p>


<p class="wp-block-paragraph">20MB×30分＝600MB</p>


<p class="wp-block-paragraph">となります。</p>


<p class="wp-block-paragraph">この値をREDOログサイズの初期検討値とし、実際の負荷や運用要件に応じて調整します。</p>


<p class="wp-block-paragraph"><strong>REDO生成量はどのように把握するか</strong></p>


<p class="wp-block-paragraph">移行元のOracleが存在する場合は、AWRまたはSTATSPACKの<code>redo size</code>などを確認します。</p>


<p class="wp-block-paragraph">また、<code>V$LOG_HISTORY</code>からログスイッチの頻度を確認できます。ログサイズと組み合わせることで、概算の生成量を推定できますが、ピーク時の厳密なREDO生成量を求めるには、統計情報や実測による確認が必要です。</p>


<p class="wp-block-paragraph">さらに、<code>V$INSTANCE_RECOVERY</code>の<code>OPTIMAL_LOGFILE_SIZE</code>列も参考になります。</p>


<pre class="wp-block-code"><code>SELECT
  optimal_logfile_size,
  target_mttr,
  estimated_mttr
FROM v$instance_recovery;
</code></pre>


<p class="wp-block-paragraph"><code>OPTIMAL_LOGFILE_SIZE</code>は、<code>FAST_START_MTTR_TARGET</code>などの設定に基づくREDOログサイズの目安です。<code>FAST_START_MTTR_TARGET</code>を有効に設定している場合に算出され、設定条件によってはNULLとなるため、その場合はREDO生成量やログスイッチ頻度から判断します。</p>


<p class="wp-block-paragraph"><strong>REDOログのグループ数はどう決めるか</strong></p>


<p class="wp-block-paragraph">REDOログは、ログスイッチによって次のグループへ切り替わります。</p>


<p class="wp-block-paragraph">ロググループを再利用するまでに、必要なチェックポイント処理やアーカイブが完了していなければ、更新処理が待たされる可能性があります。</p>


<p class="wp-block-paragraph">したがって、グループ数は単に最小構成にするのではなく、ピーク時のログスイッチ間隔とアーカイブ・チェックポイント処理の時間を踏まえて決定します。</p>


<p class="wp-block-paragraph">特に大量バッチが存在するシステムでは、ピーク時にロググループが不足しないか検証する必要があります。</p>


<p class="wp-block-paragraph">なお、Oracle 19cのクラッシュリカバリ時間は、主に<code>FAST_START_MTTR_TARGET</code>などによって制御します。REDOログサイズだけで復旧時間が決まるわけではありません。</p>


<p class="wp-block-paragraph">アーカイブの生成間隔を制御する必要があれば、<code>ARCHIVE_LAG_TARGET</code>も検討します。</p>


<p class="wp-block-paragraph"><strong>Data Guardを利用する場合</strong></p>


<p class="wp-block-paragraph">Data GuardではMaximum AvailabilityやMaximum Performanceなどの保護モードを、データ損失の許容範囲と性能・可用性要件に応じて選択します。</p>


<p class="wp-block-paragraph">スタンバイREDOログは、各REDOスレッドに対してオンラインREDOと同じサイズを基本とし、オンラインREDOより1グループ多く用意します。</p>


<p class="wp-block-paragraph">例えば、オンラインREDOが3グループであれば、スタンバイREDOは4グループとします。</p>


<p class="wp-block-paragraph">Data Guardにおける大量バッチのREDO転送・適用性能の課題については、後述の実案件の章で説明します。</p>


<h3 class="wp-block-heading">メモリ・初期化パラメータの設計</h3>


<p class="wp-block-paragraph">Oracleのメモリ設計では、SGA・PGAに加えて、プロセス数とセッション数を検討します。</p>


<p class="wp-block-paragraph">LinuxでHugePagesを利用する場合は、AMM（<code>MEMORY_TARGET</code>）と併用できないため、ASMMなどを採用します。</p>


<p class="wp-block-paragraph"><strong>【設計判断例：PROCESSESの初期見積】</strong></p>


<p class="wp-block-paragraph">例えば、次の構成を想定します。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>接続・プロセスの要素</th>
<th style="text-align: right;">想定数</th>
</tr>
</thead>
<tbody>
<tr>
<td>APサーバ4台×接続プール最大50</td>
<td style="text-align: right;">200</td>
</tr>
<tr>
<td>バッチ用</td>
<td style="text-align: right;">30</td>
</tr>
<tr>
<td>管理・保守用</td>
<td style="text-align: right;">20</td>
</tr>
<tr>
<td>Oracleバックグラウンドプロセス等</td>
<td style="text-align: right;">50</td>
</tr>
<tr>
<td>合計</td>
<td style="text-align: right;">300</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">この場合、<code>PROCESSES=300</code>を初期検討値とできます。</p>


<p class="wp-block-paragraph">ただし、これは説明用の仮定であり、PDB数、有効機能、並列実行、バックグラウンドプロセスの数によって必要値が変わります。</p>


<p class="wp-block-paragraph">検証環境では<code>V$PROCESS</code>などを利用して実際のプロセス数を確認し、余裕を含めて見直します。</p>


<p class="wp-block-paragraph">また、APサーバのローリング再起動時には、古い接続プールと新しい接続プールが一時的に併存する可能性があります。このような通常運用以外のピークも考慮する必要があります。</p>


<p class="wp-block-paragraph"><strong>SESSIONSはPROCESSESから派生する</strong></p>


<p class="wp-block-paragraph">Oracle 19cでは、<code>SESSIONS</code>の既定値は原則として次の式から算出されます。</p>


<p class="wp-block-paragraph"><code>SESSIONS＝1.5×PROCESSES＋22</code></p>


<p class="wp-block-paragraph">例えば<code>PROCESSES=300</code>なら、計算上の既定値は472です。</p>


<p class="wp-block-paragraph">ただし、<code>PROCESSES</code>と<code>SESSIONS</code>は同一の設定ではありません。PDB単位のセッション制限も含め、アプリケーションの接続方式に合わせて設計します。</p>


<p class="wp-block-paragraph">実際の案件で、端末数・同時アクセス数とDB接続数をどう区別したかは、後述の課題事例で説明します。</p>


<h3 class="wp-block-heading">その他の物理設計項目</h3>


<p class="wp-block-paragraph"><strong>基盤・運用関連の設計</strong></p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>分類</th>
<th>主な設計内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>通信</td>
<td>リスナー、サービス名、接続方式</td>
</tr>
<tr>
<td>ユーザ・権限</td>
<td>スキーマ、ロール、最小権限</td>
</tr>
<tr>
<td>セキュリティ</td>
<td>Unified Auditing、暗号化、アクセス制御</td>
</tr>
<tr>
<td>バックアップ</td>
<td>RMAN、保持期間、復旧方式</td>
</tr>
<tr>
<td>統計情報</td>
<td>収集方法、実行タイミング</td>
</tr>
<tr>
<td>性能監視</td>
<td>AWR、STATSPACK、監視項目</td>
</tr>
<tr>
<td>リソース管理</td>
<td>PDB間のCPU・セッション等の制御</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">Oracle 19cではUnified Auditingの混合モードが既定の構成です。新規設計では、従来型監査への依存を避け、純粋なUnified Auditingへの移行も検討します。</p>


<p class="wp-block-paragraph"><strong>アプリケーション寄りの物理設計</strong></p>


<p class="wp-block-paragraph">索引、パーティショニング、非正規化なども広義の物理設計に含まれます。</p>


<p class="wp-block-paragraph">これらはDBAとアプリケーション担当者が連携して設計します。</p>


<p class="wp-block-paragraph">また、Amazon RDS for OracleなどのマネージドDBでは、OS、ストレージ、ファイル管理などについて、オンプレミスとは設計できる範囲が異なります。利用するサービスに応じて、設計対象と責任分界点を整理する必要があります。</p>


<h2 class="wp-block-heading">テーブルサイズ・表領域容量の見積方法と実務ノウハウ</h2>


<p class="wp-block-paragraph">データベースの物理設計で特に難しいのが、容量見積です。物理設計の段階ではテーブル定義やデータ件数が確定していないことも多く、そのような状況でもストレージ容量を決めなければなりません。</p>


<p class="wp-block-paragraph">ここでは、実際の大規模システムで使用した容量見積Excelと課題管理表をもとに、Oracle Database 19cでも活用できる見積の進め方を解説します。</p>


<h3 class="wp-block-heading">容量見積に必要な情報と基本的な計算方法</h3>


<p class="wp-block-paragraph">テーブル容量の見積では、次の情報を確認します。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>項目</th>
<th>確認内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>テーブル定義</td>
<td>列、データ型、定義長</td>
</tr>
<tr>
<td>平均レコード長</td>
<td>1行に格納される平均データ量</td>
</tr>
<tr>
<td>初期件数</td>
<td>稼働開始時の件数</td>
</tr>
<tr>
<td>年間増加件数</td>
<td>1年間に増加する件数</td>
</tr>
<tr>
<td>保存期間</td>
<td>データの保持年数</td>
</tr>
<tr>
<td>索引・LOB</td>
<td>テーブル本体以外に必要な容量</td>
</tr>
<tr>
<td>拡張余裕</td>
<td>将来増加と見積誤差への備え</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">基本的な計算式は以下のとおりです。</p>


<p class="wp-block-paragraph">将来件数＝初期件数＋年間増加件数×見積年数</p>


<p class="wp-block-paragraph">テーブルデータ量＝将来件数×平均レコード長</p>


<p class="wp-block-paragraph">冒頭で例に挙げた注文テーブル（初期件数120万件、年間増加30万件、見積期間5年で、5年後に270万件）に、平均レコード長420バイトを当てはめると、次のようになります。</p>


<p class="wp-block-paragraph">420バイト×270万件＝1,134,000,000バイト</p>


<p class="wp-block-paragraph">したがって、データ本体の概算は約1.1GBです。</p>


<p class="wp-block-paragraph">ただし、Oracleの実際の格納容量には、ブロック管理領域、PCTFREE、エクステント割り当てなどの影響があります。</p>


<p class="wp-block-paragraph"><strong>定義レコード長と平均レコード長は区別する</strong></p>


<p class="wp-block-paragraph">実案件では、エンティティ定義書から取得した定義上のレコード長を使って概算していました。</p>


<p class="wp-block-paragraph">この方法は実データがなくても計算できますが、VARCHAR2などの可変長項目では、定義上の最大長が実際の平均長より大きくなる場合があります。</p>


<p class="wp-block-paragraph">移行元のOracle Databaseが利用できる場合は、DBA_TABLES.NUM_ROWSとAVG_ROW_LENを参照すると、実態に近い見積が可能です。AVG_ROW_LENには行オーバーヘッドも含まれます。</p>


<p class="wp-block-paragraph">ただし、統計情報が古ければ信頼性が低下します。また、行外LOBのデータ本体は平均行長だけでは評価できないため、別途容量を見積もる必要があります。</p>


<h3 class="wp-block-heading">必要な情報が揃わないときの暫定見積</h3>


<p class="wp-block-paragraph">実務では、すべてのテーブルの件数や増加量が確定してから物理設計を開始できるとは限りません。</p>


<p class="wp-block-paragraph">私が担当したプロジェクトでも、物理設計時点では全テーブルの定義と件数が揃っていませんでした。</p>


<p class="wp-block-paragraph">課題管理表には、業務側に全テーブルの定義と件数一覧を求めた記録が残っています。その中で、必要な資料が不足していても、既存資料から設計を進めるという方針が示されました。</p>


<p class="wp-block-paragraph">実際には以前に提供されていたエンティティ定義書を利用して見積を開始し、その後に件数や増加率の情報を取得して修正を進めました。定義書の項目長に未記入が見つかり、資料を再確認した経緯もあります。</p>


<p class="wp-block-paragraph"><strong>【実務事例：105テーブルを暫定見積】</strong></p>


<p class="wp-block-paragraph">実案件の容量見積Excelでは、件数が把握できるテーブルは5年後の推定件数から容量を計算し、初期件数が不明なテーブルには暫定容量を設定しました。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>項目</th>
<th style="text-align: right;">事例の見積</th>
</tr>
</thead>
<tbody>
<tr>
<td>暫定扱いのテーブル数</td>
<td style="text-align: right;">105</td>
</tr>
<tr>
<td>1テーブルの暫定容量</td>
<td style="text-align: right;">100MB</td>
</tr>
<tr>
<td>暫定容量合計</td>
<td style="text-align: right;">10,500MB</td>
</tr>
<tr>
<td>Excel上の集計容量</td>
<td style="text-align: right;">約93,431MB</td>
</tr>
<tr>
<td>暫定容量の割合</td>
<td style="text-align: right;">約11.2％</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">※元資料のMB表記を使用。100MBは実際の案件固有の暫定値であり、Oracle 19cの推奨値ではありません。</p>


<p class="wp-block-paragraph">全体の約11％を暫定値が占めていました。</p>


<p class="wp-block-paragraph">仮に、この105テーブルの実際の平均容量が300MBだった場合、必要容量は31,500MBとなります。</p>


<p class="wp-block-paragraph">当初見積10,500MBとの差は21,000MBです。</p>


<p class="wp-block-paragraph">つまり、未確定部分の見積条件によって、ストレージ容量が大きく変わる可能性があります。</p>


<p class="wp-block-paragraph">そのため、暫定値については少なくとも以下を記録しておきます。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>管理項目</th>
<th>記載例</th>
</tr>
</thead>
<tbody>
<tr>
<td>未確定事項</td>
<td>初期データ件数</td>
</tr>
<tr>
<td>暫定容量</td>
<td>100MB</td>
</tr>
<tr>
<td>設定根拠</td>
<td>類似テーブルの規模、暫定的な仮定</td>
</tr>
<tr>
<td>リスク</td>
<td>実容量が想定を上回る可能性</td>
</tr>
<tr>
<td>確認担当</td>
<td>業務設計担当</td>
</tr>
<tr>
<td>見直し条件</td>
<td>移行対象件数の確定時</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">重要なのは、情報不足を理由に設計を止めるのではなく、合理的な前提を置いて設計を進め、後から検証・修正できるようにしておくことです。</p>


<p class="wp-block-paragraph">暫定値は正解ではありません。未確定であることを明示し、関係者と合意して使用する必要があります。</p>


<h3 class="wp-block-heading">索引・LOBの容量見積</h3>


<p class="wp-block-paragraph">テーブル本体の容量を計算しただけでは、データベース全体の容量は決まりません。</p>


<p class="wp-block-paragraph"><strong>索引容量は、定義が確定していなければ暫定見積する</strong></p>


<p class="wp-block-paragraph">物理設計段階では、性能チューニングによって索引が追加される可能性があります。</p>


<p class="wp-block-paragraph">実案件では、索引容量を次のように見積もっていました。</p>


<p class="wp-block-paragraph">（240GB－80GB）×25％＝40GB</p>


<p class="wp-block-paragraph">240GBはテーブル格納表領域全体、80GBはLOBを含むテーブルの見積容量です。</p>


<p class="wp-block-paragraph">この計算では、LOBを除いた160GBを基準に25％を掛けています。</p>


<p class="wp-block-paragraph">なお、160GBには非LOBテーブルのデータ量120GBに加え、表領域設計上の余裕40GBも含まれるため、索引の見積にも実質的に余裕を見込んでいます。</p>


<p class="wp-block-paragraph">この25％は案件固有の暫定係数であり、Oracle 19cの標準的な割合ではありません。</p>


<p class="wp-block-paragraph">索引定義が確定した後は、キー長、索引本数、データ件数などをもとに再見積します。既存テーブルであれば、DBMS_SPACE.CREATE_INDEX_COSTを利用する方法もあります。ただし、対象テーブルの統計情報が適切に収集されていることが前提です。</p>


<p class="wp-block-paragraph"><strong>LOB容量は文字コードと格納方式に注意する</strong></p>


<p class="wp-block-paragraph">実案件では、帳票データを格納するCLOBの容量見積で問題が発生しました。</p>


<p class="wp-block-paragraph">当初の見積には、以下の2つの問題がありました。</p>


<ul class="wp-block-list">
	<li>見積に使用した帳票枚数が、実際にLOBへ格納されるデータ件数を正しく表していなかった。</li>
	<li>すべてのLOBが行外格納されるという前提で計算していた。</li>
</ul>


<p class="wp-block-paragraph">このため、LOB容量の再見積が必要になりました。</p>


<p class="wp-block-paragraph">Oracle 19cでCLOB容量を見積もる場合は、文字コードによる内部表現の違いも考慮します。</p>


<p class="wp-block-paragraph">例えば、AL32UTF8環境では、CLOBの可変長文字データはUCS2互換の内部形式で格納されます。</p>


<p class="wp-block-paragraph">基本多言語面の文字を例にすると、次の違いがあります。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>文字の種類</th>
<th>UTF-8</th>
<th>UCS2互換の内部表現</th>
</tr>
</thead>
<tbody>
<tr>
<td>ASCII文字「A」</td>
<td>1バイト</td>
<td>2バイト</td>
</tr>
<tr>
<td>ひらがな「あ」</td>
<td>3バイト</td>
<td>2バイト</td>
</tr>
<tr>
<td>漢字「漢」</td>
<td>3バイト</td>
<td>2バイト</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">つまり、ASCII中心の帳票では元のUTF-8データより大きく、日本語中心では小さくなる場合があります。</p>


<p class="wp-block-paragraph">ただし、補助文字、管理領域、LOB格納方式などの影響があるため、この比率をそのまま最終容量に使用してはいけません。</p>


<p class="wp-block-paragraph"><strong>行内格納と行外格納の違い</strong></p>


<p class="wp-block-paragraph">Oracle 19cでは、ENABLE STORAGE IN ROWが有効な場合、管理情報を含めておおむね4,000バイト以下のLOBを行内に格納できます。</p>


<p class="wp-block-paragraph">1文字が内部的に2バイトとなる文字を中心に考えれば、おおむね2,000文字弱が目安になります。ただし、これは厳密な文字数上限ではありません。</p>


<p class="wp-block-paragraph">4,000バイトを超えるLOBは行外格納となり、別途LOBセグメントの容量を考慮する必要があります。</p>


<p class="wp-block-paragraph">また、BasicFilesでは小さなLOBの行外格納に最低1チャンクが必要となる場合がありますが、SecureFilesでは格納方式が異なります。</p>


<p class="wp-block-paragraph">Oracle 19cではSecureFilesを基本に検討し、圧縮・重複排除・暗号化を利用する場合は、Advanced CompressionやAdvanced Securityのライセンス条件も確認します。</p>


<p class="wp-block-paragraph">LOBの容量は単純な「件数×元ファイルサイズ」では求められません。実際のデータ形式と格納特性を確認したうえで見積もる必要があります。</p>


<h3 class="wp-block-heading">表領域・ストレージ容量への積み上げ</h3>


<p class="wp-block-paragraph">テーブル・索引・LOBの容量を見積もった後は、表領域およびストレージ全体の必要容量を決めます。</p>


<p class="wp-block-paragraph"><strong>【実務事例：テーブル格納表領域の設計】</strong></p>


<p class="wp-block-paragraph">最終物理設計書には、次の容量が記録されています。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>見積項目</th>
<th style="text-align: right;">容量</th>
</tr>
</thead>
<tbody>
<tr>
<td>LOBを含まないテーブル</td>
<td style="text-align: right;">120GB</td>
</tr>
<tr>
<td>LOBを含むテーブル</td>
<td style="text-align: right;">80GB</td>
</tr>
<tr>
<td>合計</td>
<td style="text-align: right;">200GB</td>
</tr>
<tr>
<td>設計上の余裕</td>
<td style="text-align: right;">40GB</td>
</tr>
<tr>
<td>テーブル格納表領域</td>
<td style="text-align: right;">240GB</td>
</tr>
<tr>
<td>索引表領域</td>
<td style="text-align: right;">40GB</td>
</tr>
<tr>
<td>合計</td>
<td style="text-align: right;">280GB</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">なお、前述のExcel約93,431MBは、見積ツール上の大・小区分の集計値です。</p>


<p class="wp-block-paragraph">最終物理設計書では、非LOBテーブルを約200テーブル×平均600MBとして120GBに見積もり、さらに帳票データなどのLOBを含むテーブルに80GBを計上しています。</p>


<p class="wp-block-paragraph">両者は同じ条件で算出した値ではなく、Excel集計から最終値へ至ったすべての再計算過程も確認できないため、93GBと200GBを直接比較することはできません。</p>


<p class="wp-block-paragraph">実務では、このように見積条件や対象範囲が変わることがあるため、見積値だけでなく、算出時点・対象範囲・前提条件を一緒に管理することが重要です。</p>


<p class="wp-block-paragraph"><strong>データファイルのサイズと拡張方針を決める</strong></p>


<p class="wp-block-paragraph">Oracle 19cでは、必要容量を踏まえて次の項目を設計します。</p>


<ul class="wp-block-list">
	<li>初期データファイルサイズ</li>
	<li>AUTOEXTENDの使用有無</li>
	<li>NEXTによる拡張増分</li>
	<li>MAXSIZEによる上限</li>
</ul>


<p class="wp-block-paragraph">AUTOEXTENDを有効にしていても、ストレージの空き容量が不足すれば拡張できません。</p>


<p class="wp-block-paragraph">そのため、データファイルの上限と物理ストレージの空き容量を合わせて管理します。</p>


<p class="wp-block-paragraph"><strong>ストレージの冗長化も考慮する</strong></p>


<p class="wp-block-paragraph">ASMでNORMAL REDUNDANCYを採用する場合、通常のデータファイルは2重化されます。</p>


<p class="wp-block-paragraph">例えば280GBの論理容量を同じASMディスクグループに配置すると、ミラーリングを含めて、概算560GB相当の物理容量が必要です。</p>


<p class="wp-block-paragraph">さらに、ASMの管理領域や障害時の再ミラーリングに必要な余裕も考慮します。ストレージ装置側で冗長化する場合は、その方式に応じて計算します。</p>


<p class="wp-block-paragraph"><strong>その他の領域も忘れずに見積もる</strong></p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>領域</th>
<th>主な見積根拠</th>
</tr>
</thead>
<tbody>
<tr>
<td>TEMP・UNDO</td>
<td>ソート・更新負荷、UNDO保持要件</td>
</tr>
<tr>
<td>REDOログ</td>
<td>更新量、ログ切り替え、可用性構成</td>
</tr>
<tr>
<td>アーカイブログ・FRA</td>
<td>REDO生成量、保持期間、バックアップ方式</td>
</tr>
<tr>
<td>バックアップ領域</td>
<td>データ容量、保存世代、バックアップ方式</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">特にアーカイブログは、テーブルの総容量ではなく更新処理量の影響を大きく受けます。</p>


<p class="wp-block-paragraph">設計時には容量監視の方針も決めます。DBA_TABLESPACE_USAGE_METRICSなどを利用し、使用率だけでなく、自動拡張可能量、ストレージの空き容量、増加速度も監視します。</p>


<h3 class="wp-block-heading">概算→補正→実測で容量見積の精度を上げる</h3>


<p class="wp-block-paragraph">容量見積は一度で完成するものではありません。実務では、次の3段階で精度を高めます。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>段階</th>
<th>方法</th>
<th>目的</th>
</tr>
</thead>
<tbody>
<tr>
<td>① 概算</td>
<td>Excelによる件数・レコード長からの算出</td>
<td>必要容量の全体像を把握</td>
</tr>
<tr>
<td>② 補正</td>
<td>DBMS_SPACE.CREATE_TABLE_COST</td>
<td>Oracleの格納特性を考慮</td>
</tr>
<tr>
<td>③ 実測</td>
<td>移行リハーサル・性能試験</td>
<td>実際の使用容量と比較</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph"><strong>第1段階：概算</strong></p>


<p class="wp-block-paragraph">前述のように、基本設計・詳細設計の初期段階では、わかっている件数とレコード長から概算し、未確定部分は暫定値で補います。</p>


<p class="wp-block-paragraph"><strong>第2段階：Oracleの標準機能で補正</strong></p>


<p class="wp-block-paragraph">Oracle 19cではDBMS_SPACE.CREATE_TABLE_COSTを利用して、平均行サイズと想定件数からテーブル容量を推定できます。</p>


<p class="wp-block-paragraph">例えば、平均行サイズ420バイト、270万件の場合は次のように指定します。</p>


<pre class="wp-block-code"><code>SET SERVEROUTPUT ON
DECLARE
  v_used_bytes  NUMBER;
  v_alloc_bytes NUMBER;
BEGIN
  DBMS_SPACE.CREATE_TABLE_COST(
    tablespace_name =&gt; 'APP_DATA',
    avg_row_size    =&gt; 420,
    row_count       =&gt; 2700000,
    pct_free        =&gt; 10,
    used_bytes      =&gt; v_used_bytes,
    alloc_bytes     =&gt; v_alloc_bytes
  );
  DBMS_OUTPUT.PUT_LINE(
    'USED_BYTES=' || v_used_bytes
  );
  DBMS_OUTPUT.PUT_LINE(
    'ALLOC_BYTES=' || v_alloc_bytes
  );
END;
/
</code></pre>


<p class="wp-block-paragraph">※ APP_DATAは説明用の表領域名です。実際には対象PDB内の表領域を指定します。</p>


<p class="wp-block-paragraph">Oracle公式マニュアルでは、以下のように説明されています。</p>


<ul class="wp-block-list">
	<li>USED_BYTES：データが使用する容量。ブロック管理情報やPCTFREEなどのオーバーヘッドを含む。</li>
	<li>ALLOC_BYTES：表領域のエクステント割り当て特性を考慮した容量。</li>
</ul>


<p class="wp-block-paragraph">ただし、索引や行外LOBの容量まで自動的に求まるわけではありません。</p>


<p class="wp-block-paragraph">このSQLはOracle 19c実機での確認用です。実行環境で得た値とExcelの概算値を比較し、必要に応じて見積モデルを補正します。</p>


<p class="wp-block-paragraph"><strong>第3段階：移行リハーサル・性能試験で実測</strong></p>


<p class="wp-block-paragraph">実際のデータを投入した後は、DBA_SEGMENTSでテーブル・索引・LOBの割当容量を確認します。</p>


<p class="wp-block-paragraph">PDB内に接続してDBA_SEGMENTSを確認する方法のほか、CDBルートからCDB_SEGMENTSをCON_ID付きで確認する方法もあります。</p>


<p class="wp-block-paragraph">さらに、DBMS_SPACE.SPACE_USAGEによるセグメント内の空き領域、性能試験時のUNDO・TEMP使用量、REDO生成量などを確認します。</p>


<p class="wp-block-paragraph">DBA_SEGMENTS.BYTESは割当済み容量であり、純粋な業務データ量ではありません。そのため、見積と比較する際には、何を測定した容量なのかを揃える必要があります。</p>


<p class="wp-block-paragraph">こうして概算から実測までの差異を確認し、その理由を設計書に反映すれば、今回の容量設計だけでなく、次のプロジェクトでも活用できるノウハウとして蓄積できます。</p>


<h2 class="wp-block-heading">物理設計で実際に発生した課題と解決方法</h2>


<p class="wp-block-paragraph">物理設計では、教科書どおりの手順だけでは設計値を決められないことがあります。</p>


<p class="wp-block-paragraph">ここでは実際の課題管理表と物理設計書をもとに、同時接続数、Data Guard、設計変更の3つの事例を紹介します。各数値は設定値の推奨例ではなく、入力情報をどのように解釈して判断したかを示す材料です。</p>


<h3 class="wp-block-heading">端末数・同時アクセス数からPROCESSESを決めてはいけない</h3>


<p class="wp-block-paragraph"><code>PROCESSES</code>の設計では、利用端末数、同時アクセス数、DBへの最大接続数を区別する必要があります。</p>


<p class="wp-block-paragraph"><strong>【実務事例：400台・250接続・30同時アクセス】</strong></p>


<p class="wp-block-paragraph">実案件の課題管理表には、次の回答が記録されていました。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>項目</th>
<th style="text-align: right;">回答値</th>
<th>主に関係する設計</th>
</tr>
</thead>
<tbody>
<tr>
<td>総端末数</td>
<td style="text-align: right;">400台</td>
<td>システムの利用規模</td>
</tr>
<tr>
<td>同時接続可能台数</td>
<td style="text-align: right;">250台</td>
<td>アプリケーション接続数</td>
</tr>
<tr>
<td>同時アクセス台数</td>
<td style="text-align: right;">30台</td>
<td>同時実行負荷、CPU・PGA等</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">250台が同時接続可能でも、実際に処理を実行する台数が30台程度なら、接続数とアクティブな処理量を分けて考える必要があります。</p>


<p class="wp-block-paragraph">さらに、DBには利用者向けシステム以外からも接続が発生します。</p>


<p class="wp-block-paragraph">実際の物理設計書では、接続元ごとの上限を次のように積み上げていました。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>接続元</th>
<th style="text-align: right;">最大想定接続数</th>
</tr>
</thead>
<tbody>
<tr>
<td>Webアプリケーション基盤・業務利用者向け</td>
<td style="text-align: right;">250</td>
</tr>
<tr>
<td>Webアプリケーション基盤・別系統</td>
<td style="text-align: right;">50</td>
</tr>
<tr>
<td>C#アプリケーション</td>
<td style="text-align: right;">40</td>
</tr>
<tr>
<td>バッチサーバ</td>
<td style="text-align: right;">20</td>
</tr>
<tr>
<td>運用管理</td>
<td style="text-align: right;">10</td>
</tr>
<tr>
<td><strong>合計</strong></td>
<td style="text-align: right;"><strong>370</strong></td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">250はDB全体の最大接続数ではなく、一つの接続元の上限でした。</p>


<p class="wp-block-paragraph">これに、案件の環境で確認したバックグラウンドプロセス約40と、Data Guard関連の想定10を加えています。</p>


<p class="wp-block-paragraph">370＋40＋10＝420</p>


<p class="wp-block-paragraph">最終的には約19％の余裕を見込み、<code>PROCESSES=500</code>を採用しました。</p>


<p class="wp-block-paragraph">また、<code>SESSIONS</code>は既定の計算式から772としました。</p>


<p class="wp-block-paragraph"><code>1.5×500＋22＝772</code></p>


<p class="wp-block-paragraph">Oracle 19cでもこの算出式を利用できます。ただし、CDB/PDB構成や有効機能でバックグラウンドプロセス数が変わるため、事例の50を固定値とせず、対象環境の<code>V$PROCESS</code>などで実数を確認します。</p>


<p class="wp-block-paragraph">重要なのは、<strong>最大接続数と同時実行負荷は別の設計指標</strong>であることです。</p>


<h3 class="wp-block-heading">Data Guardと夜間バッチのREDOをどう設計するか</h3>


<p class="wp-block-paragraph">Data Guardでは、スタンバイの用途によって設計が変わります。</p>


<p class="wp-block-paragraph">障害時の切替先として利用するのか、日常的な参照処理に利用するのかによって、適切な構成を選択します。</p>


<p class="wp-block-paragraph"><strong>【実務事例：参照用DBにロジカル・スタンバイを採用】</strong></p>


<p class="wp-block-paragraph">実際の案件では、本番DBとは別に、利用者がSQLによる参照処理を行うDBを用意していました。</p>


<p class="wp-block-paragraph">この参照用DBにはData Guardのロジカル・スタンバイを採用しました。Oracle 19cで同様の要件を設計する際には、後述する他の参照用DB構成とも比較して選択します。</p>


<p class="wp-block-paragraph">ロジカル・スタンバイでは、DBをオープンしたままSQL Applyによって変更を反映できます。</p>


<p class="wp-block-paragraph">ただし、フィジカル・スタンバイのREDO Applyとは異なり、REDOから論理的な変更を再構成し、SQLを実行して反映します。</p>


<p class="wp-block-paragraph">そのため、大量の更新を伴うバッチでは、REDOを受信する速度だけでなく、SQL Applyの処理性能が同期完了時間を左右します。</p>


<p class="wp-block-paragraph">また、更新対象の行を効率的に特定できるよう、主キーや一意キーの有無も重要です。適切なキーがない表では、更新や削除の適用時にフルスキャンが発生し、性能が低下する可能性があります。</p>


<p class="wp-block-paragraph">ロジカル・スタンバイでは、更新行を識別するためのサプリメンタル・ロギングも必要となり、REDO生成量に影響します。</p>


<p class="wp-block-paragraph">加えて、すべてのデータ型や表構成をSQL Applyで扱えるわけではありません。対象外の表は<code>DBA_LOGSTDBY_UNSUPPORTED</code>などで確認できます。</p>


<p class="wp-block-paragraph"><strong>夜間バッチ終了時点までの反映をSCNで確認する</strong></p>


<p class="wp-block-paragraph">この案件では、参照用DBへの反映を日次で実施していました。</p>


<p class="wp-block-paragraph">物理設計書に記載された手順は、次のとおりです。</p>


<ol class="wp-block-list">
	<li>夜間バッチ終了後、プライマリでログスイッチする。</li>
	<li>アーカイブログの最終SCNを取得する。</li>
	<li>スタンバイ側でREDO適用を開始する。</li>
	<li>適用済みSCNが目標SCNに到達したことを確認する。</li>
	<li>REDO適用を停止する。</li>
</ol>


<p class="wp-block-paragraph">ここでいうSCNは、夜間バッチ終了時点までの更新が反映されたかを確認する基準です。</p>


<p class="wp-block-paragraph">単にREDOが届いたことではなく、<strong>目標SCNまでSQL Applyが完了したこと</strong>を確認する運用でした。</p>


<p class="wp-block-paragraph"><strong>FORCE LOGGINGと大量バッチの問題</strong></p>


<p class="wp-block-paragraph">実案件の夜間バッチでは、中間ファイルを作成し、JavaプログラムまたはSQL*Loaderを使ってDBへデータを格納していました。</p>


<p class="wp-block-paragraph">ダイレクト・パス・インサートなどの大量投入処理では、NOLOGGINGによってREDO生成量を抑制できる場合があります。</p>


<p class="wp-block-paragraph">しかし、必要なREDOが生成されないと、スタンバイ側で投入データを正しく再現できない可能性があります。</p>


<p class="wp-block-paragraph">このため、この案件ではData Guardとの整合性を考慮し、FORCE LOGGINGを有効にしました。</p>


<p class="wp-block-paragraph">一方、FORCE LOGGINGやサプリメンタル・ロギングにより、REDO量、アーカイブログ容量、転送負荷が増える可能性があります。</p>


<p class="wp-block-paragraph"><strong>【実務事例：1日約100万件を基準にREDO量を算出】</strong></p>


<p class="wp-block-paragraph">課題管理表では、年次の大量処理として、1日約100万件を想定していました。</p>


<p class="wp-block-paragraph">REDO量は、現行システムで同等の処理を実行した際のアラートログをもとに算出し、アーカイブログの保存期間は1週間としました。</p>


<p class="wp-block-paragraph">アラートログのログスイッチ情報を利用した見積は概算ですが、実績に基づく設計値を得るための方法です。</p>


<p class="wp-block-paragraph">Oracle 19cでは、利用権のあるAWRやSTATSPACKの<code>redo size</code>、実際のバッチ試験などを組み合わせて検証します。</p>


<p class="wp-block-paragraph"><strong>【実務事例：ネットワーク転送負荷の判断】</strong></p>


<p class="wp-block-paragraph">REDO転送については、業務用と運用用のネットワークが分離されていないことが懸念事項となりました。</p>


<p class="wp-block-paragraph">この案件では「問題ないレベルと思われる」という定性的な判断で課題を完了しましたが、REDO転送量と回線帯域を比較した定量的な根拠は記録されていません。</p>


<p class="wp-block-paragraph">19cで同様のシステムを設計するなら、次の項目を確認します。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>確認項目</th>
<th>設計上の目的</th>
</tr>
</thead>
<tbody>
<tr>
<td>ピーク時のREDO生成速度</td>
<td>必要な転送帯域の算出</td>
</tr>
<tr>
<td>実効ネットワーク帯域</td>
<td>他業務との競合を含めた余裕の確認</td>
</tr>
<tr>
<td>REDO転送遅延</td>
<td>スタンバイへの到達時間の確認</td>
</tr>
<tr>
<td>SQL Applyの処理速度</td>
<td>日次同期の所要時間の確認</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">特に、大量バッチ後のSQL Applyの所要時間は実測し、同期の完了時刻に間に合うかを確認します。</p>


<p class="wp-block-paragraph">なお、19cで参照用DBを構成する場合は、ロジカル・スタンバイに加え、フィジカル・スタンバイとActive Data Guard、GoldenGateなどの論理レプリケーションも比較対象となります。要件、ライセンス、対応データ型、同期方式を踏まえて選択します（前述のライセンスの設計判断例を参照）。</p>


<h3 class="wp-block-heading">設計の前提条件が変わったときの対応</h3>


<p class="wp-block-paragraph">物理設計では、設定値や構成が後から変更されることがあります。</p>


<p class="wp-block-paragraph">重要なのは、変更後の値だけでなく、変更理由と検証すべき事項を残すことです。</p>


<p class="wp-block-paragraph"><strong>【実務事例：UNDOを20GBから10GBへ変更】</strong></p>


<p class="wp-block-paragraph">課題管理表には、UNDO表領域を20GBから10GBへ変更した記録があります。</p>


<p class="wp-block-paragraph">理由は、システム全体の容量を考慮したためです。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>管理項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>変更前</td>
<td>UNDO表領域20GB</td>
</tr>
<tr>
<td>変更後</td>
<td>UNDO表領域10GB</td>
</tr>
<tr>
<td>事例の変更理由</td>
<td>全体の容量を考慮</td>
</tr>
<tr>
<td>確認すべきリスク</td>
<td>UNDO不足、長時間SQLへの影響</td>
</tr>
<tr>
<td>19cでの検証方法</td>
<td><code>V$UNDOSTAT</code>等による使用量の確認</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">この事例は、個別の表領域に求められる容量だけでなく、ストレージ全体の制約も設計値に影響することを示しています。</p>


<p class="wp-block-paragraph">19cでは<code>V$UNDOSTAT</code>などを確認し、必要なUNDO保持期間を満たせるか検証します。</p>


<p class="wp-block-paragraph"><strong>必要資料は設計開始の条件ではなく、検証の材料とする</strong></p>


<p class="wp-block-paragraph">実案件の課題管理表では、テーブル定義やデータ件数に関する資料について、設計済みの容量が十分かどうかを確認するために必要であり、資料がなくても設計を進められる、という考え方が示されていました。</p>


<p class="wp-block-paragraph">つまり、資料が揃うまで設計を止めるのではなく、暫定的な前提を置いて設計し、資料の受領後にその妥当性を検証するという進め方です。</p>


<p class="wp-block-paragraph"><strong>LOBの再見積では格納方式や運用方針も見直す</strong></p>


<p class="wp-block-paragraph">LOB容量を再見積した際には、専用表領域を設けず、テーブルと同じ表領域へ格納する方向も検討されました。</p>


<p class="wp-block-paragraph">また、帳票データのパージ方針は、容量を再見積した後に判断することになっていました。</p>


<p class="wp-block-paragraph">このように、前提条件が変われば、単なる設定値だけでなく、表領域構成や保存・削除方式まで見直す必要があります。</p>


<p class="wp-block-paragraph">課題管理表は、未確定事項を管理するだけでなく、<strong>設計判断の根拠と変更の経緯を残すための成果物</strong>として活用します。</p>


<h2 class="wp-block-heading">まとめ｜データベースの物理設計で重要なこと</h2>


<p class="wp-block-paragraph">データベースの物理設計は、表領域や初期化パラメータの設定値を埋める作業ではありません。性能・容量・可用性・運用性の要件を踏まえ、根拠を持って設計判断を積み重ねる工程です。</p>


<p class="wp-block-paragraph">本記事では、Oracle Database 19cを例に、主な設計項目、容量見積の方法、実際のプロジェクトで発生した課題を紹介しました。</p>


<p class="wp-block-paragraph">Oracle 19cでは、エディションとライセンス、CDB/PDBの設計単位を最初に確認し、その制約を踏まえて表領域やメモリなどを設計します。</p>


<p class="wp-block-paragraph">実務で特に重要なのは、<strong>必要な情報がすべて揃っていなくても、設計を止めないこと</strong>です。</p>


<p class="wp-block-paragraph">テーブル件数や接続数が未確定であれば、暫定値とその前提条件を課題管理表に記録し、設計を進めます。そして資料が提供された段階で、見積や設定値の妥当性を検証します。</p>


<p class="wp-block-paragraph">また、別案件の設計値をそのまま流用しないことも重要です。</p>


<p class="wp-block-paragraph">例えば、別案件の設計書に16KBのDBブロックサイズや固定エクステントが記載されていても、その値を流用せず、平均行長、アクセス特性、運用要件を確認します。フルスキャンの多さだけでは大きなブロックを選ぶ十分な根拠にはならず、代表的なSQLでの検証が必要です。</p>


<p class="wp-block-paragraph">物理設計の品質を左右するのは、設定値そのものだけではありません。<strong>なぜその値を選んだのか、どの情報を根拠にしたのかを説明できること</strong>が、構築・試験・運用まで通用する設計につながります。</p>


<hr class="wp-block-separator has-alpha-channel-opacity" />

<p class="wp-block-paragraph"><strong>参考資料｜Oracle Database 19c公式マニュアル</strong></p>


<ul class="wp-block-list">
	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/Licensing-Information.html">Licensing Information</a> — エディション、オプション、管理パックの利用条件</li>
	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_SPACE.html">DBMS_SPACE</a> — CREATE_TABLE_COSTなどの容量見積機能</li>
	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/DBA_TABLES.html">DBA_TABLES</a> — テーブル統計情報（列定義の詳細はALL_TABLESを参照）</li>
	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/physical-database-limits.html">Physical Database Limits</a> — SMALLFILE／BIGFILE等の物理的上限</li>
	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/FAST_START_MTTR_TARGET.html">FAST_START_MTTR_TARGET</a> — クラッシュリカバリ時間の目標</li>
	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/SESSIONS.html">SESSIONS</a> — セッション数とPROCESSESの関係</li>
	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/DB_FILE_MULTIBLOCK_READ_COUNT.html">DB_FILE_MULTIBLOCK_READ_COUNT</a> — マルチブロック読み込み</li>
	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/managing-oracle-data-guard-logical-standby-databases.html">Managing a Logical Standby Database</a> — SQL Applyの処理方式と運用</li>
	<li><a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/backing-up-database.html">Backing Up the Database</a> — RMANのSECTION SIZEとマルチセクション・バックアップ</li>
</ul>


<p class="wp-block-paragraph"><strong>関連記事</strong></p>


<ul class="wp-block-list">
	<li><a href="https://sys-univ.com/dev/oracle-19c-partition-statistics-execution-plan/">Oracle 19c更改後に実行計画が変わる――パーティション削除時の統計情報更新と影響調査漏れ</a></li>
	<li><a href="https://sys-univ.com/dev/performance-test/">性能テストの進め方｜負荷モデル・テストデータ・評価方法を実務で解説</a></li>
	<li><a href="https://sys-univ.com/dev/opedesign/">運用設計とは？運用設計書の目次サンプルと項目一覧｜システム基盤エンジニア視点</a></li>
	<li><a href="https://sys-univ.com/aws/rdsforora/">RDS for Oracleを採用したら、オンプレ運用の前提が通用しなかった｜開発中に見えた設計ギャップと代替アプローチ</a></li>
	<li><a href="https://sys-univ.com/dev/security/">セキュリティ要件定義の進め方｜リスクアセスメントから対策・残存リスクを決める方法</a></li>
</ul>

<p>&nbsp;</p>]]></content:encoded>
					
					<wfw:commentRss>https://sys-univ.com/dev/db-physical-design/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Amazon Cognito DRの落とし穴｜バックアップがあってもログインできない理由</title>
		<link>https://sys-univ.com/tec/aws-dr-cognito-mrr/</link>
					<comments>https://sys-univ.com/tec/aws-dr-cognito-mrr/#respond</comments>
		
		<dc:creator><![CDATA[ナギ]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 09:05:03 +0000</pubDate>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[テクノロジー]]></category>
		<guid isPermaLink="false">https://sys-univ.com/?p=3462</guid>

					<description><![CDATA[災害対策を検討するとき、「バックアップを別リージョンに保存している」「DR側にもWeb/APやDBを用意している」という説明をよく聞きます。 データを遠隔地に保全し、サーバやデータベースを別リージョンで起動できるようにす [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>災害対策を検討するとき、「バックアップを別リージョンに保存している」「DR側にもWeb/APやDBを用意している」という説明をよく聞きます。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>データを遠隔地に保全し、サーバやデータベースを別リージョンで起動できるようにすることは重要です。ただ、それだけで業務を再開できるとは限りません。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>DBが復旧している。Web/APも起動している。それでも利用者がログインできなければ、オンラインサービスは利用できません。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>DRで確認すべきなのは、リソースが存在するかではなく、<strong>利用者が認証され、必要な処理を実行し、安全に業務を継続できる一連の経路が成立するか</strong>です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Amazon Cognitoは、この問題を分かりやすく示す例です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>本記事では、実際のDR検討で経験した問題と、2026年に提供開始されたAmazon Cognito User PoolsのMulti-Region Replication（MRR）を題材に、AWSのDR設計で何を確認すべきかを整理します。</p>
<!-- /wp:separator -->
<!-- wp:heading -->
<h2 class="wp-block-heading">1. DRは「データ」「起動」「業務経路」の3レベルで考える</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>DRを考えるときは、どこまで復旧できれば「DRが成立した」と考えるのかを3つのレベルに分けると整理しやすくなります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>レベル1は、<strong>データが残っている状態</strong>です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>データベースのバックアップやスナップショット、オブジェクトストレージ、AMIなどを遠隔リージョンへ保管し、大規模障害でもデータや復旧資材を失わないようにします。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>レベル2は、<strong>システムを起動できる状態</strong>です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>DRリージョンでネットワーク、サーバ、コンテナ、データベースなどを起動し、アプリケーションが動作できるところまで復旧します。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>レベル3は、<strong>安全に業務経路が成立する状態</strong>です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>利用者がシステムへ到達できるか。認証できるか。適切な権限でAPIやDBへアクセスできるか。KMS、Secrets、外部IdP、外部APIなどの依存先がDRリージョンでも利用できるか。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>ここまで確認して初めて、業務を再開できます。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p><strong>バックアップがあることは、DRの一部にすぎません。</strong></p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":3} -->
<div id="attachment_3467" style="width: 1610px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-3467" class="wp-image-3467 size-full" src="https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels.png" alt="DRをデータの保全、システムの起動、安全な業務経路の成立という3レベルで整理した図" width="1600" height="900" srcset="https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels.png 1600w, https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/10/1_dr-three-levels-376x212.png 376w" sizes="(max-width: 1600px) 100vw, 1600px" /><p id="caption-attachment-3467" class="wp-caption-text">図　DRは「データが残る」「システムが起動する」だけではなく、「安全に業務経路が成立する」ところまで確認する</p></div>
<!-- /wp:paragraph -->
<!-- wp:paragraph --><!-- /wp:separator -->
<!-- wp:heading -->
<h2 class="wp-block-heading">2. DRではリソース一覧ではなく「1トランザクション」を追う</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>DR設計では、EC2、RDS、S3、Lambdaなど、AWSリソース単位で対策を並べがちです。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>リソース単位の確認は必要ですが、それだけでは依存関係を見落とします。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>見るべきなのは、<strong>利用者が1回の業務処理を完了するまでに何を通るのか</strong>です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Webシステムなら、利用者はDNS、WAFやロードバランサー、Web/APを通り、認証基盤で認証された後、DBや外部APIを使って業務処理を行います。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>認証基盤が外部IdP、メール、SMS、Lambda Triggerへ依存する構成もあります。KMS、Secrets Manager、証明書は複数の処理から参照される共通依存です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>監視、ログ、運用管理端末、管理アクセスもDR時に必要になります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>2026年9月の<a href="https://aws.amazon.com/blogs/security/architecting-resilient-authentication-with-amazon-cognito-multi-region-replication/">AWS Security Blog</a>記事でも、Cognito MRRを利用する場合、Lambda、WAF、SNS、SES、CloudWatchなどのリージョナルな構成を<strong>別リージョンのレプリカ側</strong>で準備する必要があると説明されています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>DR設計で見る単位を、</p>
<!-- /wp:paragraph -->
<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p><strong>何のリソースを複製したか</strong></p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->
<!-- wp:paragraph -->
<p>から、</p>
<!-- /wp:paragraph -->
<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p><strong>利用者が業務を完了するまでに、どの依存先を通るか</strong></p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->
<!-- wp:paragraph -->
<p>へ変えることが重要です。</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":3} -->
<div id="attachment_3470" style="width: 1610px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-3470" class="wp-image-3470 size-full" src="https://sys-univ.com/wp-content/uploads/2026/10/2dr-business-path.png" alt="利用者からDNS、WAF、Web/AP、Amazon Cognito、DBへ至る業務経路と、外部IdPやKMSなどの依存関係を示した図" width="1600" height="1050" srcset="https://sys-univ.com/wp-content/uploads/2026/10/2dr-business-path.png 1600w, https://sys-univ.com/wp-content/uploads/2026/10/2dr-business-path-500x328.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/2dr-business-path-800x525.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/2dr-business-path-300x197.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/2dr-business-path-768x504.png 768w, https://sys-univ.com/wp-content/uploads/2026/10/2dr-business-path-1536x1008.png 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /><p id="caption-attachment-3470" class="wp-caption-text">図　DRでは利用者からDBまでの本流だけでなく、認証、外部IdP、KMS、Secrets、外部API、監視など、その業務経路を支える依存先まで確認する</p></div>

<p class="wp-block-heading" data-wp-editing="1">認証フローは構成によって異なります。Amazon CognitoのManaged Loginでは、ブラウザがCognitoのドメインへ直接遷移する場合があるため、この図は依存関係を理解するための概念図です。</p>
<!-- /wp:separator -->
<!-- wp:heading -->
<h2 class="wp-block-heading">3. 実案件で直面した「データは送れるが、認証できない」問題</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Amazon Cognitoが大阪リージョンへ対応する前の案件で、東京リージョン全体が利用できなくなった場合に、大阪リージョンで業務を継続する構成を検討しました。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Cognitoが大阪リージョンで利用可能になったのは2023年9月1日です。今回の案件はそれより前の検討でした。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>AWSの発表は<a href="https://aws.amazon.com/jp/about-aws/whats-new/2023/09/amazon-cognito-new-regions/">What&#8217;s New</a>で確認できます。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>私がこの案件で強く印象に残ったのは、<strong>データを大阪へ持っていけることと、大阪で業務を継続できることは別だった</strong>という点です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Web/APやデータ、復旧資材を大阪側へ持つ構成は検討できました。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>しかし当時はAmazon Cognitoを大阪リージョンで利用できず、認証を大阪側だけで完結できませんでした。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Web/APやDBを大阪側に用意しても、利用者がログインできなければオンライン業務は成立しません。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>結果として、大阪側ではデータを遠隔保全するところまでとし、認証を含めて大阪側で業務を継続するDR構成にはできませんでした。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>この経験は、前章で整理した「データが残る」だけでは、<strong>「安全に業務経路が成立する」ところには届かない例</strong>です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>DR要件を「別リージョンにデータを保管する」とだけ定義すると、この違いを見落とします。</p>
<!-- /wp:separator -->
<!-- wp:heading -->
<h2 class="wp-block-heading">4. Cognito MRRで何が変わったのか</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>2026年6月、Amazon Cognito User PoolsにMulti-Region Replication（MRR）が追加されました。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>提供開始時の概要は<a href="https://aws.amazon.com/about-aws/whats-new/2026/06/amazon-cognito-multi-region/">AWS What&#8217;s New</a>で確認できます。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>MRRではPrimary User Poolを権威あるユーザープールとし、ユーザー属性、ハッシュ化された認証情報、グループ、App Client、外部IdP設定などをSecondaryへ複製します。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>レプリケーションはPrimaryからSecondaryへの一方向です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Secondaryではサインインやトークン発行などの認証処理を継続できますが、Primaryとまったく同じ機能を持つわけではありません。</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":3} -->
<div id="attachment_3471" style="width: 1546px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-3471" class="wp-image-3471 size-full" src="https://sys-univ.com/wp-content/uploads/2026/10/a2eaaf27bf0c27a5aac22ebff9c9f03a.png" alt="Amazon Cognitoの認証基盤がプライマリだけにある構成とMulti-Region Replication利用時を比較した図" width="1536" height="1024" srcset="https://sys-univ.com/wp-content/uploads/2026/10/a2eaaf27bf0c27a5aac22ebff9c9f03a.png 1536w, https://sys-univ.com/wp-content/uploads/2026/10/a2eaaf27bf0c27a5aac22ebff9c9f03a-500x333.png 500w, https://sys-univ.com/wp-content/uploads/2026/10/a2eaaf27bf0c27a5aac22ebff9c9f03a-800x533.png 800w, https://sys-univ.com/wp-content/uploads/2026/10/a2eaaf27bf0c27a5aac22ebff9c9f03a-300x200.png 300w, https://sys-univ.com/wp-content/uploads/2026/10/a2eaaf27bf0c27a5aac22ebff9c9f03a-768x512.png 768w" sizes="(max-width: 1536px) 100vw, 1536px" /><p id="caption-attachment-3471" class="wp-caption-text">図　MRRにより認証基盤を別リージョンへ複製できるようになった。ただし、レプリケーションだけでDRが完成するわけではなく、フェイルオーバー方式や周辺依存を別途設計する必要がある</p></div>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>以下は、<strong>2026年10月時点のAmazon Cognito Developer Guide</strong>に基づく主な前提と制約です。</p>
<!-- /wp:paragraph -->
<!-- wp:table -->
<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>観点</th>
<th>MRRで確認する内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>Feature Plan</td>
<td>EssentialsまたはPlusが必要。MRRは追加料金のアドオン</td>
</tr>
<tr>
<td>暗号化</td>
<td>Multi-RegionのCustomer Managed KMS Keyが必要</td>
</tr>
<tr>
<td>User Pool</td>
<td>新しいCognito基盤に対応したUser Poolが対象。対象外の既存PoolはAWS側のアップグレードが必要</td>
</tr>
<tr>
<td>Secondary数</td>
<td>1つまで</td>
</tr>
<tr>
<td>初期状態</td>
<td>Secondaryは<code>INACTIVE</code>で作成され、リージョン固有設定を確認してから<code>ACTIVE</code>へ変更</td>
</tr>
<tr>
<td>データ同期</td>
<td>Primary→Secondary。結果整合のため短時間の同期遅延があり得る</td>
</tr>
<tr>
<td>Secondaryでのユーザー作成</td>
<td>Signup、Adminによる新規作成とも不可</td>
</tr>
<tr>
<td>ユーザー変更</td>
<td>パスワードリセット、プロフィール変更はSecondaryでは不可</td>
</tr>
<tr>
<td>Federated User</td>
<td>Primaryで一度サインインしたユーザーのみSecondaryでサインイン可能</td>
</tr>
<tr>
<td>MFA</td>
<td>TOTP MFAはSecondaryでは非対応</td>
</tr>
<tr>
<td>ロックアウト</td>
<td>パスワード認証のログイン失敗回数はリージョン間で同期されない</td>
</tr>
<tr>
<td>リージョン固有設定</td>
<td>Email、SMS、Lambda Trigger、Tags、Log export、WAFなどはSecondary側でも設定が必要</td>
</tr>
</tbody>
</table>
</figure>
<!-- /wp:table -->
<!-- wp:paragraph -->
<p>詳細な制約は<a href="https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-multi-region.html">Amazon Cognito Developer Guide</a>に整理されています。</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">issuerもDRの依存関係になる</h3>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>MRRを検討するときはOIDC issuerにも注意が必要です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Cognitoにはoriginal issuerとupdated issuerがあり、AWSはMRRを含むUser Poolでupdated issuerを推奨しています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>updated issuerではOIDC discoveryとJWKSを複数リージョンで提供できます。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>MRR自体はoriginal issuerでも利用できます。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>ただしoriginal issuerのOIDC discovery endpointとJWKS endpointは単一リージョンに紐づきます。リージョン障害時にはJWKSを取得できない可能性があり、アプリケーションが公開鍵を動的に取得してトークン署名を検証する構成では影響を受ける可能性があります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>updated issuerへ移行できない場合、AWS Security Blogでは、アプリケーションのトークン検証層でJWKSをキャッシュする方法を緩和策として挙げています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>認証サービスがSecondaryで動作しても、トークンを検証する側が参照するJWKSまで確認しなければ、認証経路全体の可用性は評価できません。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>また、<strong>2026年10月時点</strong>の<a href="https://docs.aws.amazon.com/cognito/latest/developerguide/federation-endpoints.html">Developer Guide</a>では、updated issuerはApplication Load BalancerのCognito認証、およびAmazon API Gateway REST APIのCognito authorizerとは互換性がありません。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>サービス仕様が変わる可能性があるため、実装時には最新ドキュメントの確認が必要です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>ALB認証の制約とJWKSキャッシュは別の論点です。JWKSキャッシュはアプリケーション側のトークン検証層に対する対策であり、ALB認証の非互換を解消する方法ではありません。</p>
<!-- /wp:separator -->
<!-- wp:heading -->
<h2 class="wp-block-heading">5. 東京→大阪DRで確認すべきこと</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>2026年6月のMRR提供開始時点では、対応リージョンに東京は含まれていましたが、大阪は含まれていませんでした。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>提供開始時点の対象リージョンは<a href="https://aws.amazon.com/about-aws/whats-new/2026/06/amazon-cognito-multi-region/">AWS What&#8217;s New</a>で確認できます。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>ここで重要なのは、</p>
<!-- /wp:paragraph -->
<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p><strong>「大阪リージョンでCognitoを利用できる」ことと、「東京のCognito User Poolを大阪へMRRできる」ことは別</strong></p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->
<!-- wp:paragraph -->
<p>という点です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>東京→大阪を前提にFull-stack DRを設計する場合、MRRの対応リージョンを設計時点で確認する必要があります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>対応していなければ、MRRを利用できる別リージョンの組み合わせへ設計を変更する方法があります。この場合、ユーザー情報が別リージョンへ複製されるため、データ所在や組織内の規程との整合も確認が必要です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>AWS Security Blogでも、Secondaryのリージョンを選ぶ際にはdata sovereigntyやresidency要件を確認するよう説明しています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>MRRを使わず、別User Poolを自前で同期する方法も考えられます。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>AWSは、MRR以前の手動エクスポートやインポートには、データ露出や不整合のリスク、利用者へのパスワードリセットといった課題があったと<a href="https://aws.amazon.com/blogs/aws/improve-your-application-resilience-with-amazon-cognito-multi-region-replication/">AWS News Blog</a>で説明しています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>単に「同期処理を作ればよい」と考えず、運用負荷とセキュリティまで含めて評価する必要があります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>MRRの対象リージョンは追加される可能性があるため、実装時には最新のAWS公式情報を確認してください。</p>
<!-- /wp:separator -->
<!-- wp:heading -->
<h2 class="wp-block-heading">6. 「認証だけのDR」と「システム全体のDR」は違う</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>2026年9月のAWS Security Blogでは、Cognitoのフェイルオーバーを<strong>Authentication-only failover</strong>と<strong>Full-stack failover</strong>に分けています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Authentication-only failoverは、アプリケーション本体を同じリージョンで稼働させたまま、認証だけをCognitoのSecondaryへ切り替える方式です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Full-stack failoverは、compute、data store、API、authenticationなど、アプリケーション全体を別リージョンへ切り替える方式です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Lambda TriggerがリージョナルなDynamoDBへアクセスする場合など、認証処理の周囲にある依存先もDR側で成立させる必要があります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>先ほどの東京→大阪の実案件は、東京リージョン全体が利用できなくなることを想定していました。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>求めていたのは<strong>Full-stack failover</strong>です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>CognitoのMRRが成立しても、Web/AP、DB、API、Lambda、KMS、Secrets、外部サービスなどがDRリージョンへ切り替わらなければ、Full-stack DRにはなりません。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>複数コンポーネントの切替を協調させる仕組みとして、AWSは**Amazon Application Recovery Controller（ARC）**も紹介しています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>認証、compute、database、APIなどをリカバリープランとして扱い、切替を協調させる選択肢です。</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">DR時だから認証を弱めてよいわけではない</h3>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>DRでは可用性の回復が優先されやすく、「ログインできないなら認証を一時的に緩める」という発想が出ることがあります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>避けるべき設計です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>情報セキュリティでは、可用性だけでなく機密性と完全性も維持する必要があります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>MRRのSecondaryでTOTP MFAを利用できないなら、障害発生後に認証水準を下げるのではなく、SMS OTP、Email OTP、passkeyなど、利用可能な代替方式を平時に設計します。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>SMSを使う場合も、Secondary側でSNS設定や送信元IDの登録が必要です。登録に時間がかかる場合があるため、DR発動後に準備するものではありません。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>フェイルオーバー先ではPrimaryとは別に失敗回数が管理されます。<strong>ロックアウトまでの失敗回数が引き継がれないため、切替後のロックアウト判定はPrimaryの状態と一致しない場合があります。</strong></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>DRでは、可用性だけでなく、認証・アクセス制御の挙動が切替前後でどう変わるかも確認する必要があります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>セキュリティリスクから要件を導き、残存リスクまで評価する考え方については、次の記事で整理しています。</p>

<a href="https://sys-univ.com/dev/security/" title="セキュリティ要件定義の進め方｜リスクアセスメントから対策・残存リスクを決める方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/09/a730f6ed9dc0d4e45d16222f81050c32-376x212.png 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">セキュリティ要件定義の進め方｜リスクアセスメントから対策・残存リスクを決める方法</div><div class="blogcard-snippet internal-blogcard-snippet">セキュリティ要件定義を、RFPや上位基準を起点に、リスクアセスメント、差異評価、対策、残存リスクまで具体化する方法を解説。脅威・脆弱性の分析、関係者との合意、変更時の再アセスメントまで実務例で整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.09.17</div></div></div></div></a>
<!-- /wp:separator -->
<!-- wp:heading -->
<h2 class="wp-block-heading">7. フェイルオーバーは「何を異常とみなすか」まで設計する</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Managed LoginやFederationを利用する構成では、Cognito MRRはRoute 53 Health Checkを利用したフェイルオーバーに対応しています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Custom DomainだけでなくPrefix Domainでも利用できます。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Health Checkを設定し、Unhealthyになった場合、CognitoはSecondaryを利用する認証経路へ切り替えられます。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>重要なのは、<strong>MRRを有効にするだけで切り替わるわけではない</strong>ことです。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>何をもってPrimaryが異常と判断するのかは、利用者側が設計します。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>単純なHTTP死活監視では、認証処理そのものが失敗していてもHealthyになる可能性があります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>AWS Security Blogでは、CloudWatch Syntheticsで実際の認証フローを実行し、その結果をCloudWatch AlarmとRoute 53 Health Checkへつなぐ例を紹介しています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>単なる死活監視ではなく、<strong>認証処理がエンドツーエンドで成立しているか</strong>を見る考え方です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>SDKやCognito APIを直接利用する構成では、アプリケーション側でRegional Endpointの切替を行います。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>AWS Security Blogでは、カスタムエンドポイントやプロキシを介してPrimaryとSecondaryへルーティングする構成も示されています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>DR設計書に、</p>
<!-- /wp:paragraph -->
<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>CognitoはMRRを利用する</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->
<!-- wp:paragraph -->
<p>とだけ書いても不足です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>最低でも、何を監視するのか、どの状態を障害と判定するのか、自動切替か運用者判断か、誰が復旧を判断するのか、どこまでを一緒に切り替えるのかを決める必要があります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>この領域は基本設計と運用設計の両方にまたがります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>可用性方式や依存関係を基本設計で具体化する考え方については、次の記事で整理しています。</p>

<a href="https://sys-univ.com/dev/basic-design-infrastructure/" title="基本設計で決めること｜画面設計だけでは終わらない基盤SEの設計工程" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6-500x281.jpg 500w, https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6-800x450.jpg 800w, https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6-300x169.jpg 300w, https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6-768x432.jpg 768w, https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6-1536x864.jpg 1536w, https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6-376x212.jpg 376w, https://sys-univ.com/wp-content/uploads/2026/06/4d96d0a5b250d4d64675183a265ba8a6.jpg 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">基本設計で決めること｜画面設計だけでは終わらない基盤SEの設計工程</div><div class="blogcard-snippet internal-blogcard-snippet">基本設計は画面設計だけでは終わらない。ログ・バックアップ・ジョブ・監視など、本番運用を見据えた基盤設計の論点を、ファイルアップロードや夜間バッチの実例で整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.06.20</div></div></div></div></a>
<p>監視条件、障害判定、切替手順、復旧後の戻し方については、次の記事で整理しています。</p>
<!-- /wp:embed -->
<!-- wp:paragraph -->

<a href="https://sys-univ.com/dev/opedesign/" title="運用設計とは？運用設計書の目次サンプルと項目一覧｜システム基盤エンジニア視点" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2026/07/7a689f13e1c38b90b6e6b1584b241588-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">運用設計とは？運用設計書の目次サンプルと項目一覧｜システム基盤エンジニア視点</div><div class="blogcard-snippet internal-blogcard-snippet">運用設計とは何かをシステム基盤エンジニアの実務目線で解説します。運用設計書の目次サンプルと検討項目一覧を示し、監視・ログ・バックアップ・ジョブ管理、誰がやるのか、要件定義・基本設計との関係、処理方式設計との双方向連携を整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.14</div></div></div></div></a>
<!-- /wp:separator -->
<!-- wp:heading -->
<h2 class="wp-block-heading">8. AWS DR設計で確認したいチェックリスト</h2>
<!-- /wp:heading -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">MRRの前提</h3>
<!-- /wp:heading -->
<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
	<li>□ 利用するUser PoolとPrimary、SecondaryのリージョンがMRRの対象か</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ EssentialsまたはPlus、Multi-Region KMS KeyなどMRRの前提を満たすか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ original issuerとupdated issuerのどちらを使うか決め、その依存先への影響を確認したか</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">障害時に認証できるか</h3>
<!-- /wp:heading -->
<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
	<li>□ Secondaryを<code>ACTIVE</code>にする前に、Lambda、WAF、SNS、SES、ログなどのリージョン固有設定を完了したか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ SMSを使う場合、Secondary側のSNS設定と送信元IDなどの登録を済ませたか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ TOTP利用者の代替認証方式を平時に決めたか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ Route 53 Health Checkで何を異常とみなすかを決めたか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ 自動切替か手動切替か、判断者と復旧判断を決めたか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ SDKやAPIを直接利用する場合のRegional Endpoint切替方式を決めたか</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->
<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">業務経路全体が成立するか</h3>
<!-- /wp:heading -->
<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
	<li>□ DNS、WAF/LB、Web/AP、DBまでDR側で利用できるか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ KMS、Secrets、証明書がDRリージョンでも利用できるか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ 外部IdP、外部API、外部システムへの接続を確認したか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ 認証後に呼ばれるLambdaや、その先のデータストアまで確認したか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ 監視、ログ、運用管理端末、管理アクセスがDR時にも利用できるか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ 「ログイン → 業務処理 → データ参照・更新」まで実際にDRテストしたか</li>
<!-- /wp:list-item -->
<!-- wp:list-item -->
	<li>□ Health Checkを意図的に反転し、PrimaryからSecondaryへの切替と復帰を確認したか</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->
<!-- wp:paragraph -->
<p>AWS Security Blogでは、Health Checkの反転やAWS Fault Injection Service（FIS）を使ったフェイルオーバーテストも紹介されています。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>チェックリストで重要なのは、個々のAWSサービスが存在するかではありません。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p><strong>業務を開始して終了するところまで、一連の経路を実際に通せるか</strong>です。</p>
<!-- /wp:separator -->
<!-- wp:heading -->
<h2 class="wp-block-heading">9. まとめ</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>バックアップがあることと、DR先で業務を継続できることは同じではありません。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>データが残っている。システムも起動できる。それでも、認証やKMS、外部サービスなどの依存先が成立しなければ、利用者は業務を再開できません。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Amazon CognitoのMRRによって、User Poolを別リージョンへ複製し、認証基盤の可用性を高められるようになりました。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>MRRにもリージョン条件、Secondaryの機能制限、issuer、リージョナルサービス、フェイルオーバー方式など、確認すべき依存関係があります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Authentication-only failoverとFull-stack failoverも区別する必要があります。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>DRで確認すべきなのは、</p>
<!-- /wp:paragraph -->
<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p><strong>「何をバックアップしたか」ではなく、「利用者が安全に業務を再開できるか」</strong></p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->
<!-- wp:paragraph -->
<p>です。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>この視点で1トランザクションの経路を追うと、バックアップ一覧やリソース一覧だけでは見えなかったDRの弱点が見えてきます。</p>
<!-- /wp:paragraph -->
<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity" /><!-- /wp:separator -->
<!-- wp:heading -->
<h2 class="wp-block-heading">参考資料</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p><strong>Amazon Cognito Developer Guide — Multi-Region replication for user pools</strong><br />
<a href="https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-multi-region.html">https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-multi-region.html</a></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p><strong>Amazon Cognito Developer Guide — Identity provider and relying party endpoints</strong><br />
<a href="https://docs.aws.amazon.com/cognito/latest/developerguide/federation-endpoints.html">https://docs.aws.amazon.com/cognito/latest/developerguide/federation-endpoints.html</a></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p><strong>AWS Security Blog — Architecting resilient authentication with Amazon Cognito multi-Region replication</strong><br />
2026年9月15日<br />
<a href="https://aws.amazon.com/blogs/security/architecting-resilient-authentication-with-amazon-cognito-multi-region-replication/">https://aws.amazon.com/blogs/security/architecting-resilient-authentication-with-amazon-cognito-multi-region-replication/</a></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p><strong>AWS What&#8217;s New — Amazon Cognito now supports multi-Region replication</strong><br />
2026年6月4日<br />
<a href="https://aws.amazon.com/about-aws/whats-new/2026/06/amazon-cognito-multi-region/">https://aws.amazon.com/about-aws/whats-new/2026/06/amazon-cognito-multi-region/</a></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p><strong>AWS News Blog — Improve your application resilience with Amazon Cognito multi-Region replication</strong><br />
2026年6月3日<br />
<a href="https://aws.amazon.com/blogs/aws/improve-your-application-resilience-with-amazon-cognito-multi-region-replication/">https://aws.amazon.com/blogs/aws/improve-your-application-resilience-with-amazon-cognito-multi-region-replication/</a></p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p><strong>AWS What&#8217;s New — Amazon Cognito がアジアパシフィック（大阪）リージョンとイスラエル（テルアビブ）リージョンでご利用いただけるようになりました</strong><br />
2023年9月1日<br />
<a href="https://aws.amazon.com/jp/about-aws/whats-new/2023/09/amazon-cognito-new-regions/">https://aws.amazon.com/jp/about-aws/whats-new/2023/09/amazon-cognito-new-regions/</a></p>
<!-- /wp:separator -->
<!-- wp:heading {"level":3} --><!-- /wp:paragraph -->
<!-- wp:paragraph --><!-- /wp:paragraph -->]]></content:encoded>
					
					<wfw:commentRss>https://sys-univ.com/tec/aws-dr-cognito-mrr/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>品質評価の落とし穴｜設計レビューは基準内でも、次工程へ進めなかった理由</title>
		<link>https://sys-univ.com/dev/design-quality-evaluation-pitfalls/</link>
					<comments>https://sys-univ.com/dev/design-quality-evaluation-pitfalls/#respond</comments>
		
		<dc:creator><![CDATA[ナギ]]></dc:creator>
		<pubDate>Wed, 30 Sep 2026 08:10:22 +0000</pubDate>
				<category><![CDATA[システム開発]]></category>
		<guid isPermaLink="false">https://sys-univ.com/?p=3439</guid>

					<description><![CDATA[はじめに 設計工程のレビューが完了し、品質指標も社内基準の範囲内でした。 普通に考えれば、そのまま次工程へ進めそうです。 しかし、このプロジェクトではすぐには進めませんでした。 理由は、全体の数値には現れにくい「偏り」が [&#8230;]]]></description>
										<content:encoded><![CDATA[

<p class="wp-block-paragraph"><strong>はじめに</strong></p>
<p>設計工程のレビューが完了し、品質指標も社内基準の範囲内でした。</p>


<p class="wp-block-paragraph">普通に考えれば、そのまま次工程へ進めそうです。</p>


<p class="wp-block-paragraph">しかし、このプロジェクトではすぐには進めませんでした。</p>


<p class="wp-block-paragraph">理由は、全体の数値には現れにくい「偏り」があったからです。数値が基準内でも、特定機能への指摘集中や、逆に不自然なほど指摘が少ない成果物が隠れていることがあります。</p>


<p class="wp-block-paragraph">本記事では、実際のプロジェクトで行った品質評価をベースに、そうした違和感をどう見つけ、原因を追い、次工程へ進める根拠をどう作ったかを紹介します。</p>


<p class="wp-block-paragraph">まずは、レビュー指摘件数をどう見るかから始めます。</p>



<h2 class="wp-block-heading">1. レビュー指摘件数だけでは、設計品質は判断できない</h2>


<p class="wp-block-paragraph">あるプロジェクトで、複数機能を合わせた設計書115ページに対し、レビュー指摘が36件出ました。</p>


<p class="wp-block-paragraph">この36件という数字だけを見て、</p>


<p class="wp-block-paragraph">「36件もある。品質が悪い」</p>


<p class="wp-block-paragraph">あるいは逆に、</p>


<p class="wp-block-paragraph">「社内基準の範囲内だから問題ない」</p>


<p class="wp-block-paragraph">と判断してよいのでしょうか。</p>


<p class="wp-block-paragraph">どちらも早すぎます。</p>


<p class="wp-block-paragraph">36件が多いか少ないかは、対象範囲によって意味が変わります。</p>


<p class="wp-block-paragraph">1機能の小さな設計書で36件なら多く見えるかもしれません。一方、大規模なサブシステム全体で36件なら、むしろ少なく見えることもあります。</p>


<p class="wp-block-paragraph">だから最初に確認するのは、指摘件数そのものではありません。</p>


<p class="wp-block-paragraph"><strong>成果物の規模と、指摘がどこに偏っているかです。</strong></p>


<p class="wp-block-paragraph">実際に担当したあるプロジェクトでも、全体の指摘件数だけを見ると、社内で設定していた品質水準から大きく外れた状態ではありませんでした。</p>


<p class="wp-block-paragraph">ところが機能別に分解すると、ある認証系機能に指摘が集中していました。</p>


<p class="wp-block-paragraph">全36件のうち17件。全体の約47％です。</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">認証機能だけ、何か違う。</p>
</blockquote>


<p class="wp-block-paragraph">この違和感をそのままにせず、原因を確認するところから品質評価が始まります。</p>


<h2 class="wp-block-heading">2. まず全体値を見る。ただし、ここでは結論を出さない</h2>


<p class="wp-block-paragraph">設計レビューが終わったら、まず全体の数字を確認します。</p>


<p class="wp-block-paragraph">次のような結果でした。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>項目</th>
<th>実績</th>
</tr>
</thead>
<tbody>
<tr>
<td>設計書規模</td>
<td>115ページ</td>
</tr>
<tr>
<td>レビュー指摘</td>
<td>36件</td>
</tr>
<tr>
<td>エラー摘出密度</td>
<td>約31件／100ページ</td>
</tr>
<tr>
<td>レビュー時間</td>
<td>約650分</td>
</tr>
<tr>
<td>レビュー密度</td>
<td>約5.7分／ページ</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">当時のプロジェクトでは、こうした値を社内標準の品質基準と比較していました。</p>


<p class="wp-block-paragraph">ここでいうエラー摘出密度は、<strong>100ページ当たりの指摘件数</strong>です。</p>


<p class="wp-block-paragraph">基準値との比較は必要です。大きく外れていれば、その時点で何らかの問題がある可能性があります。</p>


<p class="wp-block-paragraph">ただし、ここで「基準内だから品質に問題なし」と結論は出しません。</p>


<p class="wp-block-paragraph">逆に多少基準を外れていても、それだけで品質不良とは見ません。</p>


<p class="wp-block-paragraph">私にとって品質指標は、<strong>結論を出す数字ではなく、次にどこを見るかを決める入口</strong>です。</p>


<p class="wp-block-paragraph">例えば、レビュー指摘が多くても、その大部分が誤字や表現修正なら、設計そのものの品質が悪いとは限りません。</p>


<p class="wp-block-paragraph">一方、指摘件数が少なくても、その中に重大な設計漏れが含まれていれば話は別です。</p>


<p class="wp-block-paragraph"><strong>30件の軽微な記述修正と、1件の重大な設計漏れでは意味が違います。</strong></p>


<p class="wp-block-paragraph">だから、全体値を確認した次は、その数字を分解して見ます。</p>
<p>今回のケースで行った流れを整理すると、次のようになります。</p>

<div id="attachment_3450" style="width: 1682px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-3450" class="wp-image-3450 size-full" src="https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1.png" alt="" width="1672" height="941" srcset="https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1.png 1672w, https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/09/bce397644ac290edde61fede5b940971-1-376x212.png 376w" sizes="(max-width: 1672px) 100vw, 1672px" /><p id="caption-attachment-3450" class="wp-caption-text">図：設計工程における品質評価の流れ。基準値の確認だけで終わらず、偏り・重要度・原因を確認し、必要に応じて設計へ戻す</p></div>


<p>この流れの中で、最初に重要になるのが「偏り」です。全体平均だけでは見えない違和感を、機能別に分解して確認します。</p>
<h2 class="wp-block-heading">3. 設計工程の品質評価では「平均」より違和感を見る</h2>


<p class="wp-block-paragraph">先ほど示した36件を機能別に分けると、内訳は次のようになります。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>機能</th>
<th>指摘件数</th>
</tr>
</thead>
<tbody>
<tr>
<td>認証系</td>
<td>17</td>
</tr>
<tr>
<td>マスタ連携系</td>
<td>7</td>
</tr>
<tr>
<td>バッチ系</td>
<td>5</td>
</tr>
<tr>
<td>その他</td>
<td>7</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">認証系だけで全体の約半数を占めており、偏りがはっきり見えます。</p>


<p class="wp-block-paragraph">ここで見るべきなのは、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>なぜ、この機能だけ突出したのか</strong></p>
</blockquote>


<p class="wp-block-paragraph">です。</p>


<p class="wp-block-paragraph">品質評価では、こうした偏りをかなり重視します。</p>


<p class="wp-block-paragraph">特定機能に指摘が集中している、特定種類の指摘だけ突出している、規模の割に指摘が多い。こうした数字には、何らかの理由があります。</p>


<p class="wp-block-paragraph">今回の認証系機能でも、17件のうち大半が「説明不足」「記述上の不備」でした。</p>


<p class="wp-block-paragraph">一見すると、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">設計者の文章力の問題ではないか</p>
</blockquote>


<p class="wp-block-paragraph">と思うかもしれません。</p>


<p class="wp-block-paragraph">しかし、実際に原因を追っていくと、問題はもっと上流にありました。</p>


<p class="wp-block-paragraph">この点は後ほど詳しく説明します。</p>


<h3 class="wp-block-heading">指摘が「0件」の成果物も確認する</h3>


<p class="wp-block-paragraph">逆方向の偏りもあります。</p>


<p class="wp-block-paragraph"><strong>指摘が少なすぎるケースです。</strong></p>


<p class="wp-block-paragraph">ある程度の規模や複雑さがある成果物でレビュー指摘が0件だった場合、私は「品質が高かった」とすぐには受け取りません。</p>


<p class="wp-block-paragraph">むしろ、一度確認します。</p>


<p class="wp-block-paragraph">もちろん、小規模な定型機能なら0件でも不思議ではありません。</p>


<p class="wp-block-paragraph">しかし、ある程度の規模があり、新規設計や条件分岐、外部連携などを含むのに0件であれば、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">本当に十分なレビューが行われたのか？</p>
</blockquote>


<p class="wp-block-paragraph">を疑います。</p>


<p class="wp-block-paragraph">実際のプロジェクトでも、指摘が多い機能だけを確認していたわけではありません。<strong>規模の割に指摘が少ない機能や、指摘が0件だった機能も確認対象にしていました。</strong></p>


<p class="wp-block-paragraph">0件には、</p>


<ul class="wp-block-list">
	<li>本当に完成度が高かった</li>


	<li>レビュアーが十分に内容を理解できていなかった</li>


	<li>レビュー観点が不足していた</li>


	<li>表面的な確認だけで終わっていた</li>
</ul>


<p class="wp-block-paragraph">といった、まったく異なるケースが混在するからです。</p>


<p class="wp-block-paragraph">品質評価で探すのは、単純な「悪い数字」ではありません。</p>


<p class="wp-block-paragraph"><strong>説明しにくい数字、違和感のある数字です。</strong></p>


<p class="wp-block-paragraph">多すぎる場合も見る。少なすぎる場合も見る。</p>


<p class="wp-block-paragraph">全体平均の中に埋もれた違和感を拾うことが、品質評価の最初の重要な作業です。</p>


<h2 class="wp-block-heading">4. 指摘件数より「何を指摘されたか」を見る</h2>


<p class="wp-block-paragraph">レビュー結果を見るときは、指摘件数だけでなく、<strong>その指摘がどの程度の影響を持つものか</strong>を確認します。</p>


<p class="wp-block-paragraph">例えば、同じ10件でも、</p>


<ul class="wp-block-list">
	<li>誤字脱字や表現の修正が10件</li>


	<li>処理条件の漏れや設計誤りが10件</li>
</ul>


<p class="wp-block-paragraph">では、品質上の意味はまったく違います。</p>


<p class="wp-block-paragraph">私が品質評価をするときは、指摘内容を重要度で分けて見ます。</p>


<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>重要度</th>
<th>考え方</th>
</tr>
</thead>
<tbody>
<tr>
<td>大</td>
<td>設計漏れ、設計誤りなど、そのまま後工程へ流すと機能不良や大きな手戻りにつながるもの</td>
</tr>
<tr>
<td>中</td>
<td>修正が必要な設計上の問題。ただし「大」ほど致命的ではないもの</td>
</tr>
<tr>
<td>小</td>
<td>誤字脱字、言い換え、分かりにくい表現、誤解を招く記述など</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">この分類で重要なのは、<strong>件数の多寡だけで工程完了を判断しないこと</strong>です。</p>


<p class="wp-block-paragraph">軽微な指摘だけであれば、修正を確認できた時点で問題にしません。</p>


<p class="wp-block-paragraph">一方で、重要度「大」に相当する設計漏れや設計誤りが残っているなら、たとえ指摘件数が1件でも、そのまま工程完了とはしません。</p>


<p class="wp-block-paragraph">重要度の高い指摘が見つかった時点で、同じ原因による漏れが他機能にもないか、横展開の確認も必要になります。</p>


<p class="wp-block-paragraph">つまり、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>「何件あったか」より、「何が残っているか」の方が重要です。</strong></p>
</blockquote>


<p class="wp-block-paragraph">先ほどの認証系機能でも、指摘の大半は説明不足や記述上の不備で、重要度としては「小」〜「中」が中心でした。</p>


<p class="wp-block-paragraph">認証方式そのものを大量に間違えていたわけではありません。</p>


<p class="wp-block-paragraph">それでも、同じ種類の指摘が一つの機能に集中している以上、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">なぜ、この機能だけ設計内容を明確に書けなかったのか</p>
</blockquote>


<p class="wp-block-paragraph">は確認する必要があります。</p>


<p class="wp-block-paragraph">次章では、この認証系機能について、実際にどこを疑い、原因をどう絞っていったのかを見ていきます。</p>


<h2 class="wp-block-heading">5. 認証系だけ指摘が多い。まず何を疑ったか</h2>


<p class="wp-block-paragraph">認証系機能では、他の機能より指摘が明らかに多く出ていました。</p>


<p class="wp-block-paragraph">こういうとき、私はいきなり</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">担当者のスキルが足りない</p>
</blockquote>


<p class="wp-block-paragraph">とは考えません。</p>


<p class="wp-block-paragraph"><strong>まず機能単体で見える構造を確認し、次に人を見て、それでも説明できなければ機能の外側にある構造へ視野を広げます。</strong></p>


<p class="wp-block-paragraph">この順で見る理由は、個人を疑う前に、担当者を替えても同じ問題が起こる要因がないかを確認したいからです。</p>


<h3 class="wp-block-heading">機能そのものの難易度</h3>


<p class="wp-block-paragraph">まず、その機能が他より難しくないかを見ます。</p>


<p class="wp-block-paragraph">認証や外部連携のように、複数システムをまたぎ、条件分岐も多い機能は、単純な機能より設計上の確認事項が増えます。</p>


<p class="wp-block-paragraph">当時のプロジェクトでも、認証まわりは経験者が限られており、他機能より確認すべき前提が多い領域でした。</p>


<h3 class="wp-block-heading">要件が十分に固まっているか</h3>


<p class="wp-block-paragraph">次に見るのが要件です。</p>


<p class="wp-block-paragraph">設計者が正しく理解していても、要件そのものに不足があれば、設計書に明確に落とし込むことはできません。</p>


<p class="wp-block-paragraph">ここでは、要件定義書や過去の打ち合わせ内容を見直し、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">そもそも設計者が判断できるだけの情報が揃っていたか</p>
</blockquote>


<p class="wp-block-paragraph">を確認します。</p>


<h3 class="wp-block-heading">担当者の理解・経験</h3>


<p class="wp-block-paragraph">ここで初めて、担当者側を見ます。</p>


<p class="wp-block-paragraph">機能の前提は理解できているか。過去の設計や類似機能を把握しているか。</p>


<p class="wp-block-paragraph">ただし、指摘が多いことだけを理由に担当者の力量が低いとは見ません。</p>


<h3 class="wp-block-heading">レビュアー側の知識</h3>


<p class="wp-block-paragraph">設計者だけでなく、レビューする側も確認します。</p>


<p class="wp-block-paragraph">レビュアーがその機能の前提や過去の経緯を知らなければ、レビュー回数を増やしても重要な観点を拾えないことがあります。</p>


<h3 class="wp-block-heading">機能の外側まで視野を広げる</h3>


<p class="wp-block-paragraph">個人や単一機能だけでは説明できない場合は、認証基盤側と個別機能側の責任分界も確認します。</p>


<p class="wp-block-paragraph">認証や外部連携では、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">どこまでを認証基盤側で決め、どこからを個別機能側で決めるのか</p>
</blockquote>


<p class="wp-block-paragraph">が曖昧だと、誰も設計しない領域が生まれます。</p>


<p class="wp-block-paragraph">この観点は、単純な設計書レビューだけでは見落としやすい部分です。</p>


<p class="wp-block-paragraph">ここまで確認して初めて、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">指摘が多かった理由は何だったのか</p>
</blockquote>


<p class="wp-block-paragraph">を絞り込めます。</p>


<p class="wp-block-paragraph">今回の認証系機能でも、表面的には「説明不足が多い」という現象でしたが、その原因は設計書の書き方だけでは説明できませんでした。</p>


<p class="wp-block-paragraph">次章で、実際にどこが不足していたのかを見ていきます。</p>


<h2 class="wp-block-heading">6. 原因は「書き方」ではなく、要件と責任分界にあった</h2>


<p class="wp-block-paragraph">認証系機能では、「説明不足」「記述上の不備」が多く出ていました。</p>


<p class="wp-block-paragraph">表面だけを見ると、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">設計者が分かりやすく書けていない</p>
</blockquote>


<p class="wp-block-paragraph">という問題に見えます。</p>


<p class="wp-block-paragraph">しかし、設計内容を追っていくと、原因はそれだけではありませんでした。</p>


<p class="wp-block-paragraph">当時の要件では、外部の認証基盤から利用者IDを受け取り、そのIDが認証用のテーブルに存在する利用者だけをシステムへ通す、というところまでは決まっていました。</p>


<p class="wp-block-paragraph">ところが、その先が十分に詰められていませんでした。</p>


<p class="wp-block-paragraph">例えば、</p>


<ul class="wp-block-list">
	<li>その利用者は参照だけできるのか</li>


	<li>更新もできるのか</li>


	<li>管理者権限を持つのか</li>


	<li>担当業務だけを利用できるのか</li>


	<li>こうした権限情報をどこで管理するのか</li>
</ul>


<p class="wp-block-paragraph">といった点です。</p>


<p class="wp-block-paragraph">つまり、<strong>「誰であるか」を確認する認証までは決まっていても、「何をしてよいか」を決める権限側の要件が十分ではなかった</strong>のです。</p>


<p class="wp-block-paragraph">さらに、認証基盤側と個別機能側のどちらが、どこまで責任を持って設計するのかも曖昧でした。</p>


<p class="wp-block-paragraph">例えば、認証基盤側は利用者IDが正しいことまでを保証し、その利用者に「参照のみ」「更新可能」「管理者」といった権限を与えるのは個別機能側なのか。それとも権限情報そのものを認証基盤側で管理するのか。</p>


<p class="wp-block-paragraph">この境界が十分に決まっていませんでした。</p>


<p class="wp-block-paragraph">この状態では、設計者が設計書を明確に書こうとしても限界があります。</p>


<p class="wp-block-paragraph">要件として決まっていない内容を、設計者の判断だけで確定させることはできないからです。</p>


<p class="wp-block-paragraph">結果として、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">「この場合はどうするのか」<br />
「この権限はどこで判断するのか」<br />
「この条件では認証エラーなのか、権限エラーなのか」</p>
</blockquote>


<p class="wp-block-paragraph">といった部分が設計書上で曖昧になっていました。</p>


<p class="wp-block-paragraph">この関係は、次のように整理できます。</p>


<p class="wp-block-paragraph"><strong>要件が不足している</strong><br />
↓<br />
<strong>認証基盤側と個別機能側の責任分界が曖昧になる</strong><br />
↓<br />
<strong>設計者が一意に仕様を決められない</strong><br />
↓<br />
<strong>設計書の記述が曖昧になる</strong><br />
↓<br />
<strong>レビューで説明不足として表面化する</strong></p>


<p class="wp-block-paragraph">ここで重要なのは、レビューで見えた「説明不足」をそのまま原因だと考えないことです。</p>


<p class="wp-block-paragraph"><strong>説明不足は原因ではなく、上流の問題が設計書に現れた結果だった</strong>わけです。</p>


<p class="wp-block-paragraph">もしここで、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">設計書をもっと分かりやすく書くこと</p>
</blockquote>


<p class="wp-block-paragraph">だけを対策にしていたら、根本的な問題は残ったままです。</p>


<p class="wp-block-paragraph">今回のケースでは、この原因を確認した時点で、次工程へそのまま流すのではなく、設計の前提を見直す必要があると判断しました。</p>


<h2 class="wp-block-heading">7. 基準内でも、原因が見つかれば設計へ戻す</h2>


<p class="wp-block-paragraph">認証系機能で指摘が多かった原因を追うと、設計書の書き方だけでなく、要件不足と責任分界の曖昧さがあることが分かりました。</p>


<p class="wp-block-paragraph">この状態でそのまま製造へ渡せば、実装者ごとに仕様の解釈が分かれ、後から設計変更や製造修正が発生する可能性があります。</p>


<p class="wp-block-paragraph">そのため、全体として品質基準の範囲内であっても、そのまま次工程へ進む判断はしませんでした。</p>


<h3 class="wp-block-heading">不足していた仕様を確認する</h3>


<p class="wp-block-paragraph">最初に行ったのは、曖昧だった仕様の再確認です。</p>


<p class="wp-block-paragraph">認証そのものだけでなく、</p>


<ul class="wp-block-list">
	<li>利用者にどの権限を与えるのか</li>


	<li>どこまでを認証基盤側で持つのか</li>


	<li>どこからを個別機能側で判断するのか</li>
</ul>


<p class="wp-block-paragraph">といった、設計の前提を整理し直しました。</p>


<p class="wp-block-paragraph">私の現場では、こうした仕様不足を見つけたとき、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>今ここで決めずに後工程へ送ると、設計変更や製造修正として追加工数が発生するか</strong></p>
</blockquote>


<p class="wp-block-paragraph">も判断材料にします。</p>


<p class="wp-block-paragraph">今回の内容は、後工程へ持ち越せば手戻りにつながる可能性が高いため、この工程で確認すべき事項と判断しました。</p>


<h3 class="wp-block-heading">プロジェクトの経緯と運用を知る有識者にも確認する</h3>


<p class="wp-block-paragraph">次に、有識者を加えて確認しました。</p>


<p class="wp-block-paragraph">ここでいう有識者は、単に認証技術に詳しい人ではありません。</p>


<p class="wp-block-paragraph">重視したのは、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>そのプロジェクトで、なぜ現在の設計になったのかを知り、既存システムが実際にどう運用されているかも理解している人</strong></p>
</blockquote>


<p class="wp-block-paragraph">です。</p>


<p class="wp-block-paragraph">技術力が高くても、途中から参加した人では、過去にどのような議論があり、なぜその方式を採用し、他機能とどこを揃える必要があるのかまでは分からないことがあります。</p>


<p class="wp-block-paragraph">さらに、要件定義書には明示されていなくても、既存システムを長く使ってきた中で当然視されている運用要件が存在することもあります。</p>


<p class="wp-block-paragraph">横並びで品質を見るときは、技術知識だけでなく、<strong>プロジェクト固有の設計経緯と運用実態を知っていること</strong>も重要です。</p>


<h3 class="wp-block-heading">他機能へ横展開する</h3>


<p class="wp-block-paragraph">認証系機能で問題が見つかったからといって、その機能だけを修正して終わりにはしません。</p>


<p class="wp-block-paragraph">まず、要件不足やシステム間の責任分界という観点で、同じ問題が他機能にもないかを確認しました。</p>


<p class="wp-block-paragraph">例えば、</p>


<ul class="wp-block-list">
	<li>設計者が判断できない未確定条件が残っていないか</li>


	<li>他システムとの責任分界が曖昧になっていないか</li>
</ul>


<p class="wp-block-paragraph">といった観点です。</p>


<p class="wp-block-paragraph">加えて、横展開を進める中では、<strong>認証系とは別の種類の不足</strong>も見つかりました。</p>


<p class="wp-block-paragraph">例えばポータル画面です。</p>


<p class="wp-block-paragraph">プロジェクトの経緯と既存システムの運用を知る有識者から、</p>


<ul class="wp-block-list">
	<li>本日・今月のバッチ処理の終了予定時刻</li>


	<li>バッチ処理の実施結果</li>


	<li>処理件数</li>


	<li>利用者への連絡事項</li>
</ul>


<p class="wp-block-paragraph">といった情報も、共通的に表示する必要があるという指摘がありました。</p>


<p class="wp-block-paragraph">こうした内容は、要件定義書に書かれた項目だけを追っていても拾いにくいものでした。</p>


<p class="wp-block-paragraph"><strong>そのシステムが実際にどう使われてきたかを知る人だからこそ見つけられた設計上の不足です。</strong></p>


<p class="wp-block-paragraph">この不足は設計へ反映し、修正後に再確認しました。</p>


<p class="wp-block-paragraph">横展開は、同じ不備を他機能から探すだけの作業ではありません。</p>


<p class="wp-block-paragraph"><strong>プロジェクト固有の設計経緯や運用知識まで含めて、設計に抜けがないかを確認する作業です。</strong></p>


<p class="wp-block-paragraph">そして、今回見つかった問題はその場限りで終わらせず、次回以降のレビューでも使えるよう、</p>


<ul class="wp-block-list">
	<li>未確定条件が残っていないか</li>


	<li>他システムとの責任分界が明確か</li>
</ul>


<p class="wp-block-paragraph">といった形でチェック観点として残しました。</p>


<p class="wp-block-paragraph">最初から完璧なチェックリストを作る必要はありません。実際に発生した問題を確認観点へ戻していくことで、そのプロジェクトに合ったチェックリストになっていきます。</p>


<p class="wp-block-paragraph">ただし、<strong>それを第三者でも同じように使える形に整理することは、また別の作業です。</strong></p>


<p class="wp-block-paragraph">修正後の再確認では、今回問題となった観点について追加の修正指摘は出ませんでした。</p>


<p class="wp-block-paragraph">重大な設計漏れや未解決事項も残っていないことを確認しました。</p>


<p class="wp-block-paragraph"><strong>仕様を再確認する → プロジェクト経験者を含む有識者で確認する → 他機能へ横展開する。</strong></p>


<p class="wp-block-paragraph">ここまで実施して、次工程へ進めました。</p>


<p class="wp-block-paragraph">基準の確認は必要ですが、それだけでは足りません。</p>


<p class="wp-block-paragraph">数字の偏りから原因が見つかったのであれば、<strong>基準内かどうかより、その原因を放置しないことを優先します。</strong></p>


<h2 class="wp-block-heading">8. 数字の良し悪しの前に、「何を計った数字か」を確認する</h2>


<p class="wp-block-paragraph">品質評価では、レビュー密度や生産性といった数字も確認します。</p>


<p class="wp-block-paragraph">ただし、数字が基準より高い、低いというだけでは評価しません。</p>


<p class="wp-block-paragraph">代表的なのがレビュー密度です。</p>


<p class="wp-block-paragraph">当時のプロジェクトでは、レビュー密度が社内標準より低く見える場面がありました。</p>


<p class="wp-block-paragraph">数字だけを見れば、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">レビュー時間が不足していたのではないか</p>
</blockquote>


<p class="wp-block-paragraph">と考えたくなります。</p>


<p class="wp-block-paragraph">しかし実態を確認すると、設計書レビューだけでなく、事前の横並び確認や整理にもかなり時間を使っていました。一方、それらの時間すべてが管理ツール上のレビュー時間として計上されていたわけではありません。</p>


<p class="wp-block-paragraph">つまり、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">レビューが少なかった</p>
</blockquote>


<p class="wp-block-paragraph">のではなく、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>数字に含まれている作業範囲が、実際に行った品質確認の全量ではなかった</strong></p>
</blockquote>


<p class="wp-block-paragraph">ということです。</p>


<p class="wp-block-paragraph">ここで確認すべきなのは、実績値が正しいかどうかではありません。</p>


<p class="wp-block-paragraph"><strong>その数字が、何をどこまで計測したものなのかです。</strong></p>


<p class="wp-block-paragraph">レビュー密度が低くても、横並び確認や有識者レビューまで含めて十分な確認をしているのであれば、その実態も合わせて評価します。</p>


<p class="wp-block-paragraph">時間の多寡と、レビュー観点の質は別の問題です。</p>


<p class="wp-block-paragraph">成果物ごとの指摘件数も同じです。先ほど触れたように、規模や難易度に対して極端な値になっていれば、その理由を確認します。</p>


<p class="wp-block-paragraph">生産性についても、高く見えていても、工数の計上範囲や外部支援の有無によって意味が変わります。</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>数字が良いか悪いかではなく、その数字が実態を正しく表しているかを見る。</strong></p>
</blockquote>


<p class="wp-block-paragraph">これが重要です。</p>


<p class="wp-block-paragraph">場合によっては、こうした理由から指標を「参考値」として扱うこともあります。</p>


<p class="wp-block-paragraph">ただし、参考値とすることは、評価しなくてよいという意味ではありません。</p>


<p class="wp-block-paragraph"><strong>なぜその数字をそのまま評価に使えないのかに加え、何を代わりの品質確認の根拠としたのかも説明できる必要があります。</strong></p>


<p class="wp-block-paragraph">例えば、横並び確認、有識者レビュー、修正後の再確認などです。</p>


<p class="wp-block-paragraph">「参考値」は逃げ道ではなく、<strong>別の根拠で補完することを前提にした扱い</strong>です。</p>


<h2 class="wp-block-heading">9. 品質評価の目的は「次工程へ進める根拠」を作ること</h2>


<p class="wp-block-paragraph">設計工程の品質評価は、</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">基準値に入ったから合格</p>
</blockquote>


<p class="wp-block-paragraph">という判定ではありません。</p>


<p class="wp-block-paragraph"><strong>偏りを見つけ、原因を追い、必要なら設計へ戻し、横並びや有識者の確認を重ねる。</strong></p>


<p class="wp-block-paragraph">その結果として、重大な問題が残っていないことを説明できて初めて、次工程へ進めます。</p>


<p class="wp-block-paragraph">品質評価の目的は、品質指標を計算することではありません。</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>「なぜ、この設計成果物を次工程へ渡してよいのか」を説明できる状態にすることです。</strong></p>
</blockquote>


<p class="wp-block-paragraph">今回のケースを口頭で説明するなら、骨子はこうなります。</p>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">全体の品質指標は基準範囲内だったが、認証系機能への指摘集中が見つかった。原因を確認すると、要件と責任分界に不足があったため設計へ戻した。さらに有識者を交えて他機能も確認し、必要な修正と再確認を行ったうえで、次工程へ進める状態になった。</p>
</blockquote>


<p class="wp-block-paragraph">実務では、この判断を口頭で説明して終わりにはできません。</p>


<p class="wp-block-paragraph">顧客やプロジェクトマネージャー、PMOなど、第三者が後から見ても、</p>


<ul class="wp-block-list">
	<li>どの数字に着目したのか</li>


	<li>なぜ追加確認が必要と判断したのか</li>


	<li>どんな品質強化を行ったのか</li>


	<li>何を根拠に次工程へ進めると判断したのか</li>
</ul>


<p class="wp-block-paragraph">を追える形にしておく必要があります。</p>


<p class="wp-block-paragraph">第8章で触れたように、レビュー密度などを「参考値」とした場合も同じです。</p>


<p class="wp-block-paragraph">なぜその数字をそのまま評価に使えないのか。<br />
その代わりに何を確認し、品質を担保したのか。</p>


<p class="wp-block-paragraph"><strong>ここまでを整理して初めて、第三者にも品質判断の根拠を説明できる状態になります。</strong></p>


<p class="wp-block-paragraph">ここから先は、「品質をどう判断するか」ではなく、<strong>その判断をどう資料にするか</strong>の話です。</p>


<p class="wp-block-paragraph">実務編では、実際の品質評価で使用してきた考え方をベースに、架空プロジェクトのデータを使って、</p>


<ul class="wp-block-list">
	<li>レビュー実施状況表</li>


	<li>エラー分析表</li>


	<li>横展開用チェックリスト</li>


	<li>品質・生産性報告書</li>
</ul>


<p class="wp-block-paragraph">をどのように作るか、具体的に整理します。</p>


<p class="wp-block-paragraph"><strong>本記事が「何を見て、どう判断するか」なら、実務編は「その判断を第三者に説明できる成果物へどう落とすか」です。</strong></p>


<p class="wp-block-paragraph">※実務編は近日公開予定です。</p>
<h2>関連記事</h2>
<p>設計工程の品質評価では、レビュー結果だけを見るのではなく、<strong>要件が十分に具体化されているか、設計した内容を後工程でどう確認するか</strong>までつなげて考える必要があります。</p>
<p>今回の記事で扱った「要件不足」「責任分界」「次工程へ進める根拠」と関係する内容は、以下の記事でも詳しく整理しています。</p>
<p><strong>要件定義とは？RFP・見積前提から認識差を潰す実務を解説</strong><br />
要件定義書に書かれた要求をそのまま設計へ渡すのではなく、設計・構築・テストできる粒度まで具体化する考え方を、責任分界や実際の手戻り事例とともに整理しています。</p>

<a href="https://sys-univ.com/dev/requirements-definition/" title="要件定義とは何をする工程か｜RFP・見積前提から認識差を潰す実務" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-160x90.png 160w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-500x281.png 500w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-800x450.png 800w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-300x169.png 300w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-768x432.png 768w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-1536x864.png 1536w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-120x68.png 120w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-320x180.png 320w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a-376x212.png 376w, https://sys-univ.com/wp-content/uploads/2026/06/2d222665bad7a62379b769bded1c226a.png 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">要件定義とは何をする工程か｜RFP・見積前提から認識差を潰す実務</div><div class="blogcard-snippet internal-blogcard-snippet">要件定義とは何をする工程なのか。RFP、質問回答、提案書、見積前提から認識差を潰し、スコープや責任分界を確定する実務を、大規模SIの具体的な失敗事例とともに解説します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.08.12</div></div></div></div></a>
<p><strong>Vモデルは古くない｜設計とテストをつなぐ品質保証の考え方</strong><br />
要件や設計で決めた内容を、どのテスト工程で確認するのか。設計成果物とテストを対応づけて、後工程まで含めて品質を作り込む考え方を解説しています。</p>

<a href="https://sys-univ.com/dev/v-model-quality-assurance/" title="Vモデルは古くない｜設計とテストをつなぐ品質保証の考え方" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2022/12/9bc6ac64c2c9eff90c882e3211abf571-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2022/12/9bc6ac64c2c9eff90c882e3211abf571-160x90.webp 160w, https://sys-univ.com/wp-content/uploads/2022/12/9bc6ac64c2c9eff90c882e3211abf571-120x68.webp 120w, https://sys-univ.com/wp-content/uploads/2022/12/9bc6ac64c2c9eff90c882e3211abf571-320x180.webp 320w, https://sys-univ.com/wp-content/uploads/2022/12/9bc6ac64c2c9eff90c882e3211abf571-376x212.webp 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Vモデルは古くない｜設計とテストをつなぐ品質保証の考え方</div><div class="blogcard-snippet internal-blogcard-snippet">Vモデルは古い開発手法の話ではなく、要件・設計で決めたことをテストで確認する品質保証の考え方です。バックアップ要件の具体例で各工程の対応関係を整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.07.13</div></div></div></div></a>
<p><strong>機能要件と非機能要件の違い｜「機能が動く」と「本番で使える」は違う</strong><br />
機能が正しく動くだけでは、本番で使えるシステムとは限りません。性能・可用性・運用性・セキュリティなど、設計時に見落としやすい非機能要件の考え方を整理しています。</p>

<a href="https://sys-univ.com/dev/functional-nonfunctional-requirements/" title="機能要件と非機能要件の違い｜「機能が動く」と「本番で使える」は違う" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><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 loading="lazy" decoding="async" width="160" height="90" src="https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa-160x90.jpg 160w, https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa-500x281.jpg 500w, https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa-800x450.jpg 800w, https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa-300x169.jpg 300w, https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa-768x432.jpg 768w, https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa-1536x864.jpg 1536w, https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa-120x68.jpg 120w, https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa-320x180.jpg 320w, https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa-376x212.jpg 376w, https://sys-univ.com/wp-content/uploads/2026/06/b9c93881b11465fd6ccbf91142947faa.jpg 1672w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">機能要件と非機能要件の違い｜「機能が動く」と「本番で使える」は違う</div><div class="blogcard-snippet internal-blogcard-snippet">「機能が動く」と「本番で使える」は違う。機能要件と非機能要件の違いを、購入申請システムの具体例と現場の失敗パターンから整理します。</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 loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://sys-univ.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">sys-univ.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.06.19</div></div></div></div></a>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sys-univ.com/dev/design-quality-evaluation-pitfalls/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
