前回までの記事では、VPCによるネットワーク設計について解説しました。本記事では、AWSの代表的なコンピューティングサービスであるEC2(Elastic Compute Cloud)について解説します。EC2の基本概念から、インスタンスタイプの選択、キーペアによるSSH接続、ユーザーデータによる初期設定まで、仮想サーバーを運用するための基礎知識を身につけましょう。

EC2(Elastic Compute Cloud)とは

EC2は、AWSが提供する仮想サーバーサービスです。物理サーバーを購入・設置することなく、数分でサーバーを起動し、必要に応じてスケールアップ・スケールダウンできます。従量課金制により、使用した分だけ料金が発生するため、コスト効率の高いインフラ運用が可能です。

EC2の主な特徴

EC2には以下の特徴があります。

特徴 説明
柔軟なスケーリング 数分でインスタンスを起動・停止、スペック変更が可能
多様なインスタンスタイプ CPU、メモリ、ストレージの組み合わせが数百種類以上
グローバル展開 世界中のリージョンでインスタンスを起動可能
従量課金 秒単位(最低60秒)の課金で無駄なコストを削減
セキュリティ VPC、セキュリティグループ、IAMと連携した多層防御

EC2のユースケース

EC2は様々な用途で活用されています。

  • Webサーバー: Apache、Nginx等を動作させるWebアプリケーションサーバー
  • アプリケーションサーバー: Java、Node.js、Python等のバックエンドアプリケーション
  • バッチ処理: 定期的なデータ処理や集計処理
  • 開発・テスト環境: 本番環境と同等の環境を一時的に構築
  • 高性能コンピューティング: 機械学習、科学技術計算

インスタンスとは

EC2における「インスタンス」とは、起動された仮想サーバーの1つ1つを指します。インスタンスは、選択したAMI(Amazon Machine Image)を基に起動され、指定したインスタンスタイプのスペックで動作します。

graph LR
    subgraph "EC2インスタンスの構成要素"
        AMI[AMI<br/>OS・ソフトウェア]
        Type[インスタンスタイプ<br/>CPU・メモリ]
        Storage[ストレージ<br/>EBS・インスタンスストア]
        Network[ネットワーク<br/>VPC・サブネット]
        Security[セキュリティ<br/>キーペア・SG]
    end
    
    AMI --> Instance((EC2<br/>インスタンス))
    Type --> Instance
    Storage --> Instance
    Network --> Instance
    Security --> Instance

インスタンスのライフサイクル

EC2インスタンスは、以下の状態を遷移します。

stateDiagram-v2
    [*] --> pending: 起動
    pending --> running: 起動完了
    running --> stopping: 停止操作
    stopping --> stopped: 停止完了
    stopped --> pending: 開始操作
    running --> shutting_down: 終了操作
    shutting_down --> terminated: 終了完了
    stopped --> shutting_down: 終了操作
    terminated --> [*]

各状態の意味は以下のとおりです。

状態 説明 課金
pending インスタンス起動準備中 課金なし
running インスタンス実行中 課金あり
stopping インスタンス停止処理中 課金なし
stopped インスタンス停止中(EBSボリュームは保持) インスタンス課金なし、EBS課金あり
shutting-down インスタンス終了処理中 課金なし
terminated インスタンス終了(削除済み) 課金なし

停止と終了の違い

「停止(Stop)」と「終了(Terminate)」は異なる操作です。停止はインスタンスを一時的に停止し、後で再開できます。EBSボリュームは保持されるため、データは維持されます。一方、終了はインスタンスを完全に削除します。デフォルト設定ではルートボリュームも削除されるため、データは失われます。

インスタンスタイプの選び方

インスタンスタイプは、EC2インスタンスのCPU、メモリ、ストレージ、ネットワーク性能を定義します。ワークロードに適したインスタンスタイプを選択することで、コストとパフォーマンスのバランスを最適化できます。

インスタンスタイプの命名規則

インスタンスタイプは、以下の命名規則に従っています。

m5.xlarge
│ │  └── サイズ(xlarge)
│ └── 世代(5)
└── ファミリー(m = 汎用)

ファミリー(インスタンスファミリー)

用途に応じて最適化されたカテゴリです。

ファミリー 特徴 代表的なタイプ ユースケース
汎用(M, T) バランスの取れたCPU/メモリ比 t3, m6i, m7g Webサーバー、開発環境
コンピューティング最適化(C) 高いCPU性能 c6i, c7g バッチ処理、ゲームサーバー
メモリ最適化(R, X) 大容量メモリ r6i, x2idn データベース、インメモリキャッシュ
ストレージ最適化(I, D) 高速ストレージI/O i3, d3 データウェアハウス、分散ファイルシステム
高速コンピューティング(P, G) GPU搭載 p4d, g5 機械学習、グラフィックス処理

世代

数字が大きいほど新しい世代です。新しい世代は一般的に性能が向上し、コストパフォーマンスが改善されています。特別な理由がない限り、最新世代の使用を推奨します。

サイズ

同じファミリー・世代内でのスペックの大きさを示します。

サイズ 説明
nano 最小サイズ
micro 極小サイズ
small 小サイズ
medium 中サイズ
large 大サイズ
xlarge 特大サイズ(largeの2倍)
2xlarge xlargeの2倍
4xlarge〜 さらに大きなサイズ

T系インスタンス(バースト可能インスタンス)

T系インスタンス(t3、t3a、t4g等)は、「バースト可能」な特性を持つコスト効率の高いインスタンスです。

T系インスタンスは「CPUクレジット」という仕組みを採用しています。通常時は低いCPU使用率で動作しますが、負荷が高まった際にはCPUクレジットを消費してベースラインを超えた性能を発揮できます。

graph LR
    subgraph "T系インスタンスのCPUクレジット"
        Idle[アイドル時] -->|クレジット蓄積| Pool((クレジット<br/>プール))
        Pool -->|クレジット消費| Burst[バースト時]
    end
インスタンスタイプ vCPU メモリ ベースラインCPU使用率 月額概算(東京リージョン)
t3.micro 2 1 GiB 10% 約$8
t3.small 2 2 GiB 20% 約$15
t3.medium 2 4 GiB 20% 約$30
t3.large 2 8 GiB 30% 約$60

T系インスタンスは、開発・テスト環境や、トラフィックが不定期に発生するWebサイトに適しています。

インスタンスタイプ選定のポイント

インスタンスタイプを選定する際は、以下のポイントを考慮します。

  1. ワークロードの特性を分析する: CPU集約型、メモリ集約型、I/O集約型のいずれかを把握する
  2. 最新世代を選択する: 同等スペックでもコストパフォーマンスが向上している
  3. 小さく始めて調整する: 最初は小さいサイズで開始し、メトリクスを確認して調整する
  4. Graviton(ARM)を検討する: arm64対応アプリケーションならコストが約20%削減できる

AMI(Amazon Machine Image)

AMIは、EC2インスタンスを起動するためのテンプレートです。OS、アプリケーション、設定がパッケージ化されており、AMIからインスタンスを起動することで、同じ構成のサーバーを繰り返し作成できます。

AMIの種類

AMIは提供元によって以下の種類があります。

種類 説明
AWS提供AMI AWSが公式に提供するAMI Amazon Linux 2023、Ubuntu、Windows Server
AWSマーケットプレイスAMI サードパーティが提供する有料・無料のAMI WordPress構築済み、セキュリティツール導入済み
コミュニティAMI コミュニティが共有するAMI 様々なディストリビューション
カスタムAMI 自分で作成したAMI 自社アプリケーション導入済み

Amazon Linux 2023

Amazon Linux 2023(AL2023)は、AWSが提供する最新のLinuxディストリビューションです。EC2での利用に最適化されており、以下の特徴があります。

  • 5年間の長期サポート
  • 2年ごとのメジャーリリース
  • SELinuxがデフォルトで有効
  • AWS CLIがプリインストール済み
  • EC2のメタデータサービスとの連携

初めてEC2を使用する場合は、Amazon Linux 2023の使用を推奨します。

キーペアとSSH接続

EC2インスタンスへの接続には、キーペアを使用したSSH認証が一般的です。キーペアは公開鍵と秘密鍵のペアで構成され、安全なリモートアクセスを実現します。

キーペアの仕組み

キーペアは公開鍵暗号方式に基づいています。

sequenceDiagram
    participant User as ユーザー
    participant AWS as AWSコンソール
    participant EC2 as EC2インスタンス

    User->>AWS: キーペア作成
    AWS->>User: 秘密鍵(.pem)ダウンロード
    AWS->>EC2: 公開鍵をインスタンスに配置
    Note over EC2: ~/.ssh/authorized_keys
    User->>EC2: SSH接続(秘密鍵使用)
    EC2->>EC2: 公開鍵で認証
    EC2->>User: 接続成功

キーペア作成時の注意点

  • 秘密鍵(.pemファイル)は作成時に1度だけダウンロードできます
  • 秘密鍵を紛失すると、そのキーペアでのインスタンスへの接続ができなくなります
  • 秘密鍵は厳重に管理し、他者と共有しないでください

キーペアの作成

AWSマネジメントコンソールからキーペアを作成する手順を説明します。

  1. EC2コンソールを開き、左メニューから「キーペア」を選択
  2. 「キーペアを作成」をクリック
  3. 以下の情報を入力
    • 名前: 識別しやすい名前(例: my-key-pair
    • キーペアのタイプ: RSAまたはED25519(ED25519推奨)
    • プライベートキーファイル形式: .pem(Linux/Mac)または.ppk(PuTTY)
  4. 「キーペアを作成」をクリックし、秘密鍵をダウンロード

SSH接続の手順

Linuxインスタンスへの接続手順を説明します。

1. 秘密鍵のパーミッション設定(Linux/Mac)

ダウンロードした秘密鍵は、パーミッションを制限する必要があります。

1
2
# 秘密鍵のパーミッションを変更
chmod 400 my-key-pair.pem

パーミッションが緩いと、SSHクライアントが接続を拒否します。

2. SSH接続コマンドの実行

以下のコマンドでインスタンスに接続します。

1
2
3
4
5
# SSH接続
ssh -i /path/to/my-key-pair.pem ec2-user@<パブリックIPアドレス>

# 例
ssh -i ~/.ssh/my-key-pair.pem ec2-user@54.199.xxx.xxx

デフォルトのユーザー名はAMIによって異なります。

AMI デフォルトユーザー名
Amazon Linux ec2-user
Ubuntu ubuntu
Debian admin
RHEL ec2-user または root
Windows Administrator(RDP接続)

3. 接続確認

初回接続時はホスト認証の確認メッセージが表示されます。yesと入力して続行します。

The authenticity of host '54.199.xxx.xxx (54.199.xxx.xxx)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

WindowsからのSSH接続

Windows 10以降では、OpenSSHクライアントが標準搭載されています。PowerShellまたはコマンドプロンプトから、Linux/Macと同様のコマンドで接続できます。

1
2
# PowerShellからSSH接続
ssh -i C:\Users\username\.ssh\my-key-pair.pem ec2-user@54.199.xxx.xxx

Session Managerによるブラウザ接続

AWS Systems Manager Session Managerを使用すると、SSHキーやパブリックIPアドレスなしでEC2インスタンスに接続できます。セキュリティとコンプライアンスの観点から、本番環境ではSession Managerの使用が推奨されています。

Session Managerのメリット

観点 メリット
セキュリティ SSHポート(22番)を開放する必要がない
コスト パブリックIPやNATゲートウェイが不要
監査 すべてのセッションがCloudWatch LogsやS3に記録される
アクセス制御 IAMポリシーできめ細かなアクセス制御が可能

Session Managerの前提条件

Session Managerを使用するには、以下の準備が必要です。

1. SSM Agentのインストール

Amazon Linux 2023やAmazon Linux 2、Ubuntu 16.04以降では、SSM Agentがプリインストールされています。その他のOSでは手動インストールが必要です。

2. IAMロールのアタッチ

インスタンスにAmazonSSMManagedInstanceCoreポリシーを含むIAMロールをアタッチします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:UpdateInstanceInformation",
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        }
    ]
}

3. ネットワーク要件

インスタンスがSystems Managerエンドポイントに到達できる必要があります。以下のいずれかの方法で実現します。

  • パブリックサブネット + インターネットゲートウェイ
  • プライベートサブネット + NATゲートウェイ
  • プライベートサブネット + VPCエンドポイント(推奨)

Session Managerでの接続

コンソールからの接続

  1. EC2コンソールでインスタンスを選択
  2. 「接続」ボタンをクリック
  3. 「Session Manager」タブを選択
  4. 「接続」をクリック

ブラウザ内でターミナルが開き、インスタンスに接続できます。

AWS CLIからの接続

1
2
# AWS CLIでSession Manager接続
aws ssm start-session --target i-0123456789abcdef0

ユーザーデータによる初期設定

ユーザーデータは、インスタンス起動時に自動実行されるスクリプトです。パッケージのインストールや設定ファイルの配置など、初期設定を自動化できます。

ユーザーデータの基本

ユーザーデータは、シェルスクリプトまたはcloud-init形式で記述します。インスタンスの初回起動時に1度だけ実行されます。

sequenceDiagram
    participant User as ユーザー
    participant EC2 as EC2インスタンス
    participant Meta as メタデータサービス

    User->>EC2: インスタンス起動(ユーザーデータ指定)
    EC2->>Meta: ユーザーデータ取得
    Meta->>EC2: スクリプト返却
    EC2->>EC2: スクリプト実行(root権限)
    EC2->>EC2: 起動完了

シェルスクリプト形式

最も一般的なユーザーデータ形式です。#!/bin/bashで始めます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
# パッケージの更新
dnf update -y

# Apache HTTPサーバーのインストール
dnf install -y httpd

# Apacheの起動と自動起動設定
systemctl start httpd
systemctl enable httpd

# テストページの作成
echo "<h1>Hello from EC2!</h1>" > /var/www/html/index.html

cloud-init形式

cloud-initディレクティブを使用したYAML形式も利用できます。より複雑な設定に適しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#cloud-config
package_update: true
package_upgrade: true

packages:
  - httpd
  - git

runcmd:
  - systemctl start httpd
  - systemctl enable httpd
  - echo "<h1>Hello from EC2!</h1>" > /var/www/html/index.html

write_files:
  - path: /etc/httpd/conf.d/custom.conf
    content: |
      ServerTokens Prod
      ServerSignature Off

ユーザーデータの注意点

ユーザーデータを使用する際は、以下の点に注意してください。

注意点 説明
実行権限 スクリプトはroot権限で実行される
サイズ制限 最大16KB(Base64エンコード後)
実行タイミング デフォルトでは初回起動時のみ実行
ログ確認 /var/log/cloud-init-output.logで実行ログを確認可能
エラー処理 スクリプトが失敗してもインスタンスは起動する

ユーザーデータの確認とデバッグ

インスタンス内からユーザーデータを確認する方法です。

1
2
3
4
5
6
# ユーザーデータの内容を確認(IMDSv2)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data

# 実行ログの確認
sudo cat /var/log/cloud-init-output.log

EC2インスタンスの起動手順

ここまで学んだ知識を活用して、EC2インスタンスを起動する手順を説明します。

起動ウィザードの概要

EC2コンソールの「インスタンスを起動」から、以下の設定を行います。

graph TB
    subgraph "EC2インスタンス起動ウィザード"
        A[1. 名前とタグ] --> B[2. AMI選択]
        B --> C[3. インスタンスタイプ]
        C --> D[4. キーペア]
        D --> E[5. ネットワーク設定]
        E --> F[6. ストレージ設定]
        F --> G[7. 高度な詳細]
        G --> H[インスタンス起動]
    end

詳細な起動手順

1. 名前とタグの設定

インスタンスを識別するための名前を設定します。タグを追加することで、コスト管理やリソース管理が容易になります。

  • Name: web-server-01
  • Environment: development
  • Project: my-project

2. AMIの選択

クイックスタートから「Amazon Linux 2023 AMI」を選択します。64ビット(x86)または64ビット(Arm)を選択できます。

3. インスタンスタイプの選択

開発・テスト用途であればt3.microまたはt3.smallで十分です。無料利用枠の対象はt2.microまたはt3.microです。

4. キーペアの設定

事前に作成したキーペアを選択するか、新規作成します。Session Managerのみで接続する場合は「キーペアなしで続行」も選択できます。

5. ネットワーク設定

  • VPC: 作成済みのカスタムVPCを選択
  • サブネット: 用途に応じてパブリック/プライベートサブネットを選択
  • パブリックIP自動割り当て: パブリックサブネットの場合は「有効化」
  • セキュリティグループ: 適切なセキュリティグループを選択または作成

SSH接続を許可するセキュリティグループルールの例:

タイプ プロトコル ポート範囲 ソース 説明
SSH TCP 22 自分のIPアドレス SSH接続用

6. ストレージの設定

ルートボリュームのサイズとタイプを設定します。デフォルトは8 GiBのgp3です。

項目 推奨設定
サイズ 8〜30 GiB(用途に応じて)
ボリュームタイプ gp3(汎用SSD)
終了時に削除 開発環境: はい、本番環境: いいえ

7. 高度な詳細(ユーザーデータ)

「高度な詳細」セクションを展開し、ユーザーデータを入力します。

8. インスタンスの起動

設定を確認し、「インスタンスを起動」をクリックします。数分でインスタンスが起動し、running状態になります。

インスタンスメタデータサービス(IMDS)

インスタンスメタデータサービス(IMDS)は、実行中のインスタンスに関する情報を取得するためのサービスです。インスタンス内部から、インスタンスID、IPアドレス、IAMロールの認証情報などにアクセスできます。

IMDSv2の使用

セキュリティ上の理由から、IMDSv2(セッション指向のメタデータサービス)の使用が推奨されています。IMDSv2では、最初にトークンを取得してからメタデータにアクセスします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# トークンの取得
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \
  -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")

# インスタンスIDの取得
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/instance-id

# パブリックIPアドレスの取得
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/public-ipv4

# IAMロールの認証情報取得
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/iam/security-credentials/

主要なメタデータ項目

メタデータパス 説明
instance-id インスタンスID
instance-type インスタンスタイプ
ami-id 使用しているAMI ID
local-ipv4 プライベートIPアドレス
public-ipv4 パブリックIPアドレス
placement/availability-zone アベイラビリティゾーン
iam/security-credentials/ IAMロールの一時認証情報

まとめ

本記事では、EC2インスタンスの起動と接続方法について解説しました。

  • EC2の基本概念: 仮想サーバーサービスであり、柔軟なスケーリングと従量課金が特徴
  • インスタンスタイプ: ファミリー、世代、サイズで構成され、ワークロードに応じて選択
  • AMI: インスタンスのテンプレートであり、Amazon Linux 2023の使用を推奨
  • キーペアとSSH接続: 公開鍵認証によるセキュアな接続方法
  • Session Manager: SSHポート不要でIAMベースのアクセス制御が可能
  • ユーザーデータ: 起動時の初期設定を自動化するスクリプト

次回の記事では、EC2のストレージであるEBS(Elastic Block Store)と、インスタンスのテンプレートであるAMIの作成・活用方法について解説します。

参考リンク