0xdope

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!