AWSで使用するOSの選び方を調べてみた
AWSでEC2やECS、EKSなどを構築する際、どのOSを選択すればよいのでしょうか。
Amazon Linux、Ubuntu、RHEL、Windows Serverなどの選択肢がありますが、単純に特徴を比較するだけでは判断できません。
実際の開発現場では、社内リポジトリの構成、使用するミドルウェア、既存の運用スクリプト、サポート期間などを確認する必要があります。
今回は、AWSでOSを選定する際に、具体的に何を確認し、どのように判断するのかを調べてみました。
OS選択の基本的な判断基準
| 判断項目 | 確認する内容 |
|---|---|
| アプリケーション | 対応OS・バージョン・CPUアーキテクチャ |
| 社内リポジトリ | Dockerfile、Terraform、Ansible、Shell Script |
| パッケージ管理 | apt、dnf、rpm、deb |
| 運用体制 | 社内の構築実績、監視ツール、障害対応手順 |
| サポート期間 | セキュリティ更新、EOL、延長サポート |
| 費用 | OSライセンス、商用サポート、運用コスト |
特に既存システムの移行や追加構築では、社内リポジトリの内容が重要な判断材料になります。
EC2でOSを選ぶ場合
EC2では、AMI(Amazon Machine Image)を通じてOSを選択します。
代表的なLinux系OSを比較します。
| 判断項目 | Amazon Linux 2023 | Ubuntu LTS | RHEL |
|---|---|---|---|
| OSライセンス | 追加ライセンス費用なし | 通常版は無料 | 有料 |
| 標準サポート | 5年間 | 5年間 | メジャーバージョンごとに異なる |
| パッケージ管理 | dnf | apt | dnf |
| パッケージ形式 | rpm | deb | rpm |
| 商用サポート | AWSサポート | Canonical | Red Hat |
| 主な選定理由 | AWS中心の新規構築 | Ubuntu向けの既存構成・動作保証 | RHEL認定製品・企業標準 |
※費用・サポート内容はバージョンや契約によって異なります。
社内リポジトリから判断する
例えば、GitHubなどの社内リポジトリに以下のファイルが存在する場合、OS選定の判断材料になります。
| 確認するファイル | 記述例 | 判断できること |
|---|---|---|
Dockerfile |
FROM ubuntu:24.04 |
コンテナ内でUbuntuを使用 |
playbook.yml |
ansible.builtin.apt |
Debian・Ubuntu系のパッケージ管理に依存 |
setup.sh |
apt-get install nginx |
Ubuntuなどのapt系OSを想定 |
main.tf |
UbuntuのAMI IDを指定 | EC2のホストOSにUbuntuを使用 |
README.md |
Ubuntu 24.04 LTS |
開発・動作確認環境としてUbuntuを指定 |
.github/workflows/*.yml |
runs-on: ubuntu-24.04 |
CIの実行環境がUbuntu |
.deb |
Ubuntu向けパッケージ | Debian・Ubuntu系のパッケージを利用 |
.rpm |
RHEL向けパッケージ | RPM系OSを利用する可能性 |
ただし、DockerfileやGitHub ActionsでUbuntuを使用しているだけでは、EC2のホストOSまでUbuntuにする必要はありません。
ホストOSの選定では、TerraformやAnsible、EC2上で直接実行するShell Scriptを優先して確認します。
Terraformから判断する例
例えば、Terraformに以下の記述がある場合です。
resource "aws_instance" "web" {
ami = "ami-xxxxxxxxxxxxxxxxx"
instance_type = "t3.micro"
}
ami に指定されたAMI IDから、OSを確認できます。
AMI IDだけではOSの種類が分からないため、AWS CLIなどで確認します。
aws ec2 describe-images \
--image-ids ami-xxxxxxxxxxxxxxxxx \
--query 'Images[*].[Name,Description,PlatformDetails]'
既存環境がUbuntuのAMIを使用している場合、同じOSを選ぶことで構築手順や運用方法を統一できる可能性があります。
ただし、AMIはリージョンによってIDが異なるため注意が必要です。
Ansibleから判断する例
- name: Install nginx
ansible.builtin.apt:
name: nginx
state: present
update_cache: yes
この場合、apt を利用しているため、UbuntuやDebian系OSを想定した処理と判断できます。
Amazon Linuxでは通常 dnf を使用するため、そのままでは実行できません。
既存のAnsibleを変更せず利用したい場合、Ubuntuが有力な候補になります。
一方、OSの変更を前提としているなら、Ansible側を修正する選択肢もあります。
Shell Scriptから判断する例
Ubuntu系の場合:
sudo apt-get update
sudo apt-get install -y nginx
Amazon Linux 2023の場合:
sudo dnf install -y nginx
RHELの場合:
sudo dnf install -y nginx
同じnginxをインストールする処理でも、OSによって使用するコマンドが異なります。
そのため、既存の構築スクリプトがどのOSを想定しているか確認する必要があります。
実際の判断例
ケース1:AWSで新規Webサーバーを構築する
- 特定のOSに依存するソフトウェアがない
- 社内に既存の構築スクリプトがない
- AWS上で運用することが前提
この場合、Amazon Linux 2023を第一候補にします。
ケース2:社内リポジトリにUbuntu向けAnsibleが存在する
-
ansible.builtin.aptを使用 - Ubuntu 24.04 LTSで動作確認済み
- 運用担当者がUbuntuに慣れている
この場合、Ubuntu 24.04 LTSを第一候補にします。
ケース3:業務ソフトウェアがRHEL 9のみを正式サポートする
- ベンダーの動作保証が必要
- RHEL 9向けのRPMパッケージが提供されている
- 商用サポートが必要
この場合、RHEL 9を選択します。
参考資料:
ECSでOSを選ぶ場合
ECSでは、まずEC2起動タイプとFargate起動タイプのどちらを使用するか確認します。
EC2起動タイプ
| OS | 選択する基準 |
|---|---|
| Amazon Linux | 一般的なLinuxコンテナの実行、ホストOSのカスタマイズ |
| Bottlerocket | コンテナ専用OSでホストの変更を最小限にしたい |
| Windows Server | Windowsコンテナを実行する必要がある |
社内リポジトリから判断する
| 確認するファイル | 記述例 | 判断できること |
|---|---|---|
Dockerfile |
FROM mcr.microsoft.com/windows/servercore |
Windowsコンテナが必要 |
Dockerfile |
FROM ubuntu:24.04 |
Linuxコンテナを使用 |
task-definition.json |
"operatingSystemFamily": "LINUX" |
ECSタスクのOSがLinux |
task-definition.json |
"cpuArchitecture": "ARM64" |
Arm64対応の実行環境が必要 |
| Terraform | requires_compatibilities = ["FARGATE"] |
Fargateで実行する設定 |
例えば、Dockerfileに以下の記述がある場合です。
FROM mcr.microsoft.com/windows/servercore:ltsc2022
Windowsコンテナを使用しているため、Windows対応の実行環境が必要になります。
一方、以下の場合はLinuxコンテナです。
FROM ubuntu:24.04
ただし、Linuxコンテナだからといって、ホストOSをUbuntuにする必要はありません。
Amazon LinuxやBottlerocketなどでも、対応するLinuxコンテナを実行できます。
Bottlerocketを選ぶ判断
Bottlerocketはコンテナ実行に特化したOSです。
例えば、以下の条件なら候補になります。
- EC2上でコンテナのみを実行する
- ホストOSへのソフトウェア追加が不要
- OSの変更を最小限にしたい
- 既存の監視・セキュリティツールがBottlerocketに対応している
逆に、ホストOSに独自のパッケージや管理ツールをインストールする必要がある場合、Amazon Linuxなどを検討します。
Fargate起動タイプ
FargateではホストOSを直接管理しません。
そのため、主に以下を確認します。
- LinuxコンテナかWindowsコンテナか
- CPUアーキテクチャはx86_64かArm64か
- コンテナイメージが実行環境に対応しているか
- Fargateで必要な機能を利用できるか
参考資料:
EKSでOSを選ぶ場合
EKSでは、Kubernetesのワーカーノードに使用するOSを検討します。
| OS | 選択する基準 |
|---|---|
| Amazon Linux | 一般的なLinuxノードを構築したい |
| Bottlerocket | コンテナ専用OSで運用したい |
| Windows Server | Windowsコンテナを実行したい |
ただし、利用するノードの管理方式によって、選択できるOSは異なります。
社内リポジトリから判断する
| 確認するファイル | 記述例 | 判断できること |
|---|---|---|
| Kubernetesマニフェスト | nodeSelector |
Podが特定のOSを要求しているか |
| Helm Chart | nodeSelector |
デプロイ対象ノードのOS |
| Terraform | ami_type = "AL2023_x86_64_STANDARD" |
Amazon Linux 2023を使用 |
| Terraform | ami_type = "BOTTLEROCKET_x86_64" |
Bottlerocketを使用 |
| DaemonSet | ホスト上のファイルや機能を参照 | ホストOSとの互換性確認が必要 |
例えば、Kubernetesマニフェストに以下の記述がある場合です。
nodeSelector:
kubernetes.io/os: linux
このPodはLinuxノードを対象にしています。
一方、以下の場合はWindowsノードを対象にしています。
nodeSelector:
kubernetes.io/os: windows
このように、既存のKubernetesマニフェストからOS要件を確認できます。
ただし、Linuxノードを指定しているだけでは、Amazon LinuxとBottlerocketのどちらを選ぶかまでは判断できません。
その場合は、DaemonSetや監視エージェント、ホストOSのカスタマイズ要件を確認します。
実際の判断例
ケース1:既存の監視エージェントをホストOSに導入する
監視エージェントがAmazon Linuxに対応している場合、Amazon Linuxを候補にします。
ケース2:コンテナ専用ノードとして運用する
ホストOSに独自のソフトウェアを導入する必要がなければ、Bottlerocketを候補にします。
ケース3:Windowsコンテナを実行する
Windows Serverノードを検討します。
ただし、KubernetesのバージョンやWindowsノードの機能制限を確認する必要があります。
参考資料:
LambdaでOSを選ぶ場合
Lambdaでは、EC2のようにOSを自由に選択できません。
そのため、OSの種類よりもランタイムやライブラリとの互換性を確認します。
社内リポジトリから判断する
| 確認するファイル | 記述例 | 判断できること |
|---|---|---|
template.yaml |
Runtime: python3.12 |
Pythonランタイムを使用 |
serverless.yml |
runtime: nodejs22.x |
Node.jsランタイムを使用 |
Dockerfile |
FROM public.ecr.aws/lambda/python:3.12 |
Lambda対応のベースイメージを使用 |
requirements.txt |
numpy など |
ネイティブライブラリの互換性確認が必要 |
| Terraform | architectures = ["arm64"] |
Arm64対応の依存ライブラリが必要 |
例えば、Dockerfileに以下の記述がある場合です。
FROM public.ecr.aws/lambda/python:3.12
AWSが提供するPython 3.12向けのLambdaベースイメージを使用しています。
この場合、ベースイメージのOS環境に対応したライブラリを使用する必要があります。
また、ネイティブライブラリを使用する場合、CPUアーキテクチャとの互換性も重要になります。
参考資料:
RDSやS3の場合
RDSやS3では、基盤OSを利用者が選択する必要はありません。
| サービス | OS選択 | 主な判断項目 |
|---|---|---|
| RDS | 不要 | DBエンジン、バージョン、互換性 |
| S3 | 不要 | ストレージクラス、アクセス権限、保存期間 |
例えば、RDSでMySQLを利用する場合、OSではなくMySQLのバージョンやアプリケーションとの互換性を確認します。
参考資料:
まとめ
AWSでOSを選択する際には、OSそのものの特徴だけでなく、社内リポジトリや既存のインフラ構成を確認することが重要です。
例えば、EC2で新しいサーバーを構築する場合でも、社内にUbuntu向けのAnsibleやShell Scriptが存在するなら、Ubuntuを選択する合理的な理由になります。
一方、特定のOSに依存するソフトウェアがなく、AWS中心の新規構築であれば、Amazon Linux 2023が有力な候補になります。
ECSやEKSでは、コンテナのOSとホストOSを区別し、実行方式や運用ツールとの互換性を確認する必要があります。
OSを選定する際は、単に「どのOSがよいか」ではなく、「既存の構成やアプリケーションの要件から、なぜそのOSを選ぶのか」を説明できることが重要です。