無料で個人開発をはじめてみようと思っている人へおすすめしたいアレコレ2020

初めましてみきおです、今までずっとROM専でした。
業務では主にバックエンドを担当しています。フロントエンドは生来のデザインセンスの悪さもあって避けてきましたが、去年あたりからフルスタックエンジニアという言葉に憧れを抱き、ずっとやりたいやりたいと思っているだけだった個人開発を今年ついにはじめました。
ようやくWEBアプリをほぼほぼ無料で2つほど作成したので2020年版(2019年から)のおすすめのあれやこれやを紹介したいと思います。
基本的にドメイン以外は全部無料でできます。

# 対象

- これから個人開発をはじめようとしている人
- 個人開発について読み漁ったけれどどの構成がベストなのか悩んでいる人
- 無料でどこまでできるのか気になってる人
- 他の人がどんな構成にしているか興味がある人


# はじめに
個人開発をはじめるにあたって、先人たちのブログやQiitaの投稿を読み漁りましたが、大きく2つのポイントがあると感じました。

- 継続
- 集客[^1]

[^1]: ちなみに本記事も集客の一環です。
継続については、イニシャルコストはもちろんのこと、ランニングコストも込みでいかに安くで稼働させ続けられるかが肝になります。大手を含め無料で利用できるサービスが増えてきており、先人たちが公開してくれた4，5年前の無料構成と少しずつ変化してきているため、今回実際に使用したものをメインに紹介していきます。
また、WEBアプリの構成を記載しますが、バックエンド的には変わりはないはずなのでスマホアプリの場合でも参考になるかと思います。

# ホスティング
現状は文句なしでOracle Always Free のコンピュートだと思います。
ホスティング*サービス*ではないためもちろん各種設定を自前でやらないといけないですが、下記が無料のホスティングサービスや他の無料枠のコンピュートとは違います。

- 東京リージョンが選択可能
- 1GBのメモリ

レスポンスを気にするのであれば東京（日本内）リージョンが必須条件になってくるかと思います。
また、メモリについて多くが500MB以下でした。1つのWEBアプリをホストするならそれだけで済むかもしれませんが、複数のWEBアプリのホストやアクセス数の増加によって一時的だとしてもメモリの使用量の増えてしまう場合も考慮すると物理1GBは安心感があります。
私は2台の無料枠のうち1台を開発[^codeserver]とテスト環境にし、もう1台を本番環境にしています。
[^codeserver]: code-serverを入れてどのPCからでも開発ができるようにしていますが、詳細は別途投稿予定です。

# 言語
使い慣れた得意な言語が良いですが、せっかくだから別の言語を学びたいという方にはGO言語をおすすめします。

- 単体でWEBサーバーとして稼働可能
- 軽量、起動時、驚愕の10MB[^2]
- 言語自体がhttpやtemplate機能をサポートしていて楽。
- フルスタックを含むWEBアプリケーションフレームワークが群雄割拠で競い合っていてレスポンスの改善や機能の拡充が目まぐるしい



[^2]: 2つ目に作成したほぼ静的なWEBアプリだと常時12MBほどです。ログイン機能などをつけた1つ目のアプリは徐々に上がっていっていますが、100MBほどで安定しています。
その他Goの特徴としてマルチスレッドが挙げられますが、今回はそこまで重要ではないため割愛します。

# DB
## NoSQL
NoSQLならdynamodbです。永年無料で25GBの容量があります。ただし25GBの容量欲しさにSQLのようなことをさせようとすると痛い目をみます。（軽傷で済みましたが痛い目みました。）

## SQL
SQLなら暫定でoracle always free ATPです。20GBあります。ただし注意点がいくつかあります。

- こちらから制御できないシステム領域が増え続けていく[^3]
- アクセスがないと自動で停止、そこから起動がないと自動削除される。[^4]
- oracleをサポートしていないフレームワークがある[^5]

別でおすすめがあればぜひ教えてください。

[^3]: クエリ実行の最適化まわりのデータらしく、勝手に減ったりしますが基本増えていきます。それが原因でDBは止まりませんが、容量が増えていく様はストレスを感じてしまうため胸をはっておすすめできない一番の理由になってます。現象についてご存知の方がいましたら教えてください。
[^4]: 無料枠の仕様ですが、アクセスしていても停止される時があって困っています。
[^5]: 私の場合はサポートされたいないことを知らずに利用を始めてしまったため、結果としてフレームワーク側を修正しました。めちゃめちゃ時間かかりました。

# ドメイン
## 古くからの正統派ドメインか新興の格安ドメインか
語呂遊びなどが理由でない限りは.comなどの正統派ドメインの中で比較的安いドメインをおすすめします。.workや.xyzなどの格安ドメインは1円～とセールがされていますが、アダルトな業者や悪徳業者がよく利用しているようでtwitterでの表示や検索で除外されるとの情報を見かけます。
イニシャルコストも最低限にしたい場合は格安ドメインで良いかと思いますが、見栄えも考慮してケチらずに正統派ドメインをおすすめします。

## 複数ドメインかサブドメインか
よほどの自信がない限りはサービスごとにドメインを取得する必要はなくサブドメインで問題ないでしょう。
ちなみに私は1つ目のWEBサービスの公開時に2つ目のことを全く考えていなかったため、現在は1つ目が独自ドメイン、2つ目が新たに取得したドメインのサブドメインという構成になっています。

# 定期処理系
awsのlambdaもしくはgcpのCloud Functionsで決まりだと思います。
それぞれ条件によって実行環境が変わるため、グローバルIPが勝手に変わります。スクレイピングとの相性が良すぎます。
私はdynamodbにデータを入れたかったためlambdaを使用しました。
**スクレイピングは用法用量を正しくお守り下さい。**

# おわりに
ちなみに今回作成したWEBアプリは[「書籍ランキングをnote記事から集計」するBlog Book Rank](https://bookrank.ihmdevs.com/)というもの[^6]であり、構成は以下になっています。

- aws lambda（定時集計用）
 - 言語:golang
- aws dynamodb（集計結果格納用）
- oracle always freeマシン（WEBサーバー用）
 - letsencrypt-証明書、cronで自動更新（webroot方式じゃないと証明書更新時にWEBサービスにstopが発生）
 - nginx-ドメイン単位のルーティング（以前のWEBアプリも同居のため振り分けしたりhttpsに飛ばしたり）
 - golang, gin（実働WEBアプリ）[^7]
 - bootstrap, jquery, awesomefont（画面整え用）

それぞれの手順や詳細、1つ目に作成した[WEBアプリ](https://bandsummary.com/)についても今後投稿していければと思います。


[^6]: わかる人にはわかるかと思いますが[テック・ブック・ランク](https://qiita.com/jabba/items/a32c82d6e6d156327617)に触発されて作っています。
[^7]: 1つ目のWEBアプリではginではなくbeegoを使いました。