🌐

Herokuから脱出した

2022/10/06に公開

今更ですが、Herokuから脱出してみましたので、残しておこうかなと思います。

目標

  1. 何らかの無料サービス上でサーバーサイドアプリケーションを公開する
  2. せっかくならドメインもそれっぽいのがほしい
  3. せっかくならHTTPSで通信できるようにしたい

以下、それぞれを実現するためにやったことです

1. 何らかの無料サービス上でサーバーサイドアプリケーションを公開する

技術選定

無料で、できればアクセスがなくても寝たりしないのがよいと考えていました。そのような条件でパッと見つかったのが

oktetoは無料でkubernetesが利用できるサービスです。以前、okteto上でも自分のアプリケーションが動くかを確認するために試していたことがあり、何もしなくても脱出できるのですが、それでは面白くないので、選択肢から外しました。また、アクセスがないと寝てしまうのもネックでした。

Detaでも同様に自分のアプリケーションが動くかを試していたのですが、よくよく調べてみると、何らかのサーバーレスフレームワーク上で動いているようでした。私のアプリケーションはすべて自前のフレームワークで作られており、サーバーレスには対応していなかったため、一旦見送りました。対応はチャレンジ中です。

Oracle Cloudは無料枠の範囲でAWSのEC2のようにサーバーを立てることができるため、色々と自分で面倒を見なければならないのですが、試してみたかったので、採用することにしました。

Oracle Cloudにサーバーを立てた

ここは未だによくわからない部分が多いし、説明も面倒なので割愛しますが、無料枠の範囲で高めの性能にしました。(CPU3コア、メモリ18GB、Ubuntu)
なお、注意点としては、性能を盛るためにはARM64のアーキテクチャのCPUを使うことになるので、このあと色々と対応が必要です。

アプリケーションをどうやって動かして公開するかを考えた

アプリケーションをそのまま動かすことはせず、docker-composeで立ち上げることを考えました。
また、今後も様々なアプリケーションをデプロイすることを考えると、前段にnginxのようなプロキシが居たほうが良かろうと考え、そのような構成にしています。(今はアプリケーションはひとつしかありません。)

パブリックIPが割り振られるので、あとはサブネットの設定からポート80と443を開けておくことで、通信自体は問題なくできるようになりました。

コンピューティングインスタンスにDockerをインストールした

Dockerをインストールしないことには始まりませんので、インストールします。こちらの記事が大変参考になりました。
Docker Composeもインストールしました。これかな。

アプリケーションをDocker Compose上で動かせるようにした

ここは少しハマりました。ARM64アーキテクチャなので、DockerImageもARM64向けにビルドしなければいけません。まずは手元のマシンでビルドしたかったのですが、このマシンはAMD64アーキテクチャであるため、ARM64用にビルドするにはコツがいります。
色々試行錯誤した結果、Docker Buildxを使うのが一番手っ取り早かったです。

こちらを参考にしました。

ここも完全には理解していないのですが、かいつまんで書くと、

# buildxインスタンスを用意する
$ docker buildx create --name multi-arch
# buildxインスタンスを使うようにする
$ docker buildx use multi-arch
# --pushでイメージをビルドしたあとpushする(ローカルには残らない)
$ docker buildx build --platform linux/amd64,linux/arm64 -t your/imagename:latest --push .

という感じで、イメージを同じタグで複数のCPUアーキテクチャに対応させてビルドすることができました。

nginxのプロキシを立てるようにした

80, 443番ポートに通信が来たらアプリケーションに通信を流すよう設定しました。(この実装は80番ポートしか待ち受けていませんが、最終的には443番ポートも設定しています)
https://github.com/naoki-tomita/oci-loadbalancer/blob/44738b911a0991b553d0fe9bdb3eacc0f40c9b31/nginx/nginx.conf

ここまでで、ポート80, 443にアクセスすると、アプリケーションが見られるようになりました。

2. ドメインを取った

freenomを使いました。
ここはほかでも色々と説明されているところだと思うので、割愛します。

3. SSL証明書を取った

Let's Encryptを使いました。
Dockerコンテナ内のnginxを使って証明書を発行したり更新したりする必要があり、若干面倒でしたが、なんとかなりました。
こちらを参考にしました。

完成物

こちらです。

今後の目標

  • デプロイの自動化
    • masterにコミットしたら自動的にテストやデプロイが行われるようにする

以上です。よろしくお願いいたします。

Discussion