rustをherokuで動かす

rustで作成した[アプリケーション](https://qiita.com/pokotyan/items/5ee20e71219b77d55b53)をherokuで動かした際の作業の記録。
アプリケーションの内容としては「awsの料金をslackに通知する」というものなので、スケジューラのアドオンを使って定期的に実行させるようにする。

# 0) 事前にやっておくこと
- herokuのアカウントの用意（クレジットカード登録もしておく）
- [herokuのcliのインストール](https://devcenter.heroku.com/articles/heroku-cli)

# 1) heroku.ymlの用意

[heroku.yml](https://devcenter.heroku.com/articles/build-docker-images-heroku-yml)をアプリケーションのルートディレクトリに用意する。

```yml:heroku.yml
build:
  docker:
    web: Dockerfile
run:
  web: cli cost
```

この[リポジトリ](https://github.com/pokotyan/aws_cost_rs)のDockerfileを動かすためのheroku.ymlなのですごいシンプル。
heroku.ymlの内容はどんなアプリケーションかによって変わってくる。


# 2) コマンドを実行していく

```terminal
$ cd /hoge/huga                                                          # アプリケーションのコードがあるところに移動
$ heroku container:login                                                 # ログイン
$ heroku create -a aws-cost-rs                                           # herokuアプリの作成（アプリ名はheroku内で一意である必要あり）
$ heroku git:remote -a aws-cost-rs                                       # herokuリポジトリをgitに登録
$ heroku addons:create scheduler:standard                                # スケジューラのアドオンを追加
$ heroku $ heroku config:set AWS_ACCESS_KEY_ID="****"                    # 環境変数の登録
$ heroku config:set AWS_SECRET_ACCESS_KEY="****"
$ heroku config:set SLACK_WEBHOOK_URL="****"
$ heroku config                                                          # 登録された環境変数の確認
$ heroku stack:set container                                             # heroku.ymlを使う時はこれがいるぽい
$ heroku buildpacks:set https://github.com/emk/heroku-buildpack-rust.git # ビルドパックの指定
$ git push heroku master                                                 # リリース
```

これでリリース完了。herokuのコンソール上でBuild succeededとDeployedの表示があればちゃんとリリースできてるはず。

<img width="1258" alt="スクリーンショット_2020-06-06_6_20_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131625/59abd68c-197e-2560-9775-10511d3f2e7a.png">

あとはスケジューラの設定をして終わり。

<img width="416" alt="スクリーンショット 2020-06-06 6.37.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131625/4b097fb4-e3a1-d058-612c-e0d10d9bbc4a.png">



## [ビルドパックについて](https://devcenter.heroku.com/articles/buildpacks)
herokuで公式に利用できる言語は以下の通り。[ここに記載されている言語](https://devcenter.heroku.com/articles/buildpacks#officially-supported-buildpacks)以外を使いたい場合はサードパーティ製のビルドパックを指定する必要がある。

<img width="792" alt="スクリーンショット 2020-06-06 6.08.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131625/77cc2c55-7b83-2614-e844-807560711fc4.png">

これでrustのビルドパックを指定している。

```
$ heroku buildpacks:set https://github.com/emk/heroku-buildpack-rust.git
```

ビルドパックを指定せずにherokuへpushすると以下のようなエラーが出る。

```terminal

$ git push heroku master
Enumerating objects: 84, done.
Counting objects: 100% (84/84), done.
Delta compression using up to 16 threads
Compressing objects: 100% (79/79), done.
Writing objects: 100% (84/84), 31.25 KiB | 3.91 MiB/s, done.
Total 84 (delta 22), reused 0 (delta 0), pack-reused 0
remote: Compressing source files... done.
remote: Building source:
remote:
remote:  !     No default language could be detected for this app.
remote: 			HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
remote: 			See https://devcenter.heroku.com/articles/buildpacks
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !	Push rejected to aws-cost-rs.
remote:
To https://git.heroku.com/aws-cost-rs.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/aws-cost-rs.git'
```

## クレジットカード登録について
今回スケジューラのアドオンを利用しているが、スケジューラのアドオンはクレジットカード登録がされているアカウントじゃないと利用することができない。

クレジットカード登録をしていない状態でアドオンを追加しようとすると以下のようなエラーが出る。

```
$ heroku addons:add scheduler:standard
Creating scheduler:standard on ⬢ <アプリ名>... !
 ▸    Please verify your account to install this add-on plan (please enter a credit card) For more information, see
 ▸    https://devcenter.heroku.com/categories/billing Verify now at https://heroku.com/verify

```

[クレジットカードを登録したアカウントは月1000時間まで無料](https://jp.heroku.com/free)なのでちょろっとスケジューラを使う分には無料枠に全然おさまる。ちなみにクレジットカードを登録していないアカウントの場合は月550時間までしか無料にならないらしい。


## ビルド時のログ確認について
herokuのconsole上からbuild時のログが確認できるが、この機能はリリースするイメージに[curlが含まれている必要がある。](https://devcenter.heroku.com/articles/build-docker-images-heroku-yml#release-configuring-release-phase)curlがないとログが何も表示されなくなるので、もしリリースの際に死んでても調査がしにくい。
なのでherokuにリリースするイメージにはcurlを含めておいた方がいい。

<img width="1258" alt="スクリーンショット_2020-06-06_6_20_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131625/5b0bd8fc-5acb-110e-0289-52fa45b994dd.png">