AWS EC2
AWSとは何か
AWS(Amazon Web Services)は、Amazonが提供する世界最大のクラウドコンピューティングプラットフォーム。自社でサーバーを買って管理する代わりに、必要なときに必要なだけのコンピュータ資源をインターネット経由で借りられるサービスの集合体。
クラウドサービスを理解するには、以下の3つの分類を押さえておくとよい。
| 分類 | 正式名称 | 説明 | 例え | AWSでの例 |
|---|---|---|---|---|
| IaaS | Infrastructure as a Service | サーバー、ネットワーク、ストレージなどインフラそのものを提供 | 土地と建物の骨組みだけを借りる | EC2, VPC, EBS |
| PaaS | Platform as a Service | アプリケーションの実行環境を提供 | 内装済みのテナントを借りる | Elastic Beanstalk, Lambda |
| SaaS | Software as a Service | ソフトウェアそのものをサービスとして提供 | 完成した店舗をそのまま使う | Amazon WorkMail, Amazon Chime |
IaaSでは自分でOSの設定やミドルウェアのインストールを行う必要がある。PaaSではアプリケーションコードだけを用意すればよい。SaaSはブラウザからすぐ使える。EC2はIaaSに分類される。つまり、自分でサーバーの設定から管理まで行う代わりに、最大限の自由度が得られるサービス。
なぜAWSを学ぶ必要があるのか
現代のWebサービスのほとんどはクラウド上で動いている。AWSは以下の理由で特に重要。
- 世界シェア1位(約30%以上のシェア)
- 200以上のサービスが提供されている
- 日本にもリージョン(データセンター群)がある(東京、大阪)
- 多くの企業が採用しており、求人でもAWSスキルが求められる
- 無料枠があり、学習コストを抑えて始められる
EC2とは
EC2は Elastic Compute Cloud の略。AWSが提供する仮想サーバーサービスで、AWSの中で最も基本的かつ重要なサービスの1つ。
「仮想サーバー」とは、物理的なコンピュータの中にソフトウェアで作り出されたコンピュータのこと。1台の強力な物理サーバーの上に、複数の仮想サーバーを作り出し、それぞれが独立したコンピュータとして動作する。
自宅PCをクラウドに置く感覚
EC2を最も簡単に理解するには、「自分のパソコンをAWSのデータセンターに置いた」とイメージするとよい。
| 自宅PC | EC2 |
|---|---|
| 電源を入れる | インスタンスを起動する |
| OSをインストールする | AMIを選択する |
| スペックを選ぶ(CPU、メモリ) | インスタンスタイプを選ぶ |
| ハードディスクを増設する | EBSボリュームを追加する |
| ファイアウォールを設定する | セキュリティグループを設定する |
| リモートデスクトップで接続する | SSHで接続する |
| 電源を切る | インスタンスを停止する |
| PCを廃棄する | インスタンスを終了(terminate)する |
大きな違いは、EC2では数分で新しいサーバーを作れること、スペックを後から変更できること、そして使った分だけ料金を払うこと。自宅PCは買ってしまえば使わなくてもお金はかからないが、EC2は起動している間だけ課金される(停止すれば課金は止まる)。
Elasticの意味
EC2の「Elastic(弾力性のある)」という名前には、必要に応じてサーバーの数やスペックを自在に変えられるという意味が込められている。アクセスが増えたらサーバーを増やし、減ったら減らす。これがクラウドの最大のメリット。
インスタンスタイプ
EC2で作成した仮想サーバーを「インスタンス」と呼ぶ。インスタンスタイプとは、そのサーバーのスペック(CPU、メモリ、ストレージ、ネットワーク性能)の組み合わせのこと。
インスタンスタイプの命名規則
インスタンスタイプの名前は、次のような規則で構成されている。
t3.medium
│ │ │
│ │ └── サイズ(nano, micro, small, medium, large, xlarge, 2xlarge...)
│ └──── 世代(数字が大きいほど新しい)
└────── ファミリー(用途別カテゴリ)
主なファミリー
| ファミリー | 名前 | 用途 | 例 |
|---|---|---|---|
| t | 汎用(バースト) | Webサーバー、開発環境、小規模アプリ | t2.micro, t3.medium |
| m | 汎用 | バランスの取れたワークロード | m5.large, m6i.xlarge |
| c | コンピューティング最適化 | CPU集約型処理(バッチ処理、エンコード) | c5.large |
| r | メモリ最適化 | データベース、インメモリキャッシュ | r5.large |
| g/p | GPU搭載 | 機械学習、グラフィック処理 | g4dn.xlarge, p3.2xlarge |
| i | ストレージ最適化 | 高速I/Oが必要なデータベース | i3.large |
初心者が覚えるべきインスタンスタイプ
| インスタンスタイプ | vCPU | メモリ | 用途 | 月額目安(東京リージョン) |
|---|---|---|---|---|
| t2.micro | 1 | 1 GiB | 学習、テスト | 無料枠対象(12ヶ月) |
| t3.micro | 2 | 1 GiB | 軽量Webサーバー | 約$8/月 |
| t3.small | 2 | 2 GiB | 小規模Webアプリ | 約$17/月 |
| t3.medium | 2 | 4 GiB | 中規模アプリ | 約$34/月 |
| t3.large | 2 | 8 GiB | 中〜大規模アプリ | 約$67/月 |
AWS無料枠について
AWSには新規アカウント作成から12ヶ月間使える無料枠がある。EC2に関しては以下の条件で無料で使える。
- t2.micro インスタンス(またはt3.microが対象のリージョンもある)
- 月750時間まで(1ヶ月は約720時間なので、1台なら常時起動でもOK)
- Linux/Windows どちらも対象
- EBS 30GBまで無料
注意点として、無料枠を超えると自動的に課金が始まる。複数のインスタンスを起動すると合計時間で計算されるので、2台起動すると半月で750時間に達する。学習目的なら必ず使い終わったらインスタンスを停止すること。
AMI(Amazon Machine Image)
AMIは、EC2インスタンスを作成するためのテンプレート。OSの種類、インストール済みのソフトウェア、設定などが含まれている。パソコンを買うときに「Windows搭載モデル」や「Mac」を選ぶのと同じ感覚。
主なAMI
| AMI | 説明 | 用途 |
|---|---|---|
| Amazon Linux 2023 | AWS独自のLinuxディストリビューション | AWS環境に最適化、無料、推奨 |
| Ubuntu Server | 人気のLinuxディストリビューション | 一般的なWebサーバー、学習用 |
| Red Hat Enterprise Linux | 企業向けLinux | エンタープライズ環境 |
| Windows Server | Microsoft Windows | .NETアプリケーション |
| macOS | Apple macOS | iOS/macOSアプリのビルド |
カスタムAMI
自分で設定したEC2インスタンスからAMIを作成することもできる。例えば、Nginx + Node.js + PM2をインストールして設定まで済ませたインスタンスをAMIにしておけば、次回から同じ環境を数分で再現できる。これは、チーム開発やオートスケーリングで同じ構成のサーバーを量産する場合に特に便利。
インスタンスの作成手順
AWSマネジメントコンソールからEC2インスタンスを作成する手順を詳しく解説する。
事前準備
- AWSアカウントを作成する(クレジットカードが必要)
- AWSマネジメントコンソールにログインする
- 右上のリージョン選択で「アジアパシフィック(東京)ap-northeast-1」を選択する
手順
ステップ1: EC2ダッシュボードに移動
コンソール上部の検索バーに「EC2」と入力し、EC2サービスを選択する。左メニューの「インスタンス」をクリックし、「インスタンスを起動」ボタンを押す。
ステップ2: 名前とタグの設定
- 名前: わかりやすい名前をつける(例:
my-web-server) - タグを追加すると、複数のインスタンスを管理しやすくなる
ステップ3: AMIの選択
- Amazon Linux 2023(無料枠対象)を選択
- アーキテクチャは「64ビット(x86)」を選択
ステップ4: インスタンスタイプの選択
- t2.micro(無料枠対象)を選択
ステップ5: キーペアの作成
- 「新しいキーペアの作成」をクリック
- キーペア名:
my-key-pair - キーペアのタイプ: RSA
- プライベートキーファイル形式:
.pem(Mac/Linux)または.ppk(Windows + PuTTY) - 「キーペアを作成」をクリック
.pemファイルが自動ダウンロードされる(このファイルは二度とダウンロードできないので大切に保管)
ステップ6: ネットワーク設定
- VPC: デフォルトVPCを使用
- サブネット: 優先順位なし
- パブリックIPの自動割り当て: 有効
- セキュリティグループ: 新しいセキュリティグループを作成
- SSHトラフィックを許可(ポート22)
- ソースを「マイIP」に設定(自分のIPアドレスのみ許可、セキュリティのため)
ステップ7: ストレージの設定
- 8 GiB gp3(無料枠の範囲内)
- 暗号化はデフォルトのまま
ステップ8: 起動
- 設定を確認して「インスタンスを起動」をクリック
- 数分でインスタンスが「running」状態になる
キーペア(SSH鍵)
キーペアは、EC2インスタンスにSSHで安全に接続するための認証情報。公開鍵暗号方式を使用している。
公開鍵暗号方式を簡単に理解する
公開鍵暗号方式は「南京錠と鍵」に例えるとわかりやすい。
- 公開鍵 = 南京錠(誰にでも配れる。EC2インスタンスに配置される)
- 秘密鍵 = 鍵(自分だけが持つ。
.pemファイル)
南京錠は誰でも閉められるが、開けられるのは鍵を持つ人だけ。同様に、公開鍵で暗号化されたデータは、対応する秘密鍵でしか復号できない。
.pemファイルの管理
# ダウンロードしたキーペアを安全な場所に移動
mv ~/Downloads/my-key-pair.pem ~/.ssh/
# パーミッションを変更(自分だけが読めるようにする)
chmod 400 ~/.ssh/my-key-pair.pem
chmod 400を設定しないとSSH接続時にエラーになる。これはセキュリティ上の仕組みで、他人が読める状態の秘密鍵は危険だとSSHが判断するため。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'my-key-pair.pem' are too open.
このエラーが出たら chmod 400 を忘れている。
キーペア管理のベストプラクティス
.pemファイルは絶対にGitリポジトリにコミットしない.gitignoreに*.pemを追加しておく- バックアップは暗号化したUSBやパスワードマネージャーで管理
- チーム開発では各メンバーが自分用のキーペアを作成する
- 紛失した場合、そのキーペアでアクセスしていたインスタンスには接続できなくなる(AWS Systems Manager Session Managerを代替として使える)
セキュリティグループ
セキュリティグループは、EC2インスタンスへのトラフィック(通信)を制御する仮想ファイアウォール。「どのIPアドレスから、どのポートへの通信を許可するか」を定義する。
ファイアウォールとは
ファイアウォールは「建物の警備員」のようなもの。誰が入っていいか(インバウンド)、誰が出ていいか(アウトバウンド)をチェックして、許可されていない通信をブロックする。
インバウンドルールとアウトバウンドルール
| 方向 | 説明 | 例え |
|---|---|---|
| インバウンド | 外部からEC2への通信 | 建物に入ってくる人を管理 |
| アウトバウンド | EC2から外部への通信 | 建物から出ていく人を管理 |
デフォルトでは、インバウンドは全てブロック、アウトバウンドは全て許可されている。
よく使うポート番号
| ポート | プロトコル | 用途 |
|---|---|---|
| 22 | SSH | リモート接続(Linux) |
| 80 | HTTP | Webサイト表示(暗号化なし) |
| 443 | HTTPS | Webサイト表示(暗号化あり) |
| 3000 | カスタム | Node.js開発サーバー |
| 3306 | MySQL | MySQLデータベース |
| 5432 | PostgreSQL | PostgreSQLデータベース |
| 6379 | Redis | Redisキャッシュ |
| 8080 | カスタム | 代替HTTPポート |
セキュリティグループの設定例
Webサーバーを公開する場合の典型的な設定:
インバウンドルール:
| タイプ | プロトコル | ポート範囲 | ソース | 説明 |
|---|---|---|---|---|
| SSH | TCP | 22 | マイIP(例: 203.0.113.0/32) | 管理者のSSH接続 |
| HTTP | TCP | 80 | 0.0.0.0/0 | 全世界からのHTTPアクセス |
| HTTPS | TCP | 443 | 0.0.0.0/0 | 全世界からのHTTPSアクセス |
アウトバウンドルール:
| タイプ | プロトコル | ポート範囲 | 送信先 | 説明 |
|---|---|---|---|---|
| すべてのトラフィック | すべて | すべて | 0.0.0.0/0 | 全ての送信を許可 |
セキュリティグループの重要なルール
- セキュリティグループはステートフル: インバウンドで許可した通信の戻りのトラフィックは自動的に許可される
- 1つのインスタンスに複数のセキュリティグループを紐付けられる
- ルールの変更は即座に反映される(再起動不要)
- 「拒否ルール」は設定できない。許可ルールのみ。許可されていない通信は全てブロックされる
- SSHのソースを
0.0.0.0/0(全世界)にするのはセキュリティ上非常に危険。必ず自分のIPアドレスに限定する
SSH接続
SSH(Secure Shell)は、ネットワーク越しにリモートのコンピュータを安全に操作するためのプロトコル。EC2インスタンスへの接続は基本的にSSHを使う。
基本的な接続コマンド
ssh -i ~/.ssh/my-key-pair.pem ec2-user@<パブリックIPアドレス>
各要素の説明:
| 要素 | 説明 |
|---|---|
ssh | SSHコマンド |
-i ~/.ssh/my-key-pair.pem | 秘密鍵ファイルを指定 |
ec2-user | ログインユーザー名(AMIによって異なる) |
@<パブリックIPアドレス> | 接続先のIPアドレス |
AMIごとのデフォルトユーザー名
| AMI | デフォルトユーザー名 |
|---|---|
| Amazon Linux | ec2-user |
| Ubuntu | ubuntu |
| Red Hat | ec2-user |
| CentOS | centos |
| Debian | admin |
接続の実際の流れ
# 1. キーペアのパーミッションを確認
ls -la ~/.ssh/my-key-pair.pem
# -r-------- であること
# 2. EC2に接続
ssh -i ~/.ssh/my-key-pair.pem ec2-user@54.250.xxx.xxx
# 初回接続時はフィンガープリントの確認が表示される
# The authenticity of host '54.250.xxx.xxx' can't be established.
# Are you sure you want to continue connecting (yes/no)?
# → yes と入力
# 3. 接続成功すると以下のようなプロンプトが表示される
# __| __|_ )
# _| ( / Amazon Linux 2023
# ___|\___|___|
# [ec2-user@ip-172-31-xx-xx ~]$
# 4. サーバーの情報を確認
uname -a
cat /etc/os-release
# 5. 接続を終了
exit
SSH接続のトラブルシューティング
| エラー | 原因 | 解決方法 |
|---|---|---|
| Permission denied (publickey) | キーペアが間違っている | 正しい.pemファイルを指定 |
| Connection timed out | セキュリティグループでSSHが許可されていない | ポート22のインバウンドルールを追加 |
| Connection refused | SSHサービスが起動していない | インスタンスを再起動 |
| UNPROTECTED PRIVATE KEY FILE | .pemファイルのパーミッションが緩い | chmod 400 を実行 |
| Host key verification failed | ホストキーが変わった | ~/.ssh/known_hostsの該当行を削除 |
SSH設定ファイルで接続を簡略化
毎回長いコマンドを打つのは面倒なので、~/.ssh/configファイルに設定を書いておくと便利。
# ~/.ssh/config
Host my-ec2
HostName 54.250.xxx.xxx
User ec2-user
IdentityFile ~/.ssh/my-key-pair.pem
これで以下のコマンドだけで接続できるようになる:
ssh my-ec2
Elastic IP
Elastic IPは、AWSが提供する静的なパブリックIPv4アドレス。EC2インスタンスに固定IPアドレスを割り当てるために使う。
なぜ固定IPが必要なのか
EC2インスタンスのパブリックIPアドレスは、インスタンスを停止して再起動するたびに変わる。これは以下の問題を引き起こす:
- DNSの設定を毎回変えなければならない
- SSH接続先が毎回変わる
- 外部サービスのIPホワイトリストに登録できない
Elastic IPを使えば、インスタンスの起動・停止に関わらずIPアドレスが固定される。
Elastic IPの注意点
| 状況 | 料金 |
|---|---|
| 実行中のインスタンスに関連付けられている | 無料 |
| どのインスタンスにも関連付けられていない | 有料(約$3.65/月) |
| 停止中のインスタンスに関連付けられている | 有料 |
AWSは限りあるIPv4アドレスの無駄遣いを防ぐため、使っていないElastic IPに料金を課金する。使わなくなったElastic IPは必ず解放すること。
Elastic IPの割り当て手順
1. EC2ダッシュボード → 左メニュー「Elastic IP」
2. 「Elastic IPアドレスの割り当て」をクリック
3. ネットワークボーダーグループ: ap-northeast-1(東京)
4. 「割り当て」をクリック
5. 割り当てられたIPを選択 → 「アクション」→「Elastic IPアドレスの関連付け」
6. インスタンスを選択して関連付ける
インスタンスのライフサイクル
EC2インスタンスには、いくつかの状態(ステート)がある。それぞれの状態と料金の関係を理解することが重要。
インスタンスの状態遷移
[pending] → [running] → [stopping] → [stopped]
│ │
│ └→ [pending] → [running](再起動)
│
└→ [shutting-down] → [terminated]
各状態の詳細
| 状態 | 説明 | EC2料金 | EBS料金 | データ |
|---|---|---|---|---|
| pending | 起動準備中 | 無料 | 課金 | - |
| running | 実行中 | 課金 | 課金 | 保持 |
| stopping | 停止処理中 | 無料 | 課金 | - |
| stopped | 停止中 | 無料 | 課金 | EBSに保持 |
| shutting-down | 終了処理中 | 無料 | - | - |
| terminated | 終了済み | 無料 | 無料 | 全て削除 |
停止(stop)と終了(terminate)の違い
| 操作 | 停止(stop) | 終了(terminate) |
|---|---|---|
| 例え | パソコンのシャットダウン | パソコンの廃棄 |
| データ | EBSボリュームに保持される | EBSボリュームも削除される(設定による) |
| 再起動 | 可能 | 不可能 |
| EC2料金 | かからない | かからない |
| EBS料金 | かかる | かからない |
| パブリックIP | 変わる(Elastic IPなら固定) | 解放される |
学習中は必ず使い終わったらインスタンスを停止すること。完全に不要になったら終了する。停止中でもEBSの料金はかかるので、長期間使わない場合は終了してしまったほうがよい。
EBS(Elastic Block Store)
EBSは、EC2インスタンスに接続するブロックストレージサービス。パソコンに例えると「外付けハードディスク」のようなもの。EC2インスタンスを停止してもデータは保持される。
ボリュームタイプ
| ボリュームタイプ | 名前 | 用途 | IOPS | スループット | コスト |
|---|---|---|---|---|---|
| gp3 | 汎用SSD(第3世代) | ほとんどのワークロード | 3,000(ベース) | 125 MB/s | 低 |
| gp2 | 汎用SSD(第2世代) | レガシー互換 | サイズに依存 | サイズに依存 | 低 |
| io1/io2 | プロビジョンドIOPS SSD | データベース、高IOPS | 最大64,000 | 最大1,000 MB/s | 高 |
| st1 | スループット最適化HDD | ビッグデータ、ログ処理 | 500 | 500 MB/s | 低 |
| sc1 | コールドHDD | アーカイブ、低頻度アクセス | 250 | 250 MB/s | 最低 |
初心者はgp3を選んでおけば間違いない。gp3はgp2の後継で、コストパフォーマンスに優れている。
EBSの基本操作
# EC2にSSH接続後、ディスクの確認
lsblk
# 出力例:
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# xvda 202:0 0 8G 0 disk
# └─xvda1 202:1 0 8G 0 part /
# ディスク使用量の確認
df -h
# 追加したEBSボリュームのフォーマットとマウント
sudo mkfs -t xfs /dev/xvdf
sudo mkdir /data
sudo mount /dev/xvdf /data
# 永続化(再起動後も自動マウント)
echo '/dev/xvdf /data xfs defaults,nofail 0 2' | sudo tee -a /etc/fstab
ユーザーデータ(起動時スクリプト)
ユーザーデータは、EC2インスタンスの起動時に自動実行されるスクリプト。サーバーの初期セットアップを自動化できる。
基本的なユーザーデータの例
#!/bin/bash
# システムの更新(Amazon Linux 2023ではdnfを使用)
dnf update -y
# Nginxのインストール
dnf install -y nginx
# Nginxの起動と自動起動設定
systemctl start nginx
systemctl enable nginx
# Node.jsのインストール(nvm経由)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install 20
nvm use 20
# アプリケーションのクローンとセットアップ
cd /home/ec2-user
git clone https://github.com/example/my-app.git
cd my-app
npm install
npm run build
ユーザーデータの設定方法
インスタンス作成時の「高度な詳細」セクションで「ユーザーデータ」フィールドにスクリプトを貼り付ける。スクリプトはroot権限で実行される。
ユーザーデータのログ確認
# ユーザーデータの実行ログ
sudo cat /var/log/cloud-init-output.log
Auto Scaling
Auto Scalingは、負荷に応じてEC2インスタンスの数を自動的に増減させる機能。アクセスが急増してもサーバーがダウンしない、アクセスが減ったら余分なサーバーを減らしてコストを節約する、という2つの効果がある。
Auto Scalingの仕組み
┌─────────────────────────────────────────┐
│ Auto Scaling グループ │
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
負荷増加 → │ EC2 #1 │ │ EC2 #2 │ │ EC2 #3 │ ← 自動追加
│ └────────┘ └────────┘ └────────┘ │
│ │
│ 最小: 1台 希望: 2台 最大: 5台 │
└─────────────────────────────────────────┘
主要な概念
| 概念 | 説明 |
|---|---|
| 起動テンプレート | 新しいインスタンスの設定(AMI、インスタンスタイプ、キーペア等) |
| Auto Scalingグループ | インスタンスの集合。最小/最大/希望台数を設定 |
| スケーリングポリシー | いつ増やすか/減らすかのルール |
| クールダウン期間 | スケーリング実行後、次のスケーリングまでの待機時間 |
スケーリングポリシーの種類
| ポリシー | 説明 | 例 |
|---|---|---|
| ターゲット追跡 | メトリクスを目標値に維持 | CPU使用率を50%に維持 |
| ステップスケーリング | 閾値に応じて段階的にスケール | CPU 70%で+1台、90%で+2台 |
| スケジュール | 時間指定でスケール | 毎朝9時に5台、夜10時に2台 |
| 予測スケーリング | 過去のパターンから予測して事前スケール | 過去のトラフィックパターンに基づく |
ロードバランサー
ロードバランサーは、複数のEC2インスタンスにトラフィックを分散させるサービス。レストランの案内係が空いているテーブルにお客さんを案内するイメージ。
AWSのロードバランサーの種類
| 種類 | 名前 | 動作レイヤー | 用途 |
|---|---|---|---|
| ALB | Application Load Balancer | レイヤー7(HTTP/HTTPS) | Webアプリケーション |
| NLB | Network Load Balancer | レイヤー4(TCP/UDP) | 超高速処理、ゲームサーバー |
| GLB | Gateway Load Balancer | レイヤー3 | セキュリティアプライアンス |
| CLB | Classic Load Balancer | レイヤー4/7 | レガシー(非推奨) |
初心者がまず覚えるべきはALB。WebアプリケーションにはALBを使う。
ALBの基本構成
ユーザー → ALB → ターゲットグループ → EC2インスタンス群
│
├── /api/* → APIサーバー群
└── /* → Webサーバー群
ALBはURLのパスやホスト名に基づいてルーティングを振り分けられる。例えば /api/ へのリクエストはAPIサーバーへ、それ以外はWebサーバーへといった設定が可能。
EC2でのWebサーバー構築
ここでは、EC2上にNginx + Node.jsのWebサーバーを構築する手順を詳しく解説する。
全体構成
インターネット → EC2(Nginx:80) → Node.js App(:3000)
NginxがリバースプロキシとしてHTTPリクエストを受け取り、Node.jsアプリケーションに転送する構成。
ステップ1: EC2にSSH接続
ssh -i ~/.ssh/my-key-pair.pem ec2-user@54.250.xxx.xxx
ステップ2: システムの更新とNginxのインストール
# Amazon Linux 2023の場合
sudo dnf update -y
sudo dnf install -y nginx
# Nginxの起動と自動起動設定
sudo systemctl start nginx
sudo systemctl enable nginx
# 動作確認(ブラウザでパブリックIPにアクセスして確認)
curl http://localhost
ステップ3: Node.jsのインストール
# nvmのインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
source ~/.bashrc
# Node.js LTSのインストール
nvm install --lts
node -v
npm -v
ステップ4: Node.jsアプリケーションの作成
# アプリケーションディレクトリの作成
mkdir ~/my-app && cd ~/my-app
npm init -y
# Expressのインストール
npm install express
// ~/my-app/app.js
const express = require('express')
const app = express()
const PORT = 3000
app.get('/', (req, res) => {
res.json({
message: 'Hello from EC2!',
timestamp: new Date().toISOString(),
hostname: require('os').hostname(),
})
})
app.get('/health', (req, res) => {
res.json({ status: 'ok' })
})
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`)
})
ステップ5: PM2でプロセス管理
# PM2のインストール(プロセスマネージャー)
npm install -g pm2
# アプリケーションの起動
pm2 start app.js --name my-app
# 自動再起動の設定(サーバー再起動時)
pm2 startup
pm2 save
# 状態確認
pm2 status
pm2 logs
PM2は、Node.jsアプリケーションのプロセスマネージャー。アプリがクラッシュしても自動で再起動してくれる。
ステップ6: Nginxのリバースプロキシ設定
sudo vi /etc/nginx/conf.d/my-app.conf
# /etc/nginx/conf.d/my-app.conf
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
# 設定のテスト
sudo nginx -t
# Nginxの再起動
sudo systemctl restart nginx
ステップ7: セキュリティグループの確認
EC2のセキュリティグループでポート80(HTTP)が許可されていることを確認する。ブラウザからパブリックIPにアクセスして、Node.jsアプリのレスポンスが返ればデプロイ完了。
料金体系
EC2の料金体系は複数のモデルがある。用途に応じて適切なモデルを選ぶことでコストを最適化できる。
料金モデルの比較
| モデル | 説明 | 割引率 | 適切な用途 | 契約期間 |
|---|---|---|---|---|
| オンデマンド | 使った分だけ支払い | 基準価格 | 短期利用、テスト、予測不能なワークロード | なし |
| リザーブド | 事前予約で割引 | 最大72%オフ | 24時間365日稼働するサーバー | 1年または3年 |
| Savings Plans | 一定額の使用を約束 | 最大72%オフ | 柔軟な割引プラン | 1年または3年 |
| スポット | 余剰キャパシティを利用 | 最大90%オフ | 中断されても問題ないバッチ処理 | なし(中断あり) |
具体的な料金例(東京リージョン、Linux、2024年時点の参考値)
| インスタンス | オンデマンド(/時間) | オンデマンド(/月) | リザーブド1年(/月) |
|---|---|---|---|
| t3.micro | $0.0136 | 約$10 | 約$6 |
| t3.small | $0.0272 | 約$20 | 約$12 |
| t3.medium | $0.0544 | 約$40 | 約$25 |
| t3.large | $0.1088 | 約$80 | 約$50 |
| m5.large | $0.124 | 約$91 | 約$57 |
スポットインスタンスの注意点
スポットインスタンスは最大90%の割引が得られるが、AWSがそのキャパシティを必要とした場合、2分前の通知で中断される。以下の用途に適している:
- バッチ処理
- データ分析
- CI/CDのビルドサーバー
- テスト環境
本番のWebサーバーには絶対に使ってはいけない。
料金の確認と節約のコツ
料金の確認方法:
1. AWS Billing and Cost Management ダッシュボード
2. AWS Cost Explorer で詳細分析
3. AWS Budgets でアラート設定
節約のベストプラクティス:
- 使っていないインスタンスは停止する
- 使っていないElastic IPは解放する
- 適切なインスタンスタイプを選ぶ(過剰スペックを避ける)
- リザーブドインスタンスで長期コストを削減
- AWS Trusted Advisorでコスト最適化の提案を確認する
ベストプラクティス
タグ付け
全てのAWSリソースにタグをつけることで管理が楽になる。
推奨タグ:
- Name: リソースの名前(例: production-web-server)
- Environment: 環境(例: production, staging, development)
- Project: プロジェクト名(例: my-web-app)
- Owner: 管理者(例: team-a)
- Cost-Center: コストセンター(予算管理用)
セキュリティ
- SSHポートは自分のIPアドレスのみに制限する
- rootユーザーでの直接ログインを無効にする
- 定期的にOSとパッケージをアップデートする
- IAMロールを使用してEC2からAWSサービスにアクセスする(アクセスキーをEC2に保存しない)
- セキュリティグループは最小権限の原則に従う
- EBSボリュームの暗号化を有効にする
- AWS Systems Manager Session Managerの利用を検討する(SSHポートを開けずに接続できる)
運用
- CloudWatchでメトリクスを監視する(CPU使用率、メモリ使用率、ディスクI/O)
- CloudWatchアラームで異常を検知する
- AMIのバックアップを定期的に取得する
- インスタンスメタデータサービスv2(IMDSv2)を使用する
実践演習
演習1: 初めてのEC2インスタンス
- AWSアカウントを作成する(無料枠を利用)
- 東京リージョンでt2.microインスタンスを起動する
- SSHで接続してOSの情報を確認する
- Webサーバー(Nginx)をインストールして、ブラウザからアクセスする
- 作業後、インスタンスを停止する
演習2: Node.jsアプリのデプロイ
- EC2上にNode.js + Expressのアプリケーションを構築する
- PM2でプロセス管理を設定する
- Nginxでリバースプロキシを設定する
- ブラウザからアクセスして動作を確認する
演習3: セキュリティの強化
- セキュリティグループのルールを見直す
- SSH接続元IPを自分のIPのみに制限する
- IAMロールを作成してEC2に関連付ける
- EBSの暗号化を確認する