Contents
Amazon Linux 2023 Jenkins ディスク容量不足 対策の体系的解決ガイド
AWSでJenkinsを運用する際、Amazon Linux 2023のデフォルト設定が引き起こすディスク容量不足問題は深刻な障害となります。本記事では、tmpfsの仕組みやJenkins特有のファイル生成パターンに焦点を当て、実践的な対策手順を解説します。
Amazon Linux 2023における/tmp=tmpfsのデフォルト設定とその影響
Amazon Linux 2023では、起動時に/tmpが揮発性メモリディスク(tmpfs)として自動マウントされます。この設計はシステムのクリーンさと高速なI/Oを確保する意図ですが、JenkinsのようなCIツールでは深刻な問題を引き起こします。
tmpfsの仕組みとメモリマッピング
tmpfsはRAM上に仮想ディスクを作成し、データを一時的に格納します。Amazon Linux 2023ではデフォルトで物理メモリ容量の50%が/tmp領域として割り当てられます(例: 16GB RAM環境なら8GB)。ただし、この制限を超えるとシステムはディスク操作をブロックし、Jenkinsノードがオフラインになる危険性があります。
重要: 実際のデフォルト値はAmazon Linux 2023バージョンやカーネルリビジョンに依存するため、
mount | grep tmpfsで確認することを強く推奨します。
| 項目 | 値 | 補足 |
|---|---|---|
| tmpfsデフォルトサイズ | 物理メモリの50% | RAM容量に依存する |
| 使用領域 | /tmp |
Jenkinsの一時ファイルがここに保存 |
| リセットタイミング | レジューム/シャットダウン | 内容は揮発性となる |
Jenkinsでの一時ファイル生成パターン
Jenkinsはビルド中に以下のような一時ファイルを大量に生成します。
- ワークスペース(
$WORKSPACE): 各ジョブのソースコードやビルド結果が保存される領域 - ログファイル(
/var/log/jenkins/*.log): ビルド実行時の詳細な出力 - キャッシュデータ(
~/.m2/repository,~/.npmなど): 外部ライブラリのダウンロード一時保存
特に/tmpはJenkinsのワークスペースや一時ファイルの格納先として頻繁に使用されるため、容量不足時にノードがオフラインになるメカニズムにつながります。
Jenkinsノードオフラインになるメカニズムと監視方法
Jenkinsノードがオフラインになる主な原因は/tmp領域のディスク容量不足です。システムレベルでのエラーメッセージやCloudWatchアラームの設定で事前に検知・対応することが重要です。
ディスク容量不足時のエラーメッセージの種類
以下のメッセージがJenkins管理画面やログに表示される場合があります。
hudson.util.IOException2: java.io.IOException: No space left on device/tmp領域がいっぱいになった直接的な原因を示す。Node is offline because it failed to connect- 起動中のJenkinsエージェントがノード接続失敗を報告。
重要: エラーメッセージが発生しても、
df -hやdu -sh /tmpで実際のディスク使用量を確認する必要があります。
CloudWatchアラーム設定例
AWS CloudWatchで /tmp領域の使用率を監視するには、以下の手順を取ります。
注意: AWS/EC2 namespaceに標準的なDiskSpaceUsedメトリクスは存在しないため、カスタムメトリクスまたはCloudWatch Agentでファイルシステム情報を取得する必要があります。
- CloudWatchメトリクスにカスタムアラームを作成(例: 使用率が90%を超えた場合)。
- 通知方法としてSNSトピックを設定し、DevOpsチームに即座に通知。
|
1 2 3 4 5 6 7 8 9 10 11 |
{ "AlarmName": "Jenkins_Tmp_Disk_Space_Alert", "ComparisonOperator": "GreaterThanThreshold", "EvaluationPeriods": 1, "MetricName": "FilesystemUtilization", // AWS/EC2 namespaceにはないため、CloudWatch Agent経由で取得 "Namespace": "AWS/EC2", "Dimensions": [{"Name": "InstanceId", "Value": "i-xxxxx"}], "Threshold": 90, "Statistic": "Average" } |
/tmp容量拡張のためのmountオプション変更手順
/tmp領域の制限を超えるには、/etc/fstabでtmpfsのサイズ制限を解除する必要があります。以下が具体的な手順です。
/etc/fstab編集時の注意点
- 編集前には
df -h /tmpやfree -mで現在のRAM使用量を確認し、過剰な拡張を避ける。 - tmpfsの最大サイズはRAM容量の70%を超えないことを推奨(例: 16GB RAMなら11.2GB)。
再マウントコマンドの実行確認
変更後、mount -o remount /tmpで即座に反映。永続的な設定は再起動後も維持されます。
手順:
-
/etc/fstabを編集し、以下のように設定する:
bash
tmpfs /tmp tmpfs defaults,size=20G 0 0 -
マウントオプションの変更を反映:
bash
mount -o remount /tmp -
再起動後も設定が維持されるか確認:
bash
cat /etc/fstab | grep /tmp
Jenkinsの一時ファイル最適化策とワークスペース管理
/tmp領域の拡張に加え、Jenkins側で一時ファイルを減らす工夫も有効です。パイプラインスクリプトやプラグインによる管理が推奨されます。
PipelineでのcleanWs構文活用法
Pipelineスクリプト内でcleanWsを指定することで、ジョブ実行前にワークスペースを自動削除できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
pipeline { agent any stages { stage('Build') { steps { cleanWs() // ジョブ実行前にワークスペースを削除 sh 'make' } } } } |
Node Cleanup Pluginの有効活用
Node Cleanup Pluginは、ノードオフライン時に不要な一時ファイルやキャッシュを自動掃除。
- 設定方法: Jenkins管理画面 > プラグイン管理 > Node Cleanup Pluginを有効化
- 使用例: ジョブ終了後に
/tmp/jenkins以下のファイルを削除するスクリプトを登録
注意: 本プラグインは、Jenkinsのキャッシュやワークスペースに影響を与えるため、テスト環境で動作確認を推奨します。
永続的ディスク使用を推奨するstorageクラス設定
tmpfsに依存する代わりに、EBSボリュームなどの永続ストレージを利用することが長期的な安定性のカギです。
EBSボリュームの最適なプロビジョニング
- IOPS確保: ハイパフォーマンスなジョブを実行する環境では、gp3型EBSで3000 IOPS以上を設定。
- 容量計画: 週間または月次のビルド量を考慮し、初期ボリュームサイズを50~100GB程度に設定。
Jenkinsホームディレクトリ移動手順
Jenkinsのホームディレクトリ(デフォルト: /var/lib/jenkins)をEBSに移すことで、ログやワークスペースがtmpfsに依存しなくなります。
手順:
- EBSボリュームをインスタンスにアタッチし、マウントポイントを作成(例:
/mnt/ebs)。 -
Jenkinsホームディレクトリの内容を移動:
bash
rsync -av /var/lib/jenkins/ /mnt/ebs/ -
jenkins.serviceのWorkingDirectoryを変更し、再起動:
bash
sudo sed -i 's|WorkingDirectory=.*|WorkingDirectory=/mnt/ebs|' /etc/systemd/system/jenkins.service
sudo systemctl daemon-reload && sudo systemctl restart jenkins
AWSクラウドフォーラムへの実践経験共有
本記事で紹介した対策は、Jenkins運用の現場での実際に検証された手順です。ただし、環境や使用するリソースによって最適な方法が異なるため、コミュニティでの情報共有が不可欠です。
AWSクラウドフォーラムで自身の対策を投稿し、他のエンジニアと知識を交換することで、さらなる改善が可能になります。以下から投稿ページにアクセスしてください:
https://forums.aws.amazon.com/