300円/月でEC2のサーバを立てる


はじめに

 趣味でEC2のサーバを低コストで立てる場合、無料枠を使うのが一般的だと思います。しかしながら、12か月の期間縛りがあります。実際に、立ててしばらく使っているうちに興味が失せて、放置したまま1年たってしまい、AWSから請求があって、今更使っていないしもったいないからインスタンス削除 ということを2回繰り返してしまいました。
 3回目にも同じことしてはならないと思っていたところ、t4gインスタンスが発表され、なんと価格は、ムンバイで0.0028 USD(t4g.nano)ではありませんか。これなら、ストレージの金額合わせても月に300円程度なので、まったく使わくなっても許せると思い、さっそく立ててみました。
 立て方は、通常のインスタンスと変わりませんが、t4gはarmのコアなのでソフトのインストールは少し注意が必要です。

EC2インスタンスを立てる

EC2インスタンスを立てる方法は、いろいろなところで紹介されているので、ここでは詳細は割愛します。
https://dev.classmethod.jp/articles/creation_vpc_ec2_for_beginner_2/
などが参考になると思います。
インスタンス作成のポイントは以下となります。
‐ アジアパシフィック (ムンバイ) リージョン を選択する
- マシンイメージでArmのものを選択する
- クレジットの消費タイプをStandard Mode(スタンダードモード)にする

アジアパシフィック (ムンバイ) リージョン を選択する

コスト下げるのが目的なので、作業始める前に、ムンバイリージョンを選択してください(東京リージョンだと倍くらいの価格になります)。これ忘れると作業最初からやり直しになります。

マシンイメージでArmのものを選択する

マシンイメージで、Armのものを選択する必要があります。Amazon Linuxなら右のほうにラジオボタンがあるので、そちらを選びます。

これでインスタンスタイプとして、t4g.nano が選択できるようになります。

クレジットの消費タイプをStandard Mode(スタンダードモード)にする

 t4g.nanoはクレジットタイプがデフォルトで無制限になっています。このままだとCPU使いすぎると課金が増えてしまいます(趣味で使っていて超えることは普通ないと思いますが、事故もありうるので)。以下のように、ステップ3:インスタンスの詳細の設定で、クレジット仕様の無制限チェックボックスを未選択にします。

あとは普通に起動すれば、ムンバイにt4g.nanoインスタンスが起動します。
1か月使った料金はこんな感じです。内訳はEC2 が\$2でEBSが\$1くらいです。

以下は、nginxとPostgreSQLを(ほぼ空で)起動した状態のtopコマンドになります。メモリが0.5Gしかないですが、これくらいの用途ならまだまだ余裕ですね。

ソフトのインストール

 Armのインスタンスで考慮しなければならないのが、ソフトのインストールです。公式サイトには、バイナリがないことも多いです。その場合、以下の方法があります。
- amazon-linux-extras コマンドを使う
- ソースからビルドを行う
amazon-linux-extrasの方が楽なので、こちらでインストールできるものはこちらで行い、そうでないものはソースからビルドすることになると思います。

amazon-linux-extras コマンドを使う

 2021年7月4日現在、amazon-linux-extrasでは以下が利用できるようです。

[ec2-user@***]$ amazon-linux-extras
  0  ansible2                 available    [ =2.4.6  =2.8  =stable ]
  1  httpd_modules            available    [ =1.0  =stable ]
  2  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  4  postgresql9.6            available    [ =9.6.8  =stable ]
  5  postgresql10             available    [ =10  =stable ]
  7  R3.4                     available    [ =3.4.3  =stable ]
  8  rust1                    available    [ =stable ]
 11  php7.2                   available    \
        [ =7.2.13  =7.2.14  =7.2.16  =7.2.17  =7.2.19  =7.2.21
          =7.2.22  =7.2.23  =7.2.24  =7.2.26  =stable ]
 13  lamp-mariadb10.2-php7.2  available    \
        [ =10.2.10_7.2.11  =10.2.10_7.2.14  =10.2.10_7.2.16
          =10.2.10_7.2.17  =10.2.10_7.2.19  =10.2.10_7.2.22
          =10.2.10_7.2.23  =10.2.10_7.2.24  =stable ]
 14  libreoffice              available    [ =5.3.6.1  =stable ]
 16  docker=latest            enabled      \
        [ =18.06.1  =18.09.9  =stable ]
 17  mate-desktop1.x          available    [ =stable ]
 18  GraphicsMagick1.3        available    \
        [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 19  tomcat8.5                available    \
        [ =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50  =stable ]
 20  epel                     available    [ =7.11  =stable ]
 21  testing                  available    [ =1.0  =stable ]
 22  ecs                      available    [ =stable ]
 23  corretto8                available    \
        [ =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232  =1.8.0_242
          =stable ]
 24  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 25  squid4                   available    [ =4  =stable ]
 26  php7.3                   available    \
        [ =7.3.2  =7.3.3  =7.3.4  =7.3.6  =7.3.8  =7.3.9  =7.3.10
          =7.3.11  =7.3.13  =stable ]
 27  java-openjdk11           available    [ =11  =stable ]
 28  lynis                    available    [ =stable ]
 29  kernel-ng                available    [ =stable ]
 30  BCC                      available    [ =0.x  =stable ]
 31  nginx1=latest            enabled      [ =stable ]
 32  ruby2.6                  available    [ =2.6  =stable ]
 33  mock                     available    [ =stable ]
 34  postgresql11             available    [ =11  =stable ]
 35  php7.4                   available    [ =stable ]
 36  python3.8                available    [ =stable ]
 37  lustre2.10               available    [ =stable ]
 38  haproxy2                 available    [ =stable ]
 39  collectd                 available    [ =stable ]
 40  R4                       available    [ =stable ]
 41  kernel-5.4               available    [ =stable ]
 42  selinux-ng               available    [ =stable ]
 43  php8.0                   available    [ =stable ]
 44  tomcat9                  available    [ =stable ]
 45  unbound1.13              available    [ =stable ]
 46  mariadb10.5              available    [ =stable ]
 47  kernel-5.10              available    [ =stable ]
 48  redis6                   available    [ =stable ]
 49  ruby3.0                  available    [ =stable ]
 50  postgresql12             available    [ =stable ]
 51  postgresql13             available    [ =stable ]
 52  mock2                    available    [ =stable ]

nginxは31にあるので、

$sudo amazon-linux-extras enable nginx1
$yum clean metadata
$yum install nginx

でインストールできます。また、PostgreSQLも同様にインストールしました。
PostgreSQLインストールは、下記を参考にしました。
https://www.pedroalonso.net/blog/hosting-postgresql-on-a-t4g-graviton2-arm-instance-on-aws-ec2

ソースからビルドを行う

公式にもamazon-linux-extrasにもない場合、ソースからインストールすることになります。試しに、nginxを、以下を参考にインストールしてみたところ、比較的簡単にインストールできました。
https://blog.k-san.info/nginx-on-centos-on-raspberrypi

raspberry piへのインストール手順が参考になることが多いと思います

最後に

このインスタンスを使って、Angularで作ったサービスを2か月ほど運用していますが、目立った問題は出ていません。メモリ0.5GBというと今ではすごく貧弱なサーバに思えてしまいますが、20年前なら、これくらいでも結構大規模なWebアプリケーションを運用していたスペックだと思います。個人でなら十分遊べるスペックと思います。