はじめに
結構前からOracle Cloudのアカウント登録をしようと思っていたのですが、クレジットカードが使えずアカウントリクエスト制限エラーで作れない状態が続いていました。最近新しくクレジットカードを作ったついでに再挑戦したところ、ようやくアカウント登録できました。
Always Free枠でインスタンスを立てられて、実質無料でK8s環境を構築できるのが魅力です。EKSなどのマネージドK8sだと月1万円ほどかかるので、個人利用にはハードルが高いと感じていました。VPSを借りて構築する方法もありますが、Terraformを使いたかったのでOracle Cloudを待っていました。
Oracle Cloudでのインスタンス作成
リージョン選択
アカウント作成時は大阪リージョンを選択しました。東京リージョンはリソース不足と聞いていたためです。後で知ったのですが、Always Free枠が適用されるのはホームリージョンで設定したインスタンスだけのようです。
リソース不足との戦い
いざインスタンスを作成しようと設定を進めましたが、500エラーが発生。Oracle側にリソースのキャパシティーがないとのことでした。AIに30分ごとに自動でリトライさせて terraform apply を実行させたところ、22時頃にようやくインスタンスが作成できました。
TailscaleでセキュアなSSH接続
TailscaleでSSH接続できることを知り、試してみました。
最初の試行錯誤
最初はSSHキーも登録せずにやってみましたが、SSHモードで起動していなかったため繋がりませんでした。一旦SSHポートを開けてTailscale接続できるようにし、接続確認後にSSHポートを閉じました。その後はTailscale経由でSSH接続できるようになりました。
Tailscaleの利便性
Tailscaleは無料でVPNが作れて便利です。ユーザーは3人までですが、デバイスは100個程度接続できます。PC2台を接続してみましたが、問題なく繋がりました。
普通の ssh コマンドでサーバーを指定すると、Tailscaleが自動的に接続してくれるのが便利です。外部からの攻撃も根本的に弾いているという安心感があります。
K3sの導入
K3sの導入自体は非常に簡単でした。kubeconfigをインポートしてcontextを変えるだけで、ローカルから管理できるようになります。
構成管理の課題と解決策
deployment.yaml などを作成して適用するだけで構築できますが、Gitで管理しないと構成を忘れそうだと感じました。
ただ、K8sは宣言的に設定を管理しているため、kubectl get deployment や kubectl describe でファイルに落とし込むことも可能なのかなとも思いますし、登録されているものは全て kubectl から確認できるので、それほど気にしなくても良いかもしれません。
一気に大量の構成を作る必要がある場合は、Helmなどのテンプレートを使えば簡単でした。自分のサービスを載せる場合も、それほど多くの独立したファイルを作る必要はないかも?
まだ試してないのでわかりませんが、例えばNext.jsなら、Next.jsサーバーのdeploymentとTraefikなどのingress、serviceの設定だけで済むんじゃないかなーと。
WordPressのデプロイとCloudflare設定
K3s環境にWordPressサーバーを立ててみました。ドメインはムームードメインで購入し、CloudflareでDNS設定しました。
Cloudflareの便利な機能
Cloudflareを調べていたら、便利な機能がいくつか見つかりました。
Zero Trust
特定のドメインやパスに対して、Cloudflare側で認証を追加してくれる機能です。
- 50人程度のユーザーなら無料で使える(個人利用なら実質無料、一部制限あり)
wp-login.phpやwp-adminを指定すれば、簡単に二段階認証のような保護ができる- One Time PINがすぐに使える
- GitHub OAuthも試しましたが、最初のテストは成功するものの、その後404になり使えませんでした
- Policyで認証可能なユーザーを制限できるため、知らない人にメールが飛んで認証されることもありません
Security Rules
WAFの設定です(WAFという記載が消えているので、新しくなったのかもしれません)。
wp-adminやwp-login.phpのリクエストにManaged Challengeを設定- 「安全な接続を確立しています」というよくある画面が表示され、botなどを弾いてくれます
- Rate Limitも簡単に設定できます
Bot Fight Mode
botを排除してくれる設定で、チェックを入れるだけで使えます。
多層防御の考え方
Zero Trustだけである程度制御できますが、Bot Fight ModeやSecurity Rulesを併用することで多層に制限をかけられます。Cloudflare側で様々な攻撃を弾いてくれるため、サーバーの負荷も軽減できそうです。
WordPressでの設定が不要になるわけではありませんが、セキュリティは同じ対策でも何層にも分けてかけておくのが(競合しなければ)強固になります。
Cloudflare Tunnelでポート開放不要に
Cloudflare Tunnelを使うと、Public IPの公開やセキュリティルールでのポート許可なしで通信できます。
cloudflared をPodで動かし、ドメインと紐付けるとCNAMEが自動作成されて通信できるようになりました。Public IPもポート開放もせずにアクセスできるのは素晴らしいです。
SSHもTailscaleで繋げているため、ポートを一切開けていないのに通信できるという不思議な状態になりました。80番と443番ポートも閉じられたので、Publicネットワークに配置しているのにIGWだけ繋いで外部からのリクエストは全拒否という状態になり、満足しています。
AIとの相性
AIがターミナルで結果を確認しながら操作できるため、コンソールで作業するより正確で非常に楽でした。
コンソールでの作業だとAIの学習が古いと存在しないUI操作を指示されることがありますが、ターミナル操作なら基本的なコマンドは変わらないため、K8sはAIとの相性が良いと感じました。
Podが死んでも自動で再起動するのも便利ですね。
まとめ
Oracle CloudのAlways Free枠を使って、無料でK3s環境を構築できました。Tailscale、Cloudflare Tunnel、Zero Trustなどのサービスを組み合わせることで、セキュアな環境を簡単に構築できます。
EKSなどのマネージドK8sでも同様の構成は可能だと思いますが、Tunnelは一つの入り口として用意する方が管理しやすそうです。
いくつかのサービスを組み合わせて色々できるのは楽しいですね。
追記: インスタンスの性能のせいかWordPressが遅いですね。元々重いのでしょうか…