Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Heroku で Linux コマンドを巧みに使いこなす

More than 1 year has passed since last update.

今年もやってまいりました、Heroku Advent Calendar 2019 3日目です!!

昨日は@zundaさんのHeroku Dataclipsでお手軽公開クエリ で、明日は我らが Heroku SE @masamis さんのHeroku Flow の強化、Review Apps (New)の強化点とその効用ネタです。Heroku チーム続きますね、テンション上がります!!!

しかし、その後が続いていないので、めっちゃ募集してます。新しい機能も提供されつつありますから、ぜひ、色々とお試しください。そして、フィードバックをください!!

Heroku で Linux コマンドを使う

Heroku は Ubuntu ベースで、さまざまなコマンド・パッケージ が使えるようになっています。みんな大好き One-Off Dynos上で、ちょっとLinuxコマンドを使うなんてときにも、非常に便利です。

bash
$ heroku run bash
Running bash on ⬢ still-plateau-40494... up, run.6406 (Free)

~ $ curl oshiire.to -D - -s -o /dev/null
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 02 Dec 2019 01:45:27 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 227
Connection: keep-alive
Location: https://oshiire.to/

こんな感じで、地味に curlコマンドも入っているのは、お手軽便利です。ちょっとした Linuxホストがほしいんだけど、手元に Docker も Virtualbox も Vagrant もない、なんてときに Linuxコマンドを使える Internet 上のサーバは役に立つこともあるでしょう。

とはいえ、随分と頑丈にハードニングをしていますから、使いたいコマンドがないというケースは非常に多いと思います。

Heroku で好きなコマンドを使えるようにセットアップする

できます。ubuntuですからaptコマンドを使って追加ができます。とは言っても、One-Off Dynos 上では

~ $ apt-get install redis-tools
Reading package lists... Done
Building dependency tree
Reading state information... Done
W: Not using locking for read only lock file /var/lib/dpkg/lock-frontend
W: Not using locking for read only lock file /var/lib/dpkg/lock
E: Unable to locate package redis-tools
~ $ sudo apt-get install redis-tools
bash: sudo: command not found

sudo もないですし、ファイルシステムがロックされているので、そりゃもう無理です。

しかし、ここで投げ出さないのが男の子。Heroku からheroku-buildpack-aptなるものが提供されています(本番利用はお控えください。Herokuチームが作っているだけで、原則サポート対象外です)。

通常では、動かしたいWebアプリケーションから利用したいコマンドがないようなときに、それを使えるようにするために使います。がしかし、これ、なんと単体でも動きます。

なので、接続している Redis のパフォーマンステストしたい... なんてときに、redis-tools コマンドがあればすぐにお試しすることができる、ということです。一時的にちょっと使うのに、ちょーど良い感じです。

しかも、準備が必要なのは、この buildpack と Aptfile 一つだけです。やってみましょう。

$ cat Aptfile
redis-tools

$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-apt
Buildpack added. Next release on still-plateau-40494 will use https://github.com/heroku/heroku-buildpack-apt.
Run git push heroku master to create a new release using this buildpack.

$ git push heroku master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 217 bytes | 217.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Apt app detected
remote: -----> Detected Aptfile or Stack changes, flushing cache
remote: -----> Adding custom repositories
remote: -----> Updating apt caches
remote:        Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
remote:        Get:2 http://apt.postgresql.org/pub/repos/apt bionic-pgdg InRelease [46.3 kB]
remote:        Get:3 http://apt.postgresql.org/pub/repos/apt bionic-pgdg/main amd64 Packages [286 kB]
remote:        Get:4 http://apt.postgresql.org/pub/repos/apt bionic-pgdg/11 amd64 Packages [2,483 B]
remote:        Get:5 http://archive.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
remote:        Get:6 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
remote:        Get:7 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1,344 kB]
remote:        Get:8 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]
remote:        Get:9 http://archive.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [789 kB]
remote:        Get:10 http://archive.ubuntu.com/ubuntu bionic-security/main amd64 Packages [739 kB]
remote:        Get:11 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [1,035 kB]
remote:        Get:12 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1,316 kB]
remote:        Fetched 17.3 MB in 3s (6,118 kB/s)
remote:        Reading package lists...
remote: -----> Fetching .debs for redis-tools
remote:        Reading package lists...
remote:        Building dependency tree...
remote:        The following additional packages will be installed:
remote:          libjemalloc1
remote:        Suggested packages:
remote:          ruby-redis
remote:        The following NEW packages will be installed:
remote:          libjemalloc1 redis-tools
remote:        0 upgraded, 2 newly installed, 0 to remove and 57 not upgraded.
remote:        Need to get 598 kB of archives.
remote:        After this operation, 2,840 kB of additional disk space will be used.
remote:        Get:1 http://archive.ubuntu.com/ubuntu bionic/universe amd64 libjemalloc1 amd64 3.6.0-11 [82.4 kB]
remote:        Get:2 http://archive.ubuntu.com/ubuntu bionic-security/universe amd64 redis-tools amd64 5:4.0.9-1ubuntu0.2 [516 kB]
remote:        Fetched 598 kB in 1s (803 kB/s)
remote:        Download complete and in download only mode
remote: -----> Installing libjemalloc1_3.6.0-11_amd64.deb
remote: -----> Installing redis-tools_5%3a4.0.9-1ubuntu0.2_amd64.deb
remote: -----> Writing profile script
remote: -----> Rewrite package-config files
remote: -----> Discovering process types
remote:        Procfile declares types -> (none)
remote:
remote: -----> Compressing...
remote:        Done: 1.2M
remote: -----> Launching...
remote:        Released v3
remote:        https://still-plateau-40494.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/still-plateau-40494.git
 * [new branch]      master -> master

Aptfile に必要な(Ubuntuの)パッケージの名前を入れて、buildpack-apt を加えて、いつもどおりに git push heroku master するだけ。準備したのは Aptfile 一つだけです!

では、実際に Heroku 内で実行してみましょう。

$ heroku run bash
Running bash on ⬢ still-plateau-40494... up, run.3591 (Free)

~ $ redis-benchmark --help
Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests>] [-k <boolean>]

 -h <hostname>      Server hostname (default 127.0.0.1)
 -p <port>          Server port (default 6379)
 -s <socket>        Server socket (overrides host and port)
 -a <password>      Password for Redis Auth
 -c <clients>       Number of parallel connections (default 50)
 -n <requests>      Total number of requests (default 100000)
 -d <size>          Data size of SET/GET value in bytes (default 3)
 --dbnum <db>       SELECT the specified db number (default 0)
 -k <boolean>       1=keep alive 0=reconnect (default 1)
 -r <keyspacelen>   Use random keys for SET/GET/INCR, random values for SADD
  Using this option the benchmark will expand the string __rand_int__
  inside an argument with a 12 digits number in the specified range
  from 0 to keyspacelen-1. The substitution changes every time a command
  is executed. Default tests use this to hit random keys in the
  specified range.
 -P <numreq>        Pipeline <numreq> requests. Default 1 (no pipeline).
 -e                 If server replies with errors, show them on stdout.
                    (no more than 1 error per second is displayed)
 -q                 Quiet. Just show query/sec values
 --csv              Output in CSV format
 -l                 Loop. Run the tests forever
 -t <tests>         Only run the comma separated list of tests. The test
                    names are the same as the ones produced as output.
 -I                 Idle mode. Just open N idle connections and wait.

Examples:

 Run the benchmark with the default configuration against 127.0.0.1:6379:
   $ redis-benchmark

 Use 20 parallel clients, for a total of 100k requests, against 192.168.1.1:
   $ redis-benchmark -h 192.168.1.1 -p 6379 -n 100000 -c 20

 Fill 127.0.0.1:6379 with about 1 million keys only using the SET test:
   $ redis-benchmark -t set -n 1000000 -r 100000000

 Benchmark 127.0.0.1:6379 for a few commands producing CSV output:
   $ redis-benchmark -t ping,set,get -n 100000 --csv

 Benchmark a specific command line:
   $ redis-benchmark -r 10000 -n 10000 eval 'return redis.call("ping")' 0

 Fill a list with 10000 random elements:
   $ redis-benchmark -r 10000 -n 10000 lpush mylist __rand_int__

 On user specified command lines __rand_int__ is replaced with a random integer
 with a range of values selected by the -r option.

ご覧のとおり、標準では搭載されていない redis-benchmark コマンドが利用できるようになりました!

One-Off Dynos のプランを指定したい

これは便利だな!!! と思ったところで、One-Off Dynos ってプラン変えられないんだよなぁーなんて勘違いしている方いらっしゃいませんか?

できます

heroku run するときに --size= でプランを指定するだけです。詳細はOne-off dyno type

ちょっと一時的に Performance-L で、Linux コマンドを打ちたい...

heroku run bash --size=performance-l
Running bash on ⬢ still-plateau-40494... up, run.8643 (Performance-L)
~ $

ほら、ご覧のとおり、Performance-L Dyno を無事に起動することができました!!

ちょっと Linux(Ubuntu) のコマンドが使いたいけど、手元に自由になる Linuxサーバーがない... なんていう、私のためにあるかのような仕組みです。使い終わったら、とっとと削除しておきましょう(そのコマンドが脆弱性にならないとも限りません)。

では、健やかな Heroku ライフを。

sho7650
妻x1+娘x4 オンプレインフラメインのインフラエンジニアが、ソフトウェア中心のPaaS/SaaS業界へ転身し、一度はやめたアプリケーションに手を出し始めている昨今、みなさまいかがお過ごしでしょうか。 外資系はいいぞ(
http://oshiire.to
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away