Oracleの無料サーバをしゃぶり尽くそう

これはアドベントカレンダー4日目の記事です.他の記事は こちら

こんにちは,自宅鯖に狂わされたぎがおにおんです.突然ですが,ネットに居場所,ありますか? ここでいう居場所とは,自分のホムペなどです. まだ勉強中,自分とは無縁だ…などと思っている人こそ,今すぐサーバを持つべきです. 場所がなければ,何も生まれません.自分のサーバがあれば,何ができるでしょう?

  • 独自ドメインのメアドを持つ
  • 友人と遊ぶためのMinecraftサーバ
  • 24時間寝ずに働き続けるDiscord Bot
  • 個人用のWebアプリのバックエンド
  • 自己紹介ページを,世界中に公開する.

これらは,自分のPCや大学のPCでは不可能です.電源を落としたら終わるし,学内ネットワークの制限もあるからです. 自由なインターネットの世界に,24時間365日稼働するサーバを手に入れて初めて,居場所があると言えるでしょう.しかし,Windowsを使いすぎると,思考力が鈍ってしまうものです.講義で一応CLIを学ぶ機会はあっても,これを実用に使うことについては聞く機会もなく,CLIは面倒くさいだけだという認識の方もいると思います. しかし,サーバにとって,GUIはリソースを食い潰すだけの寄生虫です.保守でしか見ないデスクトップのどこにリソースを費やす意味がありましょうか.また,ボタンをクリックする操作は通常は自動化できません.自動化処理は,CLIでやるべきです.スクリプト一つで世界を構築できて初めて,エンジニアといえるでしょう.

サーバ代の心配も無用です.今回は,Oracle Cloud (OCI)の狂気レベルの無料枠と,MyDNSを使い,完全無料で,しかも有料VPSを凌駕するハイスペックサーバーを手に入れて,実際にWebサーバを構築してみます.

何をするかはサーバを建ててから考えれば良いのです.今こそ,インターネットに居場所を作りましょう!

なぜOCIか

クラウドサーバーといえばAWSやGCPが有名ですが,学生が個人でサーバーを持つならOracle Cloud Infrastructure(OCI)一択です. 無料枠のスペックが異常に高いのです.

通常,クラウドの無料枠といえば1 vCPU / 1GB RAMくらいが相場です.これはOSを動かすだけで精一杯で,重いアプリケーションを動かすとすぐに落ちてしまいます.しかも,AWSなどは12ヶ月間のみ無料といった期限付きがほとんどです.

しかし,OCIの Always Freeの,特に Armインスタンス は次元が違います. ここでスペックを見てみましょう.

項目OCI (Always Free)AWS (Free Tier)
CPU4OCPU (約4 vCPU相当)1vCPU
メモリ24GB1GB
期間無期限12ヶ月
ストレージ200GB30GB

さて,あなたのPCにメモリは24GBありますか?GUIアリのPCですら中々ここまでのメモリを積んでいることは無いでしょう.まして,CLIのみの運用だったら滅多な用途では不足しないレベルです.もはやサブPCを配っているようなものです.使わない手は無いでしょう.学生なんて乞食してなんぼです.

アカウント登録

さて,では早速登録をしていきましょう. この リンクの「無料で始める」ボタンをクリックして登録を行います.基本は指示に従えばOKですが,ホームリージョンは変更できないので注意です.東京は当たり前に人気なので,個人的にはまだマシな大阪がおすすめです.Ping値は実用の範疇ですし,東京は人気が高すぎて可用性が厳しいので.また,クレカの登録で弾かれることがありますが,銀行系のカードは体感で通りやすかったです.カード会社が海外利用を弾いているケースもあるので,何かあったらとりあえずメールボックスを確認してみてください.

無事登録できた方,おめでとうございます.第一関門突破です.次に「Pay As You Go」にプランをアップグレードしましょう.これは任意ですが,Armインスタンスはあまりに人気で,無料のみのユーザには有料アカウントよりVM立ち上げが困難になっているので,無駄な時間を浪費したくない方はアップグレードするのが一番手取り早いです.ホームのハンバーガーメニュー→「請求とコスト管理」→「支払いのアップグレードと管理」から行えます.OCIは,無料枠のリソースには「Always Free」のラベルがあるのでミスして課金するというのはまず起こらないのでクラウド破産の心配は少ないです.不安な方は念の為に,予算アラートを設定すると良いでしょう.先ほどの「請求とコスト管理」のタブの「予算」から1円の予算,アラートのメアド登録で安心して眠れます() OCIのアップグレード画面 OCIの予算画面

VMの立ち上げ

では早速,VMを実際に立ち上げていきましょう.ダッシュボード→「コンピュート」→「インスタンス」と移動します. OCIのダッシュボード 次に,そのページの「インスタンスを作成」と進みます.お名前はお好みで,殆どはデフォルトのままで問題無いです.基本的に無料枠の範囲内となるように設定します.「シェイプの変更」から,シェイプシリーズをAmpereに,OCPUの数を4,メモリーを24GBにして(任意,リソースを分けたい方はお好みでどうぞ),シェイプの選択をクリックします. シェイプの選択画面 また,初期設定のOSである,OracleLinuxは,あまり初学者向けではないので,ネットにナレッジが転がっているUbuntuに変更するのがお勧めです.「イメージの変更」→Ubuntu→Ubuntu 24.041と選択します. 次に進んでいって,ネットワークの設定を行います.プライマリネットワーク,パブリックサブネットを新規作成します. VNICの選択画面 「パブリックIPv4アドレスの自動割当て」にチェックが入っていることを確認しましょう.これが無いと死にます. パブリックIPの画面 次に,SSHの設定です.キーペアを自動生成にして,秘密キーをダウンロードしておきましょう.パスワード認証は化石です.今は公開鍵の時代です. SSH鍵の画面 最後に,ブートボリュームを枠いっぱいの200GBまで増やして終了です. ブートボリュームの画面 全て終わったら,作成を押してください.状態が実行中になったらおめでとうございます!勝利です!!

SSH接続とセキュリティ

さて,ここから実際にサーバっぽい運用を実際にして行きましょう.まず,サーバにssh接続します.わざわざTeraTermなどを入れる必要はありません.今やMicrosoftもデフォルトでsshクライアントを搭載する時代です.(Macの皆さんもターミナルを開きましょう^_^)ターミナルで先程ダウンロードした鍵のあるディレクトリを開きましょう.エクスプローラでパスをコピーしてcdするだけです.

ssh -i ./{ur.key} ubuntu@{urIP_Addr}

{ur.key}と{urIP_Addr}は,先程落とした鍵のファイル名とインスタンスのIPアドレスを入れます.IPアドレスはさっきのインスタンス画面の「グローバルIP」のIPアドレスです.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

上記のようなエラーがでたら,鍵のファイルのパーミッションが緩すぎるので,Windowsなら権限を所有者のみに,Macなら,chmod 600して解消できます.

# 現在のユーザーにのみアクセス権を付与する.ssh.keyを自分のファイル名にしてください.
icacls .\ssh.key /c /t /inheritance:d
icacls .\ssh.key /c /t /grant ${env:UserName}:F
icacls .\ssh.key /c /t /remove Administrator "Authenticated Users" BUILTIN\Administrators BUILTIN Everyone System Users

プロンプトが,ubuntu@{hoatname}:~$になればOKです.ここから保守管理をしていくわけですね. ログイン後の画面 まずは,パッケージの更新をしましょう.

sudo apt update && sudo apt upgrade -y

を実行して,パッケージの更新を行います.updateで更新の確認,upgradeで実行というイメージです.常に最新にすることが望ましいです.更新が面倒な方は,unattended-upgradesを用いて自動化できます.詳細は この記事 を参考に設定してみてください(他力本願寺).

では,次にファイアウォールをいじります.OCI含むクラウドはOSとネットワークの二重でファイアウォールが張られていることが多いです.まず,クラウド側のネットワークのファイアウォールを解除します.今回は,ウェブサーバの構築を目標にするので,80と443を開けます. OCIのファイヤウォール画面 OCIのファイヤウォール画面 先程のインスタンス画面から,「アタッチされたNIC」の「サブネット/VLANリンク」をクリックします.そこから,「セキュリティ」→「Default Security List…」をクリックします. そこから,「イングレスルールの追加」をクリックし,画像のように設定します. ファイアウォールのルール追加

  • ソースCIDR:0.0.0.0/0
  • 宛先ポート範囲:80,443 ファイアウォールのルール設定 これで,クラウド側はOKです.

次に,サーバ側でも同じ作業をします.

# ポート80(HTTP)を開放
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 80 -j ACCEPT

# ポート443(HTTPS)を開放
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 443 -j ACCEPT

# 設定を永続化する
sudo netfilter-persistent save

Dockerを導入する

では,実際にページやアプリを公開してみましょう.一昔前は,aptコマンドでサーバ側に一々パッケージを入れていたものですが,今は便利なDockerという箱に押し込んでシステムを汚さずにアプリケーションを起動できます.今回は,簡単のため,こちらを用いましょう.

curl -fsSL https://get.docker.com |bash
## 上のコマンドが成功したら以下を実行
sudo usermod -aG docker $USER

このコマンド一発で環境が出来上がります.便利な時代です.sshを切断して再接続すると変更が適用されます.

では,早速,Webサーバを公開してみましょう.

docker run -p 80:80 --name webserver nginx

シェルに黒文字がずらーっと流れましたか?この状態で,PCのブラウザにサーバのipを打ち込んでみましょう. ブラウザからアクセスした画面 画像のようなページが表示されましたか?これはローカルではありません.OCIのサーバからのレスポンスです.これであなたも「インターネッツの住民」の仲間入りです!確認できたら,一先ず,Ctrl+CでDockerのコンテナを殺しましょう.

ドメインを入手する

では,このipアドレスに名前を与える作業,即ちドメインの取得をします.通常ドメインは有料ですが,仏のような方がドメインを貸してくれています.ありがたく利用させていただきましょう. この ページから登録を行います.2

完了後,来るメールにパスワードとIDがあるので,これでログインし,DomainInfoタブに移動します.そこから,「Domain」セクションに,希望する名前+.mydns.jpを入力し,確認→送信をします.これでドメインを使用できるようになりました. MyDNSのドメイン登録画面

では,このドメインとサーバのipアドレスを紐付けていきましょう.MyDNSに,定期的にipを通知する必要があります. サーバのシェルで,

crontab -e

を実行してください.Select an editor…と訊かれたら,1(nano)を選択してください.(お好みがある方はそちらをどうぞ.多くの人にとってはnanoで十分です) そこに,以下を入力します.

# 10分ごとにMyDNSへIPアドレスを通知する
*/10 * * * * curl -u {MasterID}:{Password} https://www.mydns.jp/login.html  &> /dev/null

{MasterID}と{Password}は,先程のMydnsのものを入力してください.Ctrl+S→Ctrl+Xで終了して暫く待った後,コンテナを起動してブラウザにドメインを入れればページが表示されすはずです.

しかし,今時http,少しダサくないですか?()ここでは,Caddyという別のWebサーバを使ってSSL化までしてしまいましょう. まず,データ保管のディレクトリを作成しましょう.

mkdir ~/myserver
cd ~/myserver

先程とは違い,docker composeを使います.これで,Dockerのコマンドを一々打たずともコンテナを起動できるようになります. まず定義ファイルとテストページを作成します.

# コンテナの定義ファイル
cat <<EOF>compose.yaml
services:
  caddy:
    image: caddy:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./site:/usr/share/caddy
      - caddy_data:/data
      - caddy_config:/config

volumes:
  caddy_data:
  caddy_config:
EOF

次に,証明書の定義ファイルを作成します.

nano Caddyfile
#自分のドメインに変更
your-domain.mydns.jp {
    root * /usr/share/caddy
    file_server
}

最後にページを立ち上げてみましょう

# サイト用ディレクトリ作成
mkdir site

# テスト用HTML作成
echo "<h1>Hello from Secure Oracle Cloud!</h1>" > site/index.html

# 起動(-dをつけるとバックグラウンドで実行できます.終了するときはdocker compose downを使用)
docker compose up -d

これで,サーバを起動すると,ブラウザからアクセスできるかつ危険なページ表記が消えているはずです.これでいつでも知り合いにホームページを自慢できますね!!!

おわりに

今回の作業で,タダでホームページやウェブアプリを公開するための強力なサーバを手に入れました.CLIも思ったより簡単ではありませんか?これをベースに,できることは山ほどあります.その一方,するべきセキュリティ対策も山ほどあります.絶えず生じている脆弱性の修正パッケージは,なるべく早く,常に最新にしている必要があります.更新は自動化もできますが,完全に自動にすると後方互換性の問題が生じる可能性もあるためそのリスクとのトレードオフでもあります. CLIというハードルを乗り越え,実際にWebサーバまで構築したあなたならこれから何をするか,何をできるか,を探索することはもう怖いことではありません.世界へ飛び出しましょう!


  1. 2025年12月時点 ↩︎

  2. ゴリゴリ個人情報を聞かれますが,ドメインを持つというのはこれくらい責任を伴うことです.偽らず入力しましょう. ↩︎

コメント

コメントを読み込んでいます...

コメントを投稿する