EC2
1. 概要
Amazon EC2(Elastic Compute Cloud)は、AWS 上で仮想サーバ(インスタンス)を起動・管理できる IaaS(Infrastructure as a Service) サービス。
物理サーバの調達やセットアップを行うことなく、数分で仮想マシンを起動でき、不要になったらすぐに削除できる。これにより、従来はハードウェア調達に数週間〜数ヶ月かかっていた作業が、API やコンソールから即座に実行可能になる。
責任共有モデルにおける位置づけ
EC2 は IaaS に分類されるため、OS より上のレイヤーはユーザーの責任となる。具体的には、OS のパッチ適用、ミドルウェアのインストール・設定、アプリケーションのデプロイ、セキュリティ設定(ファイアウォール、ユーザー管理)はすべてユーザーが管理する。
一方、物理ホストのハードウェア、ハイパーバイザー、ネットワークインフラについては AWS が管理する。
この責任範囲を理解しておくことで、「何をAWSに任せられて、何を自分で対処しなければならないか」が明確になる。
2. ユースケース
EC2 は汎用性が高いサービスだが、特に以下のようなケースで選択されることが多い。
- 既存のオンプレミスアプリケーションをクラウドに移行したいとき — OS やミドルウェアの構成をそのまま維持できるため、アプリケーションの改修を最小限に抑えられる(リフト&シフト)
- OS レベルでの細かいチューニングが必要なとき — カーネルパラメータの調整や特定バージョンのミドルウェアが必要な場合、Lambda や ECS では対応しづらい要件に応えられる
- GPU を使った機械学習や推論処理を実行したいとき — P 系・G 系インスタンスで NVIDIA GPU を利用でき、CUDA 環境を自由に構築できる
- 長時間動作するバッチ処理を実行したいとき — Lambda の 15 分制限を超えるような処理や、大量のメモリを必要とする処理に適している
- 開発・検証用の一時的な環境が必要なとき — スポットインスタンスを使えば低コストで検証環境を立ち上げられる
3. 基本概念
EC2 を理解するために押さえておくべき主要用語を以下にまとめる。
| 用語 | 説明 |
|---|---|
| インスタンス | EC2 上で起動する仮想サーバの単位。1 台のインスタンスが 1 台の仮想マシンに対応する |
| AMI(Amazon Machine Image) | OS、ミドルウェア、設定を含んだテンプレート。インスタンス起動時に指定する。自分で作成することも、AWS やサードパーティ提供のものを使うこともできる |
| インスタンスタイプ | CPU・メモリ・ネットワーク性能の組み合わせ。用途に応じて t3.micro(小規模)から p5.48xlarge(GPU 大規模)まで幅広い選択肢がある |
| EBS(Elastic Block Store) | インスタンスに接続する永続ストレージ。インスタンスを停止・終了してもデータが保持される(終了時の削除設定を除く) |
| セキュリティグループ | インスタンスに適用する仮想ファイアウォール。インバウンド(受信)とアウトバウンド(送信)のルールを定義し、許可するトラフィックを制御する |
| キーペア | SSH 接続で使用する公開鍵認証の鍵ペア。秘密鍵はダウンロード時に一度しか取得できないため、紛失に注意が必要 |
| VPC(Virtual Private Cloud) | インスタンスを配置する仮想ネットワーク。サブネット、ルートテーブル、インターネットゲートウェイなどで構成される |
| Elastic IP | インスタンスに関連付けられる固定のパブリック IP アドレス。インスタンスを停止・再起動しても IP が変わらない |
4. アーキテクチャ概要
代表構成(Web アプリケーション)
以下は、EC2 を使った Web アプリケーションの典型的な構成。ALB(Application Load Balancer)でリクエストを受け、Auto Scaling Group 内の複数の EC2 インスタンスに分散し、バックエンドのデータベースとして RDS を使用する。
[ユーザー]
↓ HTTPS
[ALB (Application Load Balancer)]
↓ HTTP (ポート80)
[EC2 × 2台以上 (Auto Scaling Group)] ← 複数AZに分散
↓ TCP (ポート3306)
[RDS (Multi-AZ)]
構成図生成プロンプト: 上記構成をアーキテクチャ図として作成する場合、以下のプロンプトを画像生成 AI や draw.io 等で使用できる。 「AWS アーキテクチャ図。ユーザーからの HTTPS リクエストが ALB を経由し、2 つのアベイラビリティゾーンに分散された Auto Scaling Group 内の EC2 インスタンス群に振り分けられる。EC2 からは RDS(Multi-AZ 構成)に接続する。VPC 内にパブリックサブネット(ALB)とプライベートサブネット(EC2、RDS)を配置。」
設計ポイント
- EC2 をインターネットに直接公開しない — ALB や CloudFront を前段に置くことで、DDoS 対策やSSL 終端を一元管理できる
- 複数の AZ(アベイラビリティゾーン)に分散配置する — 1 つの AZ で障害が発生しても、別の AZ のインスタンスがリクエストを処理し続けられる
- ステートレスに設計する — セッション情報をインスタンス内に持たず、ElastiCache(Redis)や DynamoDB に外出しすることで、スケールイン・アウト時にセッションが失われない
5. 主要機能
インスタンスタイプ
インスタンスタイプは名前の先頭文字(ファミリー)で用途が分かれる。
| ファミリー | 用途 | 選択の目安 |
|---|---|---|
| t 系(T3, T3a, T4g) | バースト可能な汎用タイプ | 開発・検証環境、CPU 使用率が低い小規模サービス |
| m 系(M5, M6i, M7g) | バランス型の汎用タイプ | CPU とメモリを均等に使う一般的な Web アプリケーション |
| c 系(C5, C6i, C7g) | コンピューティング最適化 | CPU 集約型の処理(エンコード、科学計算、ゲームサーバ) |
| r 系(R5, R6i, R7g) | メモリ最適化 | インメモリ DB、大規模キャッシュ、リアルタイム分析 |
| g / p 系(G5, P5) | GPU 搭載 | 機械学習の学習・推論、動画処理、3D レンダリング |
世代の数字が大きいほど新しい。末尾の
gは Graviton(ARM)プロセッサを示し、同スペックの x86 と比較して約 20% 安価。
AMI(Amazon Machine Image)
| 種類 | 特徴 |
|---|---|
| Amazon Linux | AWS が提供する Linux ディストリビューション。AWS CLI がプリインストールされている |
| Ubuntu | Canonical が提供。Web アプリケーション開発で広く使われる |
| カスタム AMI | 自分でミドルウェアや設定を含めた AMI を作成し、同じ構成のインスタンスを素早く起動できる |
| Marketplace AMI | サードパーティが提供する AMI。ライセンス込みのソフトウェアをすぐに使い始められる |
ストレージ(EBS)
| ボリュームタイプ | 特徴 | 選択の目安 |
|---|---|---|
| gp3 | 汎用 SSD。コストと性能のバランスが良い | 迷ったらまずこれを選ぶ |
| io2 | 高 IOPS が必要な場合の SSD | データベースサーバ、高頻度 I/O |
| st1 | スループット最適化 HDD | ログ解析、ビッグデータ処理 |
| インスタンスストア | インスタンスに物理接続された一時ストレージ | キャッシュ、一時ファイル(停止するとデータ消失) |
購入オプション
| オプション | 特徴 | 割引率の目安 |
|---|---|---|
| オンデマンド | いつでも起動・停止可能。柔軟だがコストは最も高い | — |
| リザーブドインスタンス | 1 年 or 3 年の利用をコミットすることで割引 | 最大 72% |
| Savings Plans | コンピューティング使用量を金額でコミット。RI より柔軟 | 最大 66% |
| スポットインスタンス | AWS の余剰キャパシティを利用。中断される可能性あり | 最大 90% |
本番環境には Savings Plans を優先的に検討し、開発・検証環境にはスポットインスタンスの活用を検討するのがコスト最適化の基本戦略。
6. 料金体系
EC2 の料金は複数の要素で構成されるため、「インスタンス料金だけ」を見ていると想定外のコストが発生しやすい。
主な課金要素
| 課金項目 | 課金単位 | 備考 |
|---|---|---|
| インスタンス稼働料金 | 秒単位(最低 60 秒) | インスタンスタイプとリージョンで単価が異なる |
| EBS ボリューム | GB/月 + IOPS 数 | 停止中のインスタンスでも EBS 料金は発生する |
| データ転送(アウト) | GB 単位 | リージョン外への転送に課金。同一 AZ 内の通信は無料 |
| Elastic IP | 未使用時に課金 | インスタンスに紐付けていない Elastic IP は時間課金が発生する |
| EBS スナップショット | GB/月 | 増分バックアップだが、長期間残すと蓄積する |
見落としがちなコスト
- 停止中インスタンスの EBS 料金 — インスタンスを停止しても EBS は課金され続ける。不要なら EBS ごと削除する
- 未使用の Elastic IP — 関連付けのない Elastic IP には料金が発生する。使わなくなったら即解放する
- AZ 間のデータ転送 — 同一リージョンでも AZ をまたぐ通信には課金される($0.01/GB 程度)
7. 比較・選定指針
「EC2 を使うべきか」を判断するために、類似サービスと比較する。
| サービス | 向いているケース | 向いていないケース |
|---|---|---|
| EC2 | OS レベルの制御が必要、長時間稼働、レガシー移行 | 短時間の単発処理、運用負荷を最小化したい場合 |
| Lambda | イベント駆動の短時間処理(15 分以内)、サーバレスで運用したい | 常時稼働、OS カスタマイズが必要 |
| ECS / Fargate | コンテナ化されたアプリ、マイクロサービス | コンテナ化が困難なレガシーアプリ |
| Lightsail | 小規模 Web サイト、WordPress、予測可能な料金体系 | 複雑なアーキテクチャ、細かいスケーリング制御 |
EC2 を選ぶ判断基準
以下のいずれかに該当する場合は EC2 が適している。
- OS やカーネルの設定を直接変更する必要がある
- Lambda の実行時間制限(15 分)やメモリ制限(10 GB)を超える処理がある
- コンテナ化が難しいレガシーアプリケーションを移行する
- GPU インスタンスが必要(機械学習、動画処理など)
8. 運用・監視
主要メトリクス(CloudWatch)
| メトリクス | 監視の目的 |
|---|---|
| CPUUtilization | CPU の過負荷を検知。Auto Scaling のトリガーにも使う |
| NetworkIn / NetworkOut | ネットワーク帯域の使用状況。異常なトラフィックの検知 |
| DiskReadOps / DiskWriteOps | ディスク I/O のボトルネック検知 |
| StatusCheckFailed | AWS 基盤またはインスタンスの異常を検知 |
注意: メモリ使用率とディスク使用率は CloudWatch の標準メトリクスに含まれない。これらを監視するには CloudWatch Agent をインストールしてカスタムメトリクスとして送信する必要がある。
ログ
| ログ | パス | 用途 |
|---|---|---|
| システムログ | /var/log/messages | OS レベルのイベント |
| 認証ログ | /var/log/secure | SSH ログイン試行の監視 |
| アプリケーションログ | アプリ依存 | アプリケーション固有のエラー・アクセスログ |
CloudWatch Logs Agent を使って各ログを CloudWatch Logs に集約することを推奨する。インスタンスが終了してもログを保持できる。
運用ツール
- AWS Systems Manager(SSM) — SSH を使わずにインスタンスに接続できる Session Manager、パッチ適用の自動化(Patch Manager)、設定管理(State Manager)を提供
- CloudWatch Agent — メモリ・ディスク使用率のカスタムメトリクスを収集
- AWS Config — インスタンスの設定変更を追跡し、コンプライアンスチェックを自動化
9. トラブルシューティング
問題:SSH 接続できない
原因:
- セキュリティグループで TCP ポート 22 が許可されていない
- サブネットの NACL でインバウンド / アウトバウンドがブロックされている
- ルートテーブルにインターネットゲートウェイへのルートがない
- インスタンスにパブリック IP または Elastic IP が割り当てられていない
- OS 上の sshd が停止している
確認手順:
- セキュリティグループのインバウンドルールを確認(ポート 22、接続元 IP)
- サブネットの NACL でポート 22 のインバウンドと、エフェメラルポートのアウトバウンドが許可されているか確認
- ルートテーブルに
0.0.0.0/0 → igw-xxxxのルートがあるか確認 - インスタンスにパブリック IP が割り当てられているか確認
- VPC Reachability Analyzer で接続経路を診断
- どうしても接続できない場合は SSM Session Manager での接続を試みる
問題:CPU 使用率が高い
原因:
- アプリケーションの処理負荷が増大している
- メモリ不足により swap が発生し、CPU も圧迫されている
- バックグラウンドプロセス(ウイルススキャン、ログローテーション等)が重なっている
確認手順:
topまたはhtopでプロセスごとの CPU 使用率を確認- 特定プロセスが占有している場合、そのプロセスの挙動を調査
- メモリ使用率も併せて確認し、swap が発生していないか確認(
free -m) - 一時的な負荷増なら Auto Scaling でスケールアウト、恒常的なら上位インスタンスタイプへの変更を検討
問題:ステータスチェックが失敗する
原因:
- System Status Check 失敗: AWS 基盤側の障害(ハードウェア故障、ネットワーク障害)
- Instance Status Check 失敗: OS レベルの問題(カーネルパニック、ファイルシステム破損、メモリ枯渇)
対応:
- System Status Check 失敗 → インスタンスを停止・起動(再起動ではなく停止→起動で別の物理ホストに移動する)
- Instance Status Check 失敗 → システムログ(コンソール出力)を確認し、OS レベルの問題を特定。復旧困難な場合は AMI から新しいインスタンスを起動
10. 実装例
AWS CLI
# インスタンスの起動
aws ec2 run-instances \
--image-id ami-0abcdef1234567890 \
--instance-type t3.micro \
--key-name my-key-pair \
--security-group-ids sg-0123456789abcdef0 \
--subnet-id subnet-0123456789abcdef0 \
--iam-instance-profile Name=MyEC2Role \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=my-server}]'
# インスタンスの停止
aws ec2 stop-instances --instance-ids i-0123456789abcdef0
# インスタンスの終了(削除)
aws ec2 terminate-instances --instance-ids i-0123456789abcdef0
Terraform
resource "aws_instance" "web" {
ami = "ami-0abcdef1234567890"
instance_type = "t3.micro"
subnet_id = aws_subnet.private.id
vpc_security_group_ids = [aws_security_group.web.id]
iam_instance_profile = aws_iam_instance_profile.ec2.name
root_block_device {
volume_type = "gp3"
volume_size = 20
}
tags = {
Name = "web-server"
}
}
11. アンチパターン
| アンチパターン | なぜダメか | 推奨 |
|---|---|---|
| 単一 AZ にのみ配置 | AZ 障害で全インスタンスが停止し、サービスが完全にダウンする | 最低 2 AZ に分散配置する |
| SSH ポートを 0.0.0.0/0 に開放 | ブルートフォース攻撃の対象になる。セキュリティインシデントのリスクが高い | SSM Session Manager を使用し、SSH ポートは閉じる |
| 手動スケール運用 | 負荷増加への対応が遅れ、サービス劣化やダウンにつながる | Auto Scaling Group でスケーリングを自動化する |
| EBS のスナップショットを取っていない | EBS 障害やオペレーションミスでデータを失った場合に復旧できない | 定期的なスナップショット取得を自動化(DLM を使用) |
| インスタンスに直接データを永続保持 | インスタンス障害や終了時にデータが失われる | データは EBS、S3、RDS などの永続ストレージに保存する |
| アクセスキーをインスタンスに配置 | キーの漏洩リスクがある。ローテーション管理も煩雑になる | IAM ロールをインスタンスプロファイルで付与する |