<?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>ネットワーク &#8211; エンジニア見習い</title>
	<atom:link href="https://otonan-syusyoku.work/archives/tag/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Tue, 28 Oct 2025 05:24:52 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>ネットワーク &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Laravel+Inertia+ReactをECSで動かしたい！ NginxとPHP-FPMのコンテナ分離</title>
		<link>https://otonan-syusyoku.work/archives/2153</link>
					<comments>https://otonan-syusyoku.work/archives/2153#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Tue, 28 Oct 2025 05:24:52 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[インフラ]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=2153</guid>

					<description><![CDATA[Laravel + Inertia (React/Vue) の組み合わせは、SPA（シングルページアプリケーション）の体験とサーバーサイド（Laravel）の書きやすさを両立できる、非常に強力な構成です。 しかし、ローカ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Laravel + Inertia (React/Vue) の組み合わせは、SPA（シングルページアプリケーション）の体験とサーバーサイド（Laravel）の書きやすさを両立できる、非常に強力な構成です。</p>
<p>しかし、ローカルのDocker Compose環境では問題なく動作しても、AWSのECS Fargateのような本番環境にデプロイしようとすると、いくつかの疑問に直面します。</p>
<ul>
<li>「NginxとPHP-FPMコンテナはどう連携させるのがベスト？」</li>
<li>「<code>fastcgi_pass</code> ってローカルと設定を変える必要ある？」</li>
<li>「InertiaでビルドしたReactのJS/CSSファイルは、結局どのコンテナに置くのが正解？」</li>
</ul>
<p>この記事では、<code>fastcgi_pass</code> の基本から、ECS Fargateでの最適なコンテナ構成、そしてInertia/Reactプロジェクト特有の「静的ファイルの配置場所」問題までを、順を追って解説します。</p>
<h2>fastcgi_pass とは？</h2>
<h3>NginxとPHP-FPMの「橋渡し」</h3>
<p>まず基本のおさらいです。Nginxは高性能なWebサーバーですが、それ自体はPHPコードを実行できません。<br />
一方、PHP-FPMはPHPコードを実行することに特化したプロセス（サーバー）です。</p>
<p>Nginxがクライアント（ブラウザ）から <code>.php</code> ファイルへのリクエストを受け取ったとき、そのリクエストをPHP-FPMに処理してもらう必要があります。</p>
<p>このとき、Nginxの設定ファイル（<code>nginx.conf</code>）で、<b>「どのPHP-FPMに処理を依頼するか」の宛先を指定する</b>のが <code>fastcgi_pass</code> ディレクティブです。</p>
<div _ngcontent-ng-c535465467="" class="code-block ng-tns-c535465467-470 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" jslog="223238;track:impression,attention;BardVeMetadataKey:[[&quot;r_4fea32b244968dc8&quot;,&quot;c_103da6cb53c10bc2&quot;,null,&quot;rc_8751fdc7f6beda59&quot;,null,null,&quot;ja&quot;,null,1,null,null,1,0]]">
<div _ngcontent-ng-c535465467="" class="formatted-code-block-internal-container ng-tns-c535465467-470">
<div _ngcontent-ng-c535465467="" class="animated-opacity ng-tns-c535465467-470">
<pre _ngcontent-ng-c535465467="" class="ng-tns-c535465467-470"><code _ngcontent-ng-c535465467="" role="text" data-test-id="code-content" class="code-container formatted ng-tns-c535465467-470"><span class="hljs-attribute">location</span> <span class="hljs-regexp">~ \.php$</span> {
    <span class="hljs-comment"># ...</span>
    <span class="hljs-comment"># ↓ この一行が「橋渡し」の指定</span>
    <span class="hljs-attribute">fastcgi_pass</span> php-fpm-server:<span class="hljs-number">9000</span>; 
}
</code></pre>
</div>
</div>
</div>
<p>&nbsp;</p>
<h2>ローカル開発 (Docker Compose) での構成</h2>
<p>ローカル開発では、「1コンテナ1責務」の原則に従い、NginxとPHP-FPMを別々のコンテナとして <code>docker-compose.yml</code> で定義するのが一般的です。</p>
<div _ngcontent-ng-c535465467="" class="code-block ng-tns-c535465467-471 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" jslog="223238;track:impression,attention;BardVeMetadataKey:[[&quot;r_4fea32b244968dc8&quot;,&quot;c_103da6cb53c10bc2&quot;,null,&quot;rc_8751fdc7f6beda59&quot;,null,null,&quot;ja&quot;,null,1,null,null,1,0]]">
<div _ngcontent-ng-c535465467="" class="formatted-code-block-internal-container ng-tns-c535465467-471">
<div _ngcontent-ng-c535465467="" class="animated-opacity ng-tns-c535465467-471">
<pre _ngcontent-ng-c535465467="" class="ng-tns-c535465467-471"><code _ngcontent-ng-c535465467="" role="text" data-test-id="code-content" class="code-container formatted ng-tns-c535465467-471"><span class="hljs-comment"># docker-compose.yml (抜粋)</span>
<span class="hljs-attr">version:</span> <span class="hljs-string">'3'</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-comment"># Nginxコンテナ</span>
  <span class="hljs-attr">nginx:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">nginx:alpine</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">"80:80"</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">./nginx.conf:/etc/nginx/conf.d/default.conf</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">./laravel-project:/var/www/html</span>

  <span class="hljs-comment"># PHP-FPMコンテナ</span>
  <span class="hljs-attr">php:</span>
    <span class="hljs-attr">build:</span> <span class="hljs-string">.</span> <span class="hljs-comment"># PHP-FPMとLaravelコードを含むDockerfile</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">./laravel-project:/var/www/html</span>
</code></pre>
</div>
</div>
</div>
<p>&nbsp;</p>
<p>この構成では、NginxコンテナとPHPコンテナは <b>別々のネットワーク空間</b> に存在します。Docker Composeが提供する内部ネットワークを介して、サービス名で通信します。</p>
<p>したがって、NginxコンテナからPHPコンテナへは、<code>php</code> というサービス名（ホスト名）を使ってアクセスします。</p>
<div _ngcontent-ng-c535465467="" class="code-block ng-tns-c535465467-472 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" jslog="223238;track:impression,attention;BardVeMetadataKey:[[&quot;r_4fea32b244968dc8&quot;,&quot;c_103da6cb53c10bc2&quot;,null,&quot;rc_8751fdc7f6beda59&quot;,null,null,&quot;ja&quot;,null,1,null,null,1,0]]">
<div _ngcontent-ng-c535465467="" class="formatted-code-block-internal-container ng-tns-c535465467-472">
<div _ngcontent-ng-c535465467="" class="animated-opacity ng-tns-c535465467-472">
<pre _ngcontent-ng-c535465467="" class="ng-tns-c535465467-472"><code _ngcontent-ng-c535465467="" role="text" data-test-id="code-content" class="code-container formatted ng-tns-c535465467-472"><span class="hljs-comment"># nginx.conf (Docker Compose用)</span>
<span class="hljs-attribute">location</span> <span class="hljs-regexp">~ \.php$</span> {
    <span class="hljs-comment"># ...</span>
    <span class="hljs-comment"># 'php' サービス（コンテナ）の 9000番ポートに転送</span>
    <span class="hljs-attribute">fastcgi_pass</span> php:<span class="hljs-number">9000</span>;
}
</code></pre>
</div>
</div>
</div>
<p>&nbsp;</p>
<p>（※ このTCP/IP通信によるパフォーマンスやセキュリティの懸念は、コンテナ間通信がDockerの内部ネットワークに限定されていれば、実用上ほとんど問題になりません。）</p>
<h2>【1タスク2コンテナ】本番 (ECS Fargate) での構成：</h2>
<p>さて、本題のECS Fargateです。<br />
ECSでは、<code>docker-compose.yml</code> に相当するものとして「タスク定義 (Task Definition)」を使います。</p>
<p>ここで重要なキーポイントは、<strong>「1つのタスク定義の中で、NginxコンテナとPHP-FPMコンテナの2つを定義する」</strong>ことです。</p>
<p><strong>これら2つのコンテナは、1セットで「Webアプリケーションサーバー」</strong>として機能します。</p>
<h3>ECS Fargateでのfastcgi_passはどうなる？</h3>
<p>ECSの同一タスク内で実行されるコンテナは、<b>同じネットワーク空間（ネットワークモード <code>awsvpc</code>）を共有します</b>。</p>
<p>これは、Nginxコンテナから見ると、PHP-FPMコンテナが「他人」ではなく、「自分自身（localhost）」として見えることを意味します。</p>
<p>したがって、ECS Fargate用のNginxイメージに含める <code>nginx.conf</code> の設定は、以下のようになります。</p>
<div _ngcontent-ng-c535465467="" class="code-block ng-tns-c535465467-473 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" jslog="223238;track:impression,attention;BardVeMetadataKey:[[&quot;r_4fea32b244968dc8&quot;,&quot;c_103da6cb53c10bc2&quot;,null,&quot;rc_8751fdc7f6beda59&quot;,null,null,&quot;ja&quot;,null,1,null,null,1,0]]">
<div _ngcontent-ng-c535465467="" class="formatted-code-block-internal-container ng-tns-c535465467-473">
<div _ngcontent-ng-c535465467="" class="animated-opacity ng-tns-c535465467-473">
<pre _ngcontent-ng-c535465467="" class="ng-tns-c535465467-473"><code _ngcontent-ng-c535465467="" role="text" data-test-id="code-content" class="code-container formatted ng-tns-c535465467-473"><span class="hljs-comment"># nginx.conf (ECS Fargate用)</span>
<span class="hljs-attribute">location</span> <span class="hljs-regexp">~ \.php$</span> {
    <span class="hljs-comment"># ...</span>
    <span class="hljs-comment"># サービス名ではなく、localhost (127.0.0.1) を指定する</span>
    <span class="hljs-attribute">fastcgi_pass</span> <span class="hljs-number">127.0.0.1:9000</span>;
}
</code></pre>
</div>
</div>
</div>
<p>&nbsp;</p>
<h3>タスク定義のイメージ</h3>
<p>タスク定義では、以下のように設定します。</p>
<ul>
<li><b>コンテナ-A: <code>php-fpm-container</code></b>
<ul>
<li>イメージ: （Laravelコードを含むPHP-FPMイメージ）</li>
<li>ポートマッピング: <b>なし</b> (外部に公開する必要はないため)</li>
</ul>
</li>
<li><b>コンテナ-B: <code>nginx-container</code></b>
<ul>
<li>イメージ: （設定済みのnginx.confと静的ファイルを含むNginxイメージ）</li>
<li>ポートマッピング: <b><code>80:80</code></b> (ALBからのトラフィックを受け取るため)</li>
</ul>
</li>
</ul>
<p>ALB（ロードバランサー）からのトラフィックはNginxコンテナが受け取り、必要に応じて <code>localhost:9000</code> を介してPHP-FPMコンテナに処理を渡します。</p>
<h2>Inertia/Reactのビルドファイルはどこに置く？</h2>
<p>ここで、Inertia/React構成特有の問題に直面します。</p>
<p>「InertiaはLaravel（PHP）がビューを配信する仕組みだから、<code>npm run build</code> で生成された <code>public/build</code> フォルダは、PHP-FPMコンテナにだけ置けば良いのでは？」</p>
<p>これはよくある誤解ですが、<b>パフォーマンスと責務分離の観点から、ビルドした静的ファイル（JS/CSS）はNginxコンテナに配置するのが正解</b>です。</p>
<p>この理由を理解するために、Inertiaのページが読み込まれる2段階のフローを見てみましょう。</p>
<h3>ステップ1: HTMLシェルのリクエスト (PHP-FPMが処理)</h3>
<ol start="1">
<li>ブラウザが <code>https://example.com/dashboard</code> にアクセスします。</li>
<li>ALB → Nginxコンテナがリクエストを受け取ります。</li>
<li>NginxはこれがPHPのリクエストだと判断し、<code>fastcgi_pass 127.0.0.1:9000</code> を使って<b>PHP-FPMコンテナ</b>に転送します。</li>
<li>PHP (Laravel) が起動し、Inertiaは <code>app.blade.php</code> をレンダリングしようとします。</li>
<li>このとき、PHPは <b><code>public/build/manifest.json</code></b> を読み取り、HTMLに含めるべきJS/CSSのファイル名を特定します。</li>
<li>PHPは以下のようなHTMLの「ガワ」を<b>生成</b>し、Nginx経由でブラウザに返します。
<p><response-element class="" ng-version="0.0.0-PLACEHOLDER"><code-block _nghost-ng-c535465467="" class="ng-tns-c535465467-474 ng-star-inserted"></p>
<div _ngcontent-ng-c535465467="" class="code-block ng-tns-c535465467-474 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" jslog="223238;track:impression,attention;BardVeMetadataKey:[[&quot;r_4fea32b244968dc8&quot;,&quot;c_103da6cb53c10bc2&quot;,null,&quot;rc_8751fdc7f6beda59&quot;,null,null,&quot;ja&quot;,null,1,null,null,1,0]]">
<div _ngcontent-ng-c535465467="" class="formatted-code-block-internal-container ng-tns-c535465467-474">
<div _ngcontent-ng-c535465467="" class="animated-opacity ng-tns-c535465467-474">
<pre _ngcontent-ng-c535465467="" class="ng-tns-c535465467-474"><code _ngcontent-ng-c535465467="" role="text" data-test-id="code-content" class="code-container formatted ng-tns-c535465467-474"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/build/assets/app.12345.js"</span> <span class="hljs-attr">defer</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/build/assets/app.67890.css"</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"app"</span> <span class="hljs-attr">data-page</span>=<span class="hljs-string">"..."</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
</div>
</div>
</div>
<p></code-block></response-element></li>
</ol>
<h3>ステップ2: 静的アセット(JS/CSS)のリクエスト (Nginxが処理)</h3>
<ol start="1">
<li>ブラウザは、ステップ1で受け取ったHTMLを解析します。</li>
<li>「<code>/build/assets/app.12345.js</code> と <code>/build/assets/app.67890.css</code> が必要だ」と判断し、ブラウザは<b>別途2回のリクエスト</b>をサーバーに送信します。</li>
<li><b>このリクエストは、もはやPHPとは全く関係ありません。</b></li>
<li>ALB → <b>Nginxコンテナ</b>がこの2つのリクエストを受け取ります。</li>
<li>Nginxは「自分の管理下（<code>public</code> フォルダ）にそのファイルがあるか？」を探します。</li>
<li><b>Nginxコンテナに <code>public/build/</code> 以下の実体ファイルが存在するため</b>、NginxはPHP-FPMを起動することなく、それらの静的ファイルを<b>超高速で</b>ブラウザに直接返します。</li>
</ol>
<p>もし、NginxコンテナにJS/CSSファイルがなければ、このリクエストもPHP-FPMに転送されてしまい、「JSファイルを取得するためだけにLaravelを起動する」という深刻なパフォーマンスボトルネックが発生します。</p>
<h3>CI/CDでのベストプラクティス</h3>
<p>上記2ステップから、CI/CDパイプラインでDockerイメージをビルドする際は、以下の構成が最適です。</p>
<ol start="1">
<li><code>npm run build</code> を実行し、<code>public/build</code> ディレクトリを生成します。</li>
<li><b>PHP-FPMイメージのビルド:</b>
<ul>
<li>Laravelのコード（<code>app/</code>, <code>routes/</code> など）をコピーします。</li>
<li>ステップ1のために <b><code>public/build/manifest.json</code></b> をコピーします。（リンク生成に必要）</li>
</ul>
</li>
<li><b>Nginxイメージのビルド:</b>
<ul>
<li><code>nginx.conf</code> をコピーします。</li>
<li>ステップ2のために <b><code>public</code> フォルダ全体</b>（<code>index.php</code> と、<code>public/build</code> 以下の <b>全てのJS/CSSファイル</b> を含む）をコピーします。（静的アセットの配信用）</li>
</ul>
</li>
</ol>
<h3><b>結論</b></h3>
<p><code>manifest.json</code> はPHP-FPMコンテナに、JS/CSSの実体ファイルはNginxコンテナに必要です。</p>
<p>両方のイメージに <code>public</code> フォルダ（または <code>public/build</code>）全体をコピーするのが、最もシンプルで確実な方法です。</p>
<h2>まとめ</h2>
<p>ECS Fargateで Laravel + Inertia + React 構成を動かすための要点をまとめます。</p>
<ol start="1">
<li><b>構成</b>: 「1タスク2コンテナ（Nginx + PHP-FPM）」構成を採用します。</li>
<li><b><code>fastcgi_pass</code></b>: NginxからPHP-FPMへの通信は、同一タスク内のため <code>fastcgi_pass 127.0.0.1:9000;</code> を指定します。</li>
<li><b>静的ファイル</b>: ビルドしたJS/CSSは、パフォーマンス最適化のためNginxコンテナに配置し、Nginxから直接配信させます。</li>
<li><b><code>manifest.json</code></b>: HTMLシェル生成のため、PHP-FPMコンテナにも <code>manifest.json</code> が必要です。</li>
</ol>
<p>この構成により、PHP-FPMは動的処理に専念し、Nginxは静的ファイルの高速配信に専念するという、「1コンテナ1責務」のメリットを最大限に活かした、スケーラブルな本番環境を構築できます。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/2153/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【AWS解説】ALBのHTTPSリダイレクト、コンテナはポート80でなぜOK？</title>
		<link>https://otonan-syusyoku.work/archives/2147</link>
					<comments>https://otonan-syusyoku.work/archives/2147#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Fri, 17 Oct 2025 01:45:08 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[ALB]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=2147</guid>

					<description><![CDATA[AWSでWebアプリケーションを構築する際、ALB (Application Load Balancer) を使ってHTTPS化するのはもはや常識です。しかし、多くの開発者が一度は疑問に思う点があります。 「ALBでHT [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>AWSでWebアプリケーションを構築する際、ALB (Application Load Balancer) を使ってHTTPS化するのはもはや常識です。しかし、多くの開発者が一度は疑問に思う点があります。</p>
<p><b>「ALBでHTTPS化したのに、なぜ後ろにいるECSコンテナはポート80（HTTP）のままで通信できるんだろう？」</b></p>
<p>この一見不思議な挙動は、ALBが持つ2つの重要な役割を理解することで、スッキリと解決します。今回は、このALBの「魔法」の仕組みを、セキュリティグループの設定から紐解いていきましょう。</p>
<h2>最終的な構成：安全な3層アーキテクチャ</h2>
<p>まず、私たちが目指すのは、セキュリティと可用性のベストプラクティスに基づいた、以下のような3層アーキテクチャです。</p>
<ul>
<li><b>Web層</b>: ALBがインターネットからのリクエストをすべて受け付けます。</li>
<li><b>AP層</b>: ECSコンテナがプライベートな領域でアプリケーションを動かします。</li>
<li><b>DB層</b>: RDSがさらに内側のプライベートな領域でデータを安全に保管します。</li>
</ul>
<p>この構成のセキュリティの肝は<strong>「ECSはALBからの通信しか受け付けない」</strong>というルールです。これを実現するのが、次に説明するセキュリティグループです。</p>
<p>&nbsp;</p>
<h2>門番の役割を担う「セキュリティグループ」</h2>
<p>セキュリティグループは、リソースのドアを守る「バーチャルな門番」です。今回は3人の門番を配置します。</p>
<ol start="1">
<li><b>ALBの門番</b>: インターネットからの訪問者（ポート80, 443）を全員受け入れます。</li>
<li><b>ECSの門番</b>: <b>ALBの門番から紹介された人</b>（ALBからのトラフィック）<b>だけ</b>を通します。それ以外の人は全員お断りです。</li>
<li><b>RDSの門番</b>: <b>ECSの門番から紹介された人</b>（ECSからのトラフィック）<b>だけ</b>を通します。</li>
</ol>
<p>この連携により、たとえ攻撃者がECSに直接アクセスしようとしても、門前払いされる仕組みが完成します。</p>
<h2>ALBがこなす2つの全く異なる仕事</h2>
<p>さて、ここからが本題です。ユーザーが<code>http://</code>でアクセスしてきた時に、ALBとコンテナの間で何が起きているのでしょうか。実は、これは<b>2段階の独立した処理</b>になっています。</p>
<p>ポイントは役割が2つ存在するということです。</p>
<h3>ブラウザへの「リダイレクト指示」</h3>
<p>最初のやり取りは、ユーザーのブラウザとALBの間だけで完結します。</p>
<ol start="1">
<li><b>ユーザー</b>: ブラウザで <code>http://example.com</code> (ポート80) にアクセス。</li>
<li><b>ALB (ポート80の受付係)</b>: リクエストを受け取ると、中身は見ずにこう応答します。「<b>すみません、こちらの窓口は安全ではありません。向かいにある安全な443番の窓口へ行き直してください</b>」。これが<b>HTTP 301リダイレクト</b>です。</li>
</ol>
<p><b>この時点では、リクエストはまだECSコンテナには一切届いていません。</b></p>
<h3>ステップ2：コンテナへの「リクエスト転送」</h3>
<p>ブラウザはALBからの指示に従い、今度は最初から安全な窓口へ向かいます。</p>
<ol start="1">
<li><b>ユーザー</b>: ブラウザが自動的に <code>https://example.com</code> (ポート443) に<b>新しいリクエスト</b>を送信します。</li>
<li><b>ALB (ポート443の受付係)</b>:
<ul>
<li>暗号化されたリクエストを受け取り、持っているSSL証明書を使って<b>通信を復号</b>します（SSL/TLS終端）。</li>
<li>安全な平文になったリクエストを、宛先である<b>ECSコンテナのポート80</b>へ転送（フォワード）します。</li>
</ul>
</li>
<li><b>ECSコンテナ (ポート80)</b>: ALBから来た通常のHTTPリクエストを受け取り、処理を実行します。</li>
</ol>
<p>このように、ALBは<strong>ユーザーを正しい入口へ案内する「案内係」</strong>の仕事と、<strong>リクエストを内部の担当者へ届ける「取次係」</strong>の仕事という、2つの全く異なる役割をこなしているのです。</p>
<p>コンテナからすれば、常にALBという信頼できる取次係から、暗号化が解かれた分かりやすいリクエストが届くだけなので、ポート80で待ち受けていれば良い、というわけです。</p>
<p>非常に便利ですね。。</p>
<h2>CDKの実装</h2>
<h3>SecurityGroup の実装</h3>
<pre class="line-numbers"><code class="language-php">// ALB用セキュリティグループ
const albSecurityGroup = new ec2.SecurityGroup(this, 'AlbSg', { vpc });
albSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80), 'Allow HTTP');
albSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(443), 'Allow HTTPS');

// ECS用セキュリティグループ
const ecsSecurityGroup = new ec2.SecurityGroup(this, 'EcsSg', { vpc });
// ALBからの通信のみを、コンテナのポート80で許可
ecsSecurityGroup.addIngressRule(
    albSecurityGroup,
    ec2.Port.tcp(80),
    'Allow traffic only from ALB'
);</code></pre>
<h3>ALBリスナー</h3>
<pre class="line-numbers"><code class="language-js">// ALB本体を作成
const alb = new elbv2.ApplicationLoadBalancer(this, 'MyAlb', {
    vpc,
    internetFacing: true,
    securityGroup: albSecurityGroup,
});

// HTTPリスナー (ポート80): HTTPSへリダイレクトするだけ
alb.addListener('HttpListener', {
    port: 80,
    defaultAction: elbv2.ListenerAction.redirect({
        protocol: 'HTTPS',
        port: '443',
        permanent: true,
    }),
});

// HTTPSリスナー (ポート443): ECSへリクエストを転送する
alb.addListener('HttpsListener', {
    port: 443,
    certificates: [certificate], // ACMで発行した証明書
    defaultAction: elbv2.ListenerAction.forward([ecsTargetGroup]), // ECSのターゲットグループ
});</code></pre>
<h2>まとめ</h2>
<ul>
<li>ALBのHTTP→HTTPSリダイレクトは、「リダイレクト指示」<b>と</b>「リクエスト転送」の2段階で行われる。</li>
<li>SSL/TLSによる暗号化・復号の処理はALBがすべて肩代わりしてくれる（<b>SSL/TLS終端</b>）。</li>
<li>コンテナは、ALBから転送されてくる<b>暗号化されていないHTTPリクエスト</b>を受け取るだけで良い。</li>
<li><b>セキュリティグループ</b>を正しく設定することで、この安全な通信経路が完成する。</li>
</ul>
<p>役割が2つあることが分からなければ理解できなかったなぁ。</p>
<p>&nbsp;</p>
<h2>参考記事</h2>
<div class="awsui_grid-column_14yj0_16am7_186 awsui_colspan-12_14yj0_16am7_307">
<div class="awsui_restore-pointer-events_14yj0_16am7_357">
<ol>
<li><a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html">What is an Application Load Balancer?</a></li>
<li><a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html">Listeners for your Application Load Balancers</a></li>
</ol>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/2147/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【AWS】VPCってなんだかんだ難しいよね</title>
		<link>https://otonan-syusyoku.work/archives/1967</link>
					<comments>https://otonan-syusyoku.work/archives/1967#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Tue, 22 Oct 2024 20:37:25 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[生涯独学]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1967</guid>

					<description><![CDATA[&#160; ネットワークACLとセキュリティグループ 項目 ネットワークACL（NACL） セキュリティグループ 適用範囲 サブネット単位で適用 インスタンス単位で適用 ルールの処理順 番号順に評価（最初に一致したルー [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>&nbsp;</p>
<h2>ネットワークACLとセキュリティグループ</h2>
<table>
<thead>
<tr>
<th>項目</th>
<th>ネットワークACL（NACL）</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>
<tr>
<td>適用タイミング</td>
<td>サブネットレベルでトラフィックがフィルタリングされる</td>
<td>インスタンスレベルでトラフィックがフィルタリングされる</td>
</tr>
<tr>
<td>デフォルトの動作</td>
<td>すべてのトラフィックを許可（デフォルトNACLの場合）</td>
<td>すべてのトラフィックを拒否（デフォルトセキュリティグループの場合）</td>
</tr>
<tr>
<td>ルールの数</td>
<td>最大20のルール（1つのNACLあたり）</td>
<td>最大60のルール（1つのセキュリティグループあたり）</td>
</tr>
<tr>
<td>ユースケース</td>
<td>複数のインスタンスに対して一貫したトラフィック制御が必要な場合</td>
<td>インスタンスごとに細かくトラフィックを制御したい場合</td>
</tr>
<tr>
<td>推奨される用途</td>
<td>サブネットレベルのアクセス制御（外部からのトラフィックのフィルタリング）</td>
<td>アプリケーションレベルのアクセス制御（特定インスタンスへのアクセス制御）</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2>NatゲートウェイとNATインスタンス</h2>
<table>
<thead>
<tr>
<th>項目</th>
<th>NATゲートウェイ</th>
<th>NATインスタンス</th>
</tr>
</thead>
<tbody>
<tr>
<td>設定と管理</td>
<td>フルマネージドサービス。AWSが自動でスケーリング、冗長性を提供。</td>
<td>EC2インスタンスを手動で立ち上げ、管理。スケーリングや冗長化はユーザーが設定する必要あり。</td>
</tr>
<tr>
<td>可用性</td>
<td>高可用性（単一のアベイラビリティゾーンまたはマルチAZ対応）。</td>
<td>冗長化は手動で設定が必要（自動フェイルオーバーなし）。</td>
</tr>
<tr>
<td>スケーラビリティ</td>
<td>自動スケーリングに対応。トラフィック量に応じて自動的に調整。</td>
<td>インスタンスのサイズや数を手動で調整する必要あり。</td>
</tr>
<tr>
<td>料金</td>
<td>使用した時間とトラフィックに応じて課金されるが、基本的に高コスト。</td>
<td>インスタンスのサイズと実行時間に基づく課金。小規模な環境ではコストを抑えられる。</td>
</tr>
<tr>
<td>ネットワークスループット</td>
<td>最大45Gbpsのスループットを提供し、大量のトラフィックに対応。</td>
<td>インスタンスの種類に依存。大規模なトラフィックでは性能が制約される。</td>
</tr>
<tr>
<td>セキュリティグループ</td>
<td>セキュリティグループは設定不可。NACL（ネットワークACL）で制御する。</td>
<td>セキュリティグループを設定して、きめ細かいアクセス制御が可能。</td>
</tr>
<tr>
<td>運用の複雑さ</td>
<td>AWSが管理するため、運用負担が少ない。</td>
<td>監視・メンテナンスが必要。手動でスケーリングやフェイルオーバーを設定する必要がある。</td>
</tr>
<tr>
<td>ユースケース</td>
<td>高可用性とスケーラビリティが重要な環境。</td>
<td>コストを抑えたい小規模環境やテスト環境。</td>
</tr>
</tbody>
</table>
<h2>ルートテーブル</h2>
<p>VPC内のルーティングを行ってくれる。</p>
<p>送信先に当てはまらない通信はデフォルトの 「0.0.0.0/0」 に流れる。</p>
<p>送信先に一致した通信はそのターゲットにルーティングしてくれる。</p>
<h2>VPC内で使われるリソース/機能</h2>
<h3>ENI</h3>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>VPCエンドポイント</h3>
<p><span>S3やDynamoDBなどインターネットから直接利用できるVPC外のAWSサービスへアクセスは、通常インターネットゲートウェイを経由して通信する。</span></p>
<p><span>VPCエンドポイントは、セキュリティ上の制約でインターネットとの通信が制限されている<span class="sc_marker blue"><strong>プライベートサブネット内のAWSリソースから、インターネットゲートウェイを経由せずにVPC外のAWSサービスへアクセス可能にする機能</strong></span></span>になりまっす。</p>
<p>この機能は２つの手法がある。</p>
<h4>ゲートウェイ型</h4>
<p>ルートテーブルにVPCのエンドポイントを指定してルーティングする</p>
<p>イメージ： VPCに専用の穴を開ける</p>
<h4>PrivateLink（インターフェース型）</h4>
<p>AWSのサービスへ接続したいリソースが配置されているサブネットにプライベートIPアドレスを持つENIを作成して、ENIとサービスをリンクさせる</p>
<p>イメージ： 直リンク</p>
<h3>VPCピアリング</h3>
<p>VPC同士を紐づける機能</p>
<ul>
<li><strong>異なるアカウント間のVPC接続</strong>
<ul>
<li>1つのAWSアカウントに限らず、<strong>別のAWSアカウントのVPC</strong>ともピアリングが可能。</li>
</ul>
</li>
<li><strong>リージョン間のリソース接続</strong>
<ul>
<li>VPCピアリングを使えば、異なるリージョンにあるVPC間でも安全な通信を確立できます。</li>
</ul>
</li>
</ul>
<h3>Egress-Onlyインターネットゲートウェイ</h3>
<p>IPv6専用の<strong>アウトバウンド通信</strong>を提供するゲートウェイ。<br />
AWS VPCでIPv6アドレスを使用する場合、<strong>インターネットへの発信通信は許可し、受信通信をブロック</strong>する必要がある場合に使用するよん。</p>
<p>NATゲートウェイのIPV6用と思ってもらえれば良い。</p>
<h3><label class="form-check-label d-inline">AWS Transit Gateway</label></h3>
<div class="mb-6">複数のVPCやオンプレミスネットワークを<strong>中央集約的なハブ</strong>で接続するためのネットワーキングサービスです。各VPCやVPNはTransit Gatewayに接続され、個別にルーティングする必要なく<strong>効率的な相互接続</strong>が可能になります。</div>
<div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1967/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>スループットとレイテンシーとIOPS</title>
		<link>https://otonan-syusyoku.work/archives/1949</link>
					<comments>https://otonan-syusyoku.work/archives/1949#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Tue, 15 Oct 2024 13:17:25 +0000</pubDate>
				<category><![CDATA[絶対に必要なIT基礎知識]]></category>
		<category><![CDATA[インフラ]]></category>
		<category><![CDATA[ソフトウェア]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<category><![CDATA[三流プログラマー]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1949</guid>

					<description><![CDATA[部屋とYシャツと私のような記事タイトルですみません。。。 今回は、ネットワークの基礎となる スループット レイテンシー IOPS を紹介したいと思います。 &#160; インフラ構築をしているとよく出てくるキーワードです [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>部屋とYシャツと私</strong>のような記事タイトルですみません。。。</p>
<p>今回は、ネットワークの基礎となる</p>
<ul>
<li>スループット</li>
<li>レイテンシー</li>
<li>IOPS</li>
</ul>
<p>を紹介したいと思います。</p>
<p>&nbsp;</p>
<p>インフラ構築をしているとよく出てくるキーワードですが、度々こんがらがってしまうため改めて学び直します。</p>
<p>&nbsp;</p>
<h2>お前ら何やねん</h2>
<h3>スループットとは</h3>
<p><span class="sc_marker blue"><strong>特定の時間にネットワークを実際に通過できるデータの平均量を指します。</strong></span></p>
<p>つまり通信速度です。</p>
<pre class="line-numbers"><code class="language-other">5Gbps=5×1,000,000,000ビット/秒=5,000,000,000ビット/秒</code></pre>
<p>1秒間に10億ビット通過できるんだ-と思いますが、ネットワーク内には様々なリソースがあるので、提供されるスペック通りの値が通過できるとは限りません。あくまで平均ね。</p>
<h3>レイテンシーとは</h3>
<p><span class="sc_marker blue"><strong>リクエストを送信してから応答が返ってくるまでの遅延時間</strong></span>を指します。</p>
<p>ちょうわかりやすく言うと、「データの処理や通信がどれだけ迅速に行われるか」の指標のことです。</p>
<h3>IOPSとは</h3>
<p><span class="sc_marker blue"><strong>ストレージやデータベースが1秒間に処理できる入出力操作の回数</strong></span>を指します。</p>
<p>IOPSはスループットとある程度、比例関係にあります。</p>
<ul>
<li><strong>小さいブロックサイズ</strong>の場合、1回のIO操作で処理されるデータ量が少ないため、<strong>操作回数が多くなり、IOPSが増加する</strong></li>
<li><strong>大きなブロックサイズ</strong>の場合、1回のIO操作で大量のデータを処理するため、<strong>IO操作回数が少なくなり、IOPSは減少</strong>しますが、スループットは向上する</li>
</ul>
<h2>3つの違いのまとめ</h2>
<h3><strong>レイテンシー</strong></h3>
<ul>
<li><strong>嬉しい状態</strong>:<span class="sc_marker blue"><strong>低いほうが嬉しい</strong></span></li>
<li><strong>理由</strong>:<br />
レイテンシーが低い（つまり遅延時間が短い）ほど、システムがより速く応答し、ユーザーが操作を行った際の待ち時間が少なくなります。<br />
たとえば、Webページが速く表示されたり、データベースのクエリが迅速に実行されたりすることで、ユーザー体験が向上します。</li>
<li>例: ネットワークレイテンシーが低いと、Webサイトの応答が速くなります。</li>
</ul>
<h3><strong>スループット</strong></h3>
<ul>
<li><strong>嬉しい状態</strong>: <span class="sc_marker blue"><strong>高いほうが嬉しい</strong></span></li>
<li><strong>理由</strong>:<br />
スループットが高いほど、システムが短時間で多くのデータやリクエストを処理できることを意味します。<br />
特に、大量のデータを処理する場合や多くのユーザーが同時にアクセスするシステムにおいて、高いスループットはシステムの効率や全体のパフォーマンスを向上させます。</li>
<li>例: スループットが高いネットワークでは、1秒間に多くのデータを送受信でき、ダウンロードやストリーミングがスムーズに行えます。</li>
</ul>
<h3><strong>IOPS </strong></h3>
<ul>
<li><strong>嬉しい状態</strong>: <span class="sc_marker blue"><strong>高いほうが嬉しい</strong></span></li>
<li><strong>理由</strong>:<br />
IOPSが高いほど、ストレージデバイスが1秒間に処理できる入出力操作の回数が多くなります。<br />
これは、特にデータベースやファイルシステムなど、頻繁にデータの読み書きが発生するシステムにとって重要です。<br />
高いIOPSは、より多くの入出力操作を短時間で処理できるため、パフォーマンスが向上します。</li>
<li>例: IOPSが高いSSDは、ディスクアクセスが多いアプリケーション（例えばデータベースクエリやログ書き込み）の性能を大幅に改善します。</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1949/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【HTTPとHTTPS】Webの基盤となるプロトコルをちゃんと理解しましょう</title>
		<link>https://otonan-syusyoku.work/archives/1670</link>
					<comments>https://otonan-syusyoku.work/archives/1670#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Fri, 12 Apr 2024 15:01:48 +0000</pubDate>
				<category><![CDATA[生涯独学]]></category>
		<category><![CDATA[絶対に必要なIT基礎知識]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[ソフトウェア]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1670</guid>

					<description><![CDATA[こんにちは。三流プログラマーとして都内で勤務しているやんやんです。 先日インターン生からこんな質問を受けました。 インターン生 HTTPってなんですか？ 私自身、しっかりと理解できていないためか上手な説明ができなかったの [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="flex flex-grow flex-col max-w-full">
<div data-message-author-role="assistant" data-message-id="b5a51399-596c-435a-b3f3-3096850b8a5b" class="text-message flex flex-col items-start gap-3 whitespace-pre-wrap break-words [.text-message+&amp;]:mt-5 overflow-x-auto">
<div class="markdown prose w-full break-words dark:prose-invert dark">
<p>こんにちは。三流プログラマーとして都内で勤務しているやんやんです。</p>
<p>先日インターン生からこんな質問を受けました。</p>
<div class="voice left">
<div class="icon">
<p><img decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2021/04/名称未設定のデザイン-4-1.png" /></p>
<div class="name">インターン生</div>
</div>
<div class="text sc-inner-content sc_balloon left blue">
<p>HTTPってなんですか？</p>
</div>
</div>
</div>
<p>私自身、しっかりと理解できていないためか上手な説明ができなかったので改めて勉強しようと思った今日この頃です。</p>
</div>
<p>&nbsp;</p>
<p>この記事では、これらのプロトコルの基本、特にメソッド、ステータスコード、ヘッダー、クッキーという要素に焦点を当て、それらがどのようにWebの基盤となっているかを掘り下げます。</p>
<p>さらに、HTTPSがHTTPにセキュリティ層を追加する方法と、その重要性についても触れていこうと思いまっす</p>
<div data-message-author-role="assistant" data-message-id="b5a51399-596c-435a-b3f3-3096850b8a5b" class="text-message flex flex-col items-start gap-3 whitespace-pre-wrap break-words [.text-message+&amp;]:mt-5 overflow-x-auto">
<div class="markdown prose w-full break-words dark:prose-invert dark">
<h2>HTTPとは</h2>
<p><img fetchpriority="high" decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1.png" alt="What&#96;s up" width="1000" height="500" class="aligncenter size-full wp-image-1665" srcset="https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1.png 1000w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/DMARCを設定しなくちゃ-1-768x384.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<p>HTTPは、WebブラウザとWebサーバー間の通信を可能にするプロトコルです。</p>
<p>太古の昔(1990年代)にWebの成長とともに進化してきました。</p>
<p>HTTPはステートレスなプロトコルであり、つまり、過去のリクエストやレスポンスの状態を保持しないという特徴があります。これにより、プロトコルのシンプルさと拡張性が保たれています。</p>
<div class="sc_toggle_box">
<div class="sc_toggle_title active">あわせて読みたい関連記事</div>
<div class="sc_toggle_content">
<p>[getpost id=&#8221;1569&#8243; target=&#8221;_blank&#8221; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
</div>
</div>
<h2>HTTPSとその重要性</h2>
<p><img decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO.png" alt="Let&#96;s GO" width="1000" height="500" class="aligncenter size-full wp-image-1680" srcset="https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO.png 1000w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO-768x384.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<p>HTTPSは、HTTPにセキュリティ層を加えたものです。</p>
<p>具体的には、SSL（Secure Sockets Layer）またはTLS（Transport Layer Security）を使用して、クライアントとサーバー間の通信を暗号化します。</p>
<p>この暗号化により、データの盗聴や改ざん、なりすましを防ぐことが可能になります。特に、Eコマースやオンラインバンキングなど、機密性が求められる情報を扱うWebサイトではHTTPSが必須となっています。</p>
<p>SSLを知らないとWEB業界では大恥をかくので、皆さんご注意を。</p>
<div class="sc_toggle_box">
<div class="sc_toggle_title active">あわせて読みたい関連記事</div>
<div class="sc_toggle_content">
<p>[getpost id=&#8221;1170&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<p>&nbsp;</p>
</div>
</div>
<h2>HTTPメソッド</h2>
<p>HTTPメソッドは、クライアントがサーバーに対して何をしたいのかを指示するための手段です。<br />
最も一般的なメソッドは以下の通りです。</p>
<ul>
<li><strong>GET<br />
</strong>リソースを取得するために使用します。</li>
<li><strong>POST<br />
</strong> リソースを作成するために使用します。</li>
<li><strong>PUT<br />
</strong>リソースを更新するために使用します。</li>
<li><strong>DELETE<br />
</strong>リソースを削除するために使用します。</li>
</ul>
<p>これらのメソッドは、RESTful APIの設計において重要な役割を果たします。</p>
<h2>ステータスコード</h2>
<p>HTTPステータスコードは、サーバーがクライアントのリクエストをどのように処理したかを示します。以下は、よく使われるステータスコードの例です。</p>
<ul>
<li><strong>200 OK</strong>: リクエストが成功したことを示します。</li>
<li><strong>404 Not Found</strong>: リクエストされたリソースが見つからなかったことを示します。</li>
<li><strong>500 Internal Server Error</strong>: サーバー側で問題が発生したことを示します。</li>
</ul>
<p>これらのコードは、デバッグやエラー処理において極めて有用です。</p>
<h2>ヘッダーとクッキー</h2>
<p>HTTPヘッダーは、リクエストやレスポンスのメタデータを提供します。例えば、<code>Content-Type</code>ヘッダーはリソースのタイプを示し、<code>Set-Cookie</code>ヘッダーはクライアントにクッキーを設定するよう指示します。</p>
<p>クッキーは、サーバーがクライアントのブラウザにデータを保存するために使用される小さなデータ片です。これにより、セッション管理、パーソナライゼーション、トラッキングなどが可能になります。</p>
<h2>まとめ</h2>
<p>HTTPとHTTPSは、Web上での情報交換の基盤を成すプロトコルです。HTTPSによる暗号化は、オンラインでの安全性を大幅に向上させています。HTTPメソッド、ステータスコード、ヘッダー、クッキーといった要素の理解は、Web技術において深い知識を持つために不可欠です。これらの基本を押さえることで、よりセキュアで効率的なWebアプリケーションの開発が可能となります。</p>
</div>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1670/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CIDRが分からないから少し理解するまでに至りたい</title>
		<link>https://otonan-syusyoku.work/archives/1621</link>
					<comments>https://otonan-syusyoku.work/archives/1621#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sun, 28 Jan 2024 07:25:44 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[ネットワーク]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1621</guid>

					<description><![CDATA[CIDR（Classless Inter-Domain Routing）って聞いたことありますか？僕は知らないままサーバー構築していたのでお客様との打ち合わせで大恥を書いた経験があります。 本業はプログラマーですがお客様 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="flex flex-grow flex-col max-w-full">
<div data-message-author-role="assistant" data-message-id="cd491fb6-d751-45eb-8004-eaa9b1167b78" class="min-h-[20px] text-message flex flex-col items-start gap-3 whitespace-pre-wrap break-words [.text-message+&amp;]:mt-5 overflow-x-auto">
<div class="markdown prose w-full break-words dark:prose-invert dark">CIDR（Classless Inter-Domain Routing）って聞いたことありますか？僕は知らないままサーバー構築していたのでお客様との打ち合わせで大恥を書いた経験があります。</div>
<div class="markdown prose w-full break-words dark:prose-invert dark">本業はプログラマーですがお客様やインフラの方との話ができるなるべく、全くわからないから少し理解したっていう状況を目指して勉強していきましょーう</p>
<h2>CIDRとは</h2>
<p>CIDR（Classless Inter-Domain Routing）とは、<span class="sc_marker blue"><strong>インターネットでIPアドレスをうまく管理するための技術 </strong></span>のことを指します。</p>
<p>昔はIPアドレスが「クラス」という固定の枠に分けられていたんですけど、CIDRではそんな枠組みをなくして、もっと自由にアドレスを割り当てられるようになったんですよ。</p>
<p>&nbsp;</p>
<p>例を挙げると、「192.168.0.0/24」っていうのはCIDR形式のアドレスになります。</p>
<p>ここで「192.168.0.0」がIPアドレスで、「24」がネットワークの大きさを示すんです。</p>
<ul>
<li>「192.168.0」の部分（最初の24ビット）は、ネットワークアドレスを示しています。</li>
<li>このネットワーク内の個々の機器は、「.1」のように、最後の8ビットで区別されます。</li>
</ul>
<p>つまり、「192.168.0.1」から「192.168.0.254」までのアドレスは、すべて「192.168.0.x」という形で、同じネットワーク（「192.168.0」）に属している機器として識別されるのです。</p>
<pre class="line-numbers">// 無理やりMarkDownで表すと以下のような感じ
- 192.168.0.0
  - 192.168.0.1
    |
  - 192.168.0.254</pre>
<h3>CIDRが難しく感じる理由</h3>
<p>「CIDRってなんだか難しそう&#8230;」と思うのは、私たちが普段使ってるIPアドレスの考え方とちょっと違うからかもしれません。</p>
<p>サブネットマスクっていうのをビット単位で調整することで、ネットワークの大きさを自由に変えられるんです。</p>
<p>これ、最初はピンとこないかもしれませんが、慣れればすごく便利なんですよ。</p>
<h3>AWSにおけるCIDR</h3>
<p>AWSにおいて <span class="sc_marker blue"><strong>CIDRはものすごく大事な役割を果たしています</strong></span>。</p>
<p>たとえば、VPC（Virtual Private Cloud）を作るとき、CIDRブロックを使って、そのVPC内で使えるIPアドレスの範囲を決めます。</p>
<p>これがあるおかげで、私たちは自由にネットワークを設計できるんです。</p>
<p>「10.0.0.0/16」っていうCIDRブロックは、10.0.0.0から10.0.255.255までのIPアドレスを含んでいて、これをサブネットに分けて使うことができるんです。</p>
<h3>ユースケース</h3>
<p>CIDRの具体的なユースケースについて考えてみましょう。</p>
<p>例えば、大学のキャンパスネットワークを思い浮かべてください。<br />
学生用、教職員用、研究用といった複数のセグメントに分かれていますよね。CIDRを使用することで、これらの異なるセグメントに効率的にIPアドレスを割り当てることができます。</p>
<p>&nbsp;</p>
<p>別の例として、大手企業が複数のオフィスを持っている場合を考えてみましょう。<br />
各オフィスは地理的に離れているため、それぞれ独立したネットワークを必要とします。<br />
CIDRを利用することで、各オフィスに必要なIPアドレス範囲を効率的に割り当て、ネットワークの管理を簡素化できます。</p>
<p>もう一つの例は、セキュリティ面です。<br />
異なるサブネット間での通信を制限することで、ネットワーク内部のセキュリティを強化できるんです。クラウド環境では、このようなネットワーク分離がデータ保護やアクセス制御に役立つんですよ。</p>
<h2>まとめ</h2>
<p>CIDRって最初はちょっと難しそうに見えますけど、実はすごく便利なツールなんです。<br />
基本さえ理解すれば、ネットワークの設計がぐんと楽になりますよ。まずはこの記事を読んで、CIDRの世界に少しずつ慣れていきましょう！</p>
</div>
</div>
</div>
<div class="mt-1 flex justify-start gap-3 empty:hidden">
<div class="text-gray-400 flex self-end lg:self-center justify-center lg:justify-start mt-0 -ml-1 visible">
<div></div>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1621/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
