高木のブログ

GitHub ActionsでHerokuアプリを24時間稼働させる

2020/09/24

Herokuの無料プランには30分間アクセスがないとアプリがスリープになるという仕様がある
これを回避する方法としてよく使われるのが、Heroku Schedulerを使ってcurlでリクエストを送るという方法
今回はHeroku Schedulerの代わりにGitHub Actionsでやってみた

手順

Workflowファイル(.github/workflows/curl.yml)を作ってmasterにpushするだけ
あとでログを見たときに、GitHub Actionsからのアクセスと判別できるようにアプリURLの末尾に?from-github-actionsを追加している

.github/workflows/curl.yml
name: Wake up, Heroku

on: 
  schedule:
    - cron:  '*/30 * * * *'

jobs:
  curl:
    runs-on: ubuntu-latest
    steps:
    - name: curl
      uses: wei/curl@master
      with:
        args: https://sampleapp-20200924.herokuapp.com/?from-github-actions

結果

きっちり30分毎っていうわけではないが、アクセスが来ていることが確認できた
これだとスリープになってしまう時があるので、実行間隔を10分か20分毎にした方が良さそう

$ heroku logs -n 300 |grep from-github-actions
2020-09-23T12:21:14.591652+00:00 heroku[router]: at=info method=GET path="/?from-github-actions" host=sampleapp-20200924.herokuapp.com request_id=e4428e0c-0c34-4afe-94a1-a32cbc2f7a85 fwd="40.75.17.64" dyno=web.1 connect=0ms service=28ms status=302 bytes=600 protocol=https
2020-09-23T12:36:53.459891+00:00 heroku[router]: at=info method=GET path="/?from-github-actions" host=sampleapp-20200924.herokuapp.com request_id=db5657b5-4916-426f-9405-e92acdb770fd fwd="52.242.94.164" dyno=web.1 connect=7ms service=12ms status=302 bytes=600 protocol=https
2020-09-23T13:15:28.404752+00:00 heroku[router]: at=info method=GET path="/?from-github-actions" host=sampleapp-20200924.herokuapp.com request_id=d5b79ece-7864-42ba-81dd-b7321fc375d9 fwd="52.255.157.44" dyno=web.1 connect=2ms service=6ms status=302 bytes=600 protocol=https
2020-09-23T13:35:07.454408+00:00 heroku[router]: at=info method=GET path="/?from-github-actions" host=sampleapp-20200924.herokuapp.com request_id=9e64c15f-1100-4d3b-97a8-e85a8bcb6ddb fwd="40.70.3.80" dyno=web.1 connect=1ms service=9ms status=302 bytes=600 protocol=https
2020-09-23T14:19:24.647876+00:00 heroku[router]: at=info method=GET path="/?from-github-actions" host=sampleapp-20200924.herokuapp.com request_id=8c26dc11-1b6b-43c6-a0b9-63a3a2bfdcc7 fwd="20.44.105.173" dyno=web.1 connect=2ms service=33ms status=302 bytes=600 protocol=https
2020-09-23T14:38:10.402018+00:00 heroku[router]: at=info method=GET path="/?from-github-actions" host=sampleapp-20200924.herokuapp.com request_id=c4abe4aa-1776-454b-8bbc-bccbcc3aec15 fwd="20.190.244.243" dyno=web.1 connect=0ms service=13ms status=302 bytes=600 protocol=https
2020-09-23T15:23:34.018761+00:00 heroku[router]: at=info method=GET path="/?from-github-actions" host=sampleapp-20200924.herokuapp.com request_id=fd04102e-d446-4ef2-a877-bef85efcba95 fwd="20.190.35.15" dyno=web.1 connect=0ms service=73ms status=302 bytes=600 protocol=https
2020-09-23T15:34:43.497876+00:00 heroku[router]: at=info method=GET path="/?from-github-actions" host=sampleapp-20200924.herokuapp.com request_id=a5223a4e-55ba-48de-a9b3-ba0e7c5a4596 fwd="13.68.113.165" dyno=web.1 connect=0ms service=20ms status=302 bytes=600 protocol=https

参考


SNS でシェアする


ytkg

Written by ytkg, Twitter, GitHub