<?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/%e6%a5%ad%e5%8b%99/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Wed, 25 Feb 2026 08:34:10 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>業務 &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>マルチステージビルドでイメージサイズを劇的に削減できるべ</title>
		<link>https://otonan-syusyoku.work/archives/2165</link>
					<comments>https://otonan-syusyoku.work/archives/2165#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Wed, 19 Nov 2025 04:09:20 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[業務]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=2165</guid>

					<description><![CDATA[PHPアプリケーションのコンテナイメージを作成する際、ビルドに必要なツール（Composer、各種コンパイラなど）をすべて含めてしまうと、イメージが肥大化し、セキュリティリスクも増大します。 この課題を解決するのが、コン [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="model-response-message-contentr_700d418a97f56345" class="markdown markdown-main-panel stronger enable-updated-hr-color" dir="ltr" aria-live="polite" aria-busy="false">
<p>PHPアプリケーションのコンテナイメージを作成する際、ビルドに必要なツール（Composer、各種コンパイラなど）をすべて含めてしまうと、イメージが肥大化し、セキュリティリスクも増大します。</p>
<p>この課題を解決するのが、コンテナビルドの効率を最大化する技術、<b>マルチステージビルド</b>です。</p>
<h2>マルチステージビルドとは？</h2>
<p>マルチステージビルドとは、<b>一つの<code>Dockerfile</code>内で複数の<code>FROM</code>命令（ステージ）を定義し、最終的なイメージにデプロイに必要なファイルだけをコピーする</b>手法です。</p>
<h3>役割分担</h3>
<ol start="1">
<li><b>ビルドステージ (Build Stage):</b>
<ul>
<li><b>目的:</b> アプリケーションのビルドと依存関係の解決。</li>
<li><b>使用イメージ:</b> <b>大きなイメージ</b>（例: <code>composer:latest</code>、<code>php:8.3-fpm</code>など）。</li>
<li><b>作業:</b> Composerによる依存パッケージのインストール、フロントエンドアセットのコンパイル、テストの実行などを行います。</li>
<li><b>特徴:</b> このステージは最終的なデプロイには使用されません。</li>
</ul>
</li>
<li><b>最終ステージ (Final Stage):</b>
<ul>
<li><b>目的:</b> アプリケーションの実行環境の構築。</li>
<li><b>使用イメージ:</b> <b>軽量なイメージ</b>（例: <code>php:8.3-fpm-alpine</code>、<code>distroless</code>など）。</li>
<li><b>作業:</b> ビルドステージで生成された<b>成果物</b>（例: <code>vendor</code>ディレクトリ、コンパイル済みバイナリ、PHPコード）のみをコピーします。</li>
</ul>
</li>
</ol>
<h3>メリット</h3>
<ul>
<li><b>イメージサイズの劇的な削減:</b> ビルドツールやキャッシュ、開発用の依存関係が最終イメージから完全に除外されます。</li>
<li><b>セキュリティ向上:</b> 最終イメージが最小限の構成になるため、攻撃対象となる領域が縮小します。</li>
<li><b>ビルド時間の短縮:</b> 軽量なイメージを使用することで、プル時間が短くなります。</li>
</ul>
<h2>PHPアプリケーションでのマルチステージビルド</h2>
<p>PHPアプリケーションの典型的なマルチステージビルドは、<b>Composerによる依存関係の解決</b>を分離することに焦点を当てます。</p>
<h3>Dockerfile</h3>
<p>以下の<code>Dockerfile</code>は、Composerで依存関係を解決するステージと、それを使ってアプリケーションを実行する最小限のステージに分離しています。</p>
<pre class="ng-tns-c519592647-2110"><code># =============================================</code>
<code># ステージ1：build_stage（依存関係の解決）</code>
<code># =============================================</code>
<code>FROM composer:latest AS build_stage 
WORKDIR /app 
# 先に依存関係ファイルだけをコピー（キャッシュ効率化のため）
COPY composer.json composer.lock ./ 
# 本番環境用に最適化してインストール 
</code><code># --no-dev: 開発用パッケージを除外</code>
<code># --optimize-autoloader: オートローダーを最適化して高速化 
</code><code>RUN composer install \</code>
<code>--no-dev \</code>
<code>--no-interaction \</code>
<code>--optimize-autoloader 
</code><code># =============================================</code>
<code># ステージ2：final_stage（最小限の実行環境）</code>
<code># =============================================</code>
<code># 軽量なAlpine LinuxベースのPHP-FPMイメージを使用</code>
<code>FROM php:8.3-fpm-alpine AS final_stage 
</code><code># セキュリティ：実行用の非特権ユーザーを作成</code>
<code>RUN adduser -D appuser</code>
<code>USER appuser
</code><code>WORKDIR /var/www/html
</code><code># ステージ1からvendorディレクトリのみをコピー</code>
<code># --chown で所有権を同時に変更するのがポイント</code>
<code>COPY --from=build_stage --chown=appuser:appuser /app/vendor ./vendor
</code><code># アプリケーションのソースコードをコピー</code>
<code>COPY --chown=appuser:appuser . .
 </code>
<code># PHP-FPMを起動 
</code><code>EXPOSE 9000</code><code>
CMD ["php-fpm"]</code><span style="font-size: 14px; background-color: #dddddd;">

</span></pre>
</div>
<h3>実行手順</h3>
<ol start="1">
<li><b>プロジェクトルートに配置:</b> 上記の<code>Dockerfile</code>をプロジェクトのルートディレクトリに配置します。</li>
<li><b><code>docker build</code>を実行:</b> 通常通り<code>docker build</code>コマンドを実行するだけです。Dockerエンジンが自動的にマルチステージビルドを処理します。</li>
</ol>
<pre class="line-numbers"><code class="language-php">docker build -t my-php-app:prod .</code></pre>
<h3>PHPでのポイント</h3>
<ol start="1">
<li><b><code>composer_stage</code>の利用:</b> Composerをインストールする手間を省くため、公式の<code>composer</code>イメージをビルダーとして使うのが最も効率的です。</li>
<li><b><code>--no-dev</code>:</b> 開発時のみ必要なパッケージ（テストフレームワークなど）は最終イメージに含めないようにします。</li>
<li><b><code>USER nonroot</code>:</b> セキュリティのため、最終ステージでは必ず<code>root</code>権限を放棄し、<b>非特権ユーザー</b>でアプリケーションを実行するように設定しましょう。（これにより、低ポート番号の使用には制約が生じますが、セキュリティが大幅に向上します）</li>
<li><b><code>COPY --from</code>の活用:</b> この命令が全てです。Composerの巨大なキャッシュやビルドツール群を最終イメージから排除し、必要な<code>vendor</code>ディレクトリだけをクリーンにコピーします。</li>
</ol>
<p>マルチステージビルドは、軽量で安全なPHPコンテナイメージを作成するための必須技術です。ぜひあなたのプロジェクトに導入してください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/2165/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>EC2のSSHのセキュリティを高めたい</title>
		<link>https://otonan-syusyoku.work/archives/1978</link>
					<comments>https://otonan-syusyoku.work/archives/1978#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Mon, 28 Oct 2024 13:42:29 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[業務]]></category>
		<category><![CDATA[生涯独学]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[三流プログラマー]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1978</guid>

					<description><![CDATA[EC2のセキュリティがガバガバに穴が空いている状態の皆さん息してますかー？ &#160; すみません。いきなり煽りから入ってしまいました。 最近、サーバー構築作業をしている中でセキュリティ担保の方法を学ぶことがあったので [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>EC2のセキュリティがガバガバに穴が空いている状態の皆さん息してますかー？</p>
<p>&nbsp;</p>
<p>すみません。いきなり煽りから入ってしまいました。</p>
<p>最近、サーバー構築作業をしている中でセキュリティ担保の方法を学ぶことがあったので、皆さんに共有したいなーと思い記事を書いています！</p>
<p>&nbsp;</p>
<p>EC2へSSH接続を行い、サーバーでの作業を行っているバックエンド側の人の幸せにつながってくれたら嬉しいです〜</p>
<p>&nbsp;</p>
<h2>EC2のSSH鍵の扱いどうしている？</h2>
<p><a href="https://otonan-syusyoku.work/archives/1661/dmarc%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%97%e3%81%aa%e3%81%8f%e3%81%a1%e3%82%83-1" rel="attachment wp-att-1665"><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" /></a></p>
<p>複数人でプロジェクトを組んでいる場合、サーバーで作業をする人が複数出てくると思います。</p>
<p>そうなってくると以下の作業を <code>作業者の人数分 × サーバーの台数分</code> 実施しなければいけなくなります。</p>
<ol>
<li>作業者Aのユーザーを登録</li>
<li>各作業者のローカルでSSH鍵の生成 &amp;&amp; サーバー上で公開鍵の登録</li>
</ol>
<p>この時点で億劫ですね。</p>
<p>また、上記の作業に加えて 鍵の定期的なローテーション、チームの入退場が発生した時のユーザー管理が発生してしまいます。</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 18pt;">死ぬほど面倒くさい！！！！！！！！</span></strong></p>
<p>更にセキュリティに興味が無いメンバーが存在すると、鍵のローテーションはやらなくていいじゃんとか抜かすんですよ。。あー、面倒くさい。</p>
<h2>ECS Instance Connect で解決しましょう</h2>
<p><a href="https://otonan-syusyoku.work/archives/1674/lets-go" rel="attachment wp-att-1680"><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" /></a></p>
<p>鍵のローテーションも面倒くさい作業も全てやらなくて済む方法が一つだけ存在するのです。</p>
<p>それが、AWSのコンソールパネルから該当EC2にSSH接続を行うことができる <code>EC2 Instance Connect</code> という機能です。</p>
<p>&nbsp;</p>
<p>この機能は<code>~/.ssh/authorized_keys</code> に一時的なキーを付与するという特徴があります。</p>
<p>そのため、<span class="sc_marker blue"><strong>僕達ユーザーが</strong></span><span class="sc_marker blue"><strong>鍵の管理をする必要がなくなるので、運用の手間をかなり減らすことができます。</strong></span><br />
（サーバー運用やったことにしか伝わらないと思いますが、<strong>管理するものを減らすという事は運用において絶大に効果があるのです！！！！</strong></p>
<p>&nbsp;</p>
<p>しかもこの機能、API と CLI にも対応しているのでちょっとした作業時にも効果があるのですよぉぉぉぉ！！！</p>
<p>基本的に権限さえ付与してしまえば使える機能ですので、皆さん使ってみて下さい！</p>
<div class="sc_frame_wrap inline black">
<div class="sc_frame_title">使いづらいという意見が出てきたときのTips</div>
<div class="sc_frame shadow">
<p>AWSのコンパネでは、コマンド操作やりづらいよ〜 とクレーム言ってくる輩は絶対出てくると思います。<br />
こちらの作業量を減らすためにも死守しなければいけないので、ぜひ以下のような提案を行って下さい</p>
<ul>
<li>Tmux 使おうぜ！
<ul>
<li>画面分割</li>
<li>セッション保持</li>
</ul>
</li>
<li>bash-completion &#x1f51c;
<ul>
<li>補完効くぜ〜</li>
</ul>
</li>
<li>thefuck
<ul>
<li>本当にいい感じにやってくれるぜ〜</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="sc_frame_wrap inline blue"></div>
<div class="sc_frame_wrap inline orange">
<div class="sc_frame_title">参考記事</div>
<div class="sc_frame">
<ul>
<li><a href="https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html">https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html</a></li>
</ul>
</div>
</div>
<p>&nbsp;</p>
<h2>一応セキュリティグループも絞っておこう</h2>
<p>EC2 Instance Connect を使う際には、セキュリティグループで SSHのポート <code>22</code> を開放して置く必要があります。</p>
<p>22番ポートを開けるのは多少なりとも気が引けますよね〜</p>
<p>&nbsp;</p>
<p>最低限のセキュリティ担保として、 <span class="sc_marker blue"><strong>EC2 が所属する Region のみからアクセスできるようにIP指定をすることができます。</strong></span></p>
<p>下記のサイトにリージョン単位かつサービス単位でIP範囲をまとめてくれています。</p>
<p><a href="https://ip-ranges.amazonaws.com/ip-ranges.json">https://ip-ranges.amazonaws.com/ip-ranges.json</a></p>
<p>&nbsp;</p>
<p>今回の例でいうと <code>ap-northeast-1</code> に所属するEC2のSSH接続を制限する場合は、 <code>3.112.23.0/29</code> を セキュリティグループのIP範囲に指定してあげると良いです。</p>
<p><span class="sc_marker blue"><strong>これで、IAMで認証されたユーザーかつ東京リージョンからのSSH接続に制限することができます。</strong></span></p>
<pre class="line-numbers"><code class="language-other">    {
      "ip_prefix": "3.112.23.0/29",
      "region": "ap-northeast-1",
      "service": "EC2_INSTANCE_CONNECT",
      "network_border_group": "ap-northeast-1"
    },
</code></pre>
<p>&nbsp;</p>
<h2>幸せになりたい</h2>
<p>運用負荷が下がると幸せになれます。</p>
<p>幸せになろう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1978/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
