概要
本記事はRenderを使用してアプリケーションを構築していることを前提としています
運用している中で、「もしも自分しか知らないURLにしているはずだけれども、誰かが適当に打ってみたらアクセスできてしまった!」「不正に利用されてアプリが起動したままになって、意図せずRenderの無料枠を超えてしまう!」みたいな状況を仮定してみようと思います
対策としてはIP制限などが考えられると思いますが、今回はID/パスワード認証に失敗した場合にRender側からAPIを使用してRenderを停止してみようと思います
Render APIを使ってみる
Renderを停止する方法ですが、APIがあるようです
https://render.com/docs/api
その中でも今回使用するのは、「Suspend service」というAPIです
https://api-docs.render.com/reference/suspend-service-1
(正直なところここまでしたくはないのですが、即時sleepできるAPIがないようで、、)
兎にも角にもAPIを利用するためには、まずはAPIキーを作成します
手順は公式ページの通りに進めればよいかと思います
手順通りに進めてcurlの確認が取れたら次のステップに行きたいと思います
suspend APIを実行してみます
実際にRender上でアプリを稼働させておいてください
curl --request POST \
--url https://api.render.com/v1/services/${serviceId}/suspend \
--header 'accept: application/json' \
--header 'authorization: Bearer ${your_api_token}'
小さいですが、以下の感じで完全に利用することができなくなります
再開させる時は「Resume service」というAPIを利用します
curl --request POST \
--url https://api.render.com/v1/services/${serviceId}/resume \
--header 'accept: application/json' \
--header 'authorization: Bearer ${your_api_token}'
ということであとはRender上のアプリからこれらのAPIを呼び出せば問題なさそうですね
実装
今回はID/パスワード認証にしようと思いましたが、認証処理用のアプリを作ったりした方が良さそうだったので今回はリクエストを送るとアプリが停止するといった処理だけにとどめます
APIリクエストに必要な情報はハードコーディングしたくないので環境変数で管理しましょう
対象サービスの管理画面中のEnvironmentというところから設定が可能です
RENDER_API_KEY = os.getenv("RENDER_API_KEY")
RENDER_SERVICE_ID = os.getenv("RENDER_SERVICE_ID")
また、python上でのAPIリクエストはお馴染みのrequestsモジュールを使います(requirements.txtの更新もお忘れなきよう)
import requests
url = "https://api.render.com/v1/services/${RENDER_SERVICE_ID}/suspend"
headers = {
"accept": "application/json",
"authorization": "Bearer ${RENDER_API_KEY}"
}
response = requests.post(url, headers=headers)
print(response.text)
実際にgithubにコミット・プッシュしてみるとわかると思うのですが、アプリが即シャットダウンされるのでページが開けなくなっていることが確認できると思います
おわりに
今回はRender APIをRenderアプリ上から実行してみるということを試してみました
まだまだ、種類はあるので他も調べつつ自分のやりたいことを実現できる方法を具現化していきたいと思います