AWSにEC2インスタンスを立ててインターネットからアクセスできるようにする
Tuesday, January 28, 2025 · B. Ackkerman · Cloud · 8 min read
EC2作成、DNS設定、SSH接続、Nginx/PM2運用までの手順を一気通貫で整理する。
EC2を作って終わりにすると、外から見えないサーバーのままになる。 この記事では、EC2作成からドメイン設定、SSH接続、プロセス常駐、公開確認までを通しで整理する。 手順はUbuntu系インスタンスを前提にしている。
全体フロー
---
config:
look: handDrawn
theme: dark
---
flowchart TD
A[EC2インスタンス作成] --> B[Elastic IPまたは公開DNS確定]
B --> C[Cloudflare DNS設定]
C --> D[ローカルPCからSSH接続]
D --> E[依存ソフト導入とGitHub接続]
E --> F[アプリをビルドして起動]
F --> G[Nginx + PM2で常駐化]
G --> H[http://ドメイン で疎通確認]
Step 1: EC2インスタンスを立てる
まずはEC2を作成する。例として以下の画面から接続確認できる。
この時点で確認する項目:
- セキュリティグループで
22(SSH),80(HTTP), 必要なら443(HTTPS) を開ける - キーペアをローカルに保存しておく
- パブリックDNS名またはElastic IPを控える
Step 2: ドメインを買ってDNSを向ける
Cloudflareで対象ドメインのDNSレコードを設定する。
基本は A レコードで、EC2の公開IPに向ける。
たとえば @ や www をEC2に向けるだけで、ドメイン経由の到達性を作れる。
Step 3: ローカルPCからEC2に入る
3-1. SSH接続
chmod 400 ~/.ssh/ec2_sandbox001
# ssh -i "cred.pem" ubuntu@43.206.205.113
# ssh -i "path/to/your-key.pem" ec2-user@your-elastic-ip
ssh -i "~/.ssh/ec2_sandbox001" ubuntu@ec2-43-206-205-113.ap-northeast-1.compute.amazonaws.com
3-2. ソフトウェアのインストール
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs git
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 18.18.0
nvm use 18.18.0
nvm alias default 18.18.0
node -v
npm -v
3-3. GitHub認証
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"
cat /home/ubuntu/.ssh/id_rsa.pub
echo "Host github.com
HostName github.com
User git
IdentityFile /home/ubuntu/.ssh/id_rsa
" >> /home/ubuntu/.ssh/config
chmod 600 /home/ubuntu/.ssh/config
ssh -T git@github.com
3-4. 任意のリポジトリをクローンしてビルド
git clone https://github.com/ackkerman/ackkerman.github.io
cd ackkerman.github.io
npm install
npm run build
npx serve@latest out
3-5. 低メモリ環境ならスワップとNodeメモリ制限を入れる
# スワップ領域の作成と有効化
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# Node.jsのメモリ制限
export NODE_OPTIONS="--max-old-space-size=1024"
npm run build
3-6. PM2とNginxで公開運用に載せる
sudo npm install -g pm2
pm2 start npx --name "static-server" -- serve@latest out --listen 8080
# sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo apt-get install -y nginx
sudo vim /etc/nginx/sites-available/default
/etc/nginx/sites-available/default の例:
server {
listen 80;
server_name your_domain_or_IP;
location / {
proxy_pass http://localhost:8080;
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;
}
}
sudo systemctl restart nginx
pm2 save
pm2 startup
ここまでできると、次のようにHTTPアクセスできる。
3-7. Portfolioサイトをデプロイする例
git clone git@github.com:ackkerman/portfolio.git
cd portfolio
npm install
npm run build
pm2 start npx --name "portfolio" -- next start --port 8080
pm2 save
3-8. ストレージを拡張する
作業手順の参考:
lsblk
sudo growpart /dev/xvda 1
df -h
df -T
sudo resize2fs /dev/xvda1
公開後の運用イメージ
---
config:
look: handDrawn
theme: dark
---
sequenceDiagram
participant Browser as User Browser
participant CF as Cloudflare DNS
participant Nginx as EC2 Nginx
participant App as PM2 App(8080)
Browser->>CF: ドメイン解決
CF-->>Browser: EC2 IP返却
Browser->>Nginx: HTTPリクエスト(80)
Nginx->>App: reverse proxy (localhost:8080)
App-->>Nginx: HTML/CSS/JS
Nginx-->>Browser: レスポンス
まとめ
EC2公開で詰まりやすいのは、次の3点だ。
- セキュリティグループやNginxのポート設定漏れ
- DNSの向き先ミス
- プロセス常駐設定(PM2 save/startup)の抜け
この3点を押さえれば、EC2上のアプリは安定してインターネット公開できる。
This is an excerpt from B. Ackkerman's AWSにEC2インスタンスを立ててインターネットからアクセスできるようにする article. I highly recommend you give it a read!