WSL2にHeroku CLIをインストールする

Sep 26, 2021 01:00 · 1501 words · 3 minute read wsl heroku

今月の目標に掲げている「Webアプリの公開」を進めています。

2021年8月の振り返りと2021年9月の目標 · kapieciiのブログ

Vercel+Next.jsも試したのですが、諸々の都合でHerokuで公開することにしました。

VercelでNext.jsアプリのデプロイを試してみた · kapieciiのブログ

WSL2(Ubuntu18.04)にHeroku CLIをインストールしたときに少し詰まったので、メモを残しておきます。

目次

要約

  • Herokuのドキュメントでは、Ubuntu18.04の場合にはsnapを使ってHeroku CLIをインストールする方法が記載されている。
  • しかしWSL2のUbuntuではsnapが動作しない。
  • snapが動く状態にした上でsnapでのインストールを試したが、エラーが発生。
  • 結局curlでインストールした。
$ curl https://cli-assets.heroku.com/install-ubuntu.sh | sh

WSL2とsnapd

以前herokuを使ったときと同じ手順でHeroku CLIのインストールを試しましたが、エラーが発生。

Herokuで罠サイトを作ってアクセスログを確認した - kapieciiのブログ (hatenablog.com)

$ sudo apt install snapd
$ sudo snap install --classic heroku
error: cannot communicate with server: Post http://localhost/v2/snaps/heroku: dial unix /run/snapd.socket: connect: no such file or directory

どうやらWSL2ではsnapdがうまく通信できていないらしい。
解決方法がGitHubにあったので、紹介されているコマンドを使ってsnapを使える状態にします。

WSL2- Ubuntu 20.04 Snap store doesn’t work due to systemd dependency · Issue #5126 · microsoft/WSL (github.com)

※後述する「詳細な解説記事」に記載されていますが、WSL2環境でこれらのコマンドを実行することで、他の箇所で意図しない動作につながる場合があるようです。
万人におすすめできる方法ではないので、実行する場合は自己責任でお願いします。

$ sudo apt-get update && sudo apt-get install -yqq daemonize dbus-user-session fontconfig
$ sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
$ exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME
$ snap version
snap    2.49.2+18.04
snapd   2.49.2+18.04
series  16
ubuntu  18.04
kernel  5.4.72-microsoft-standard-WSL2

「これらのコマンドで何をしているのか?」に関する詳細な解説記事はこちら。

Using snapd in WSL2 - WSL2 - Ubuntu Community Hub

すごく要約すると、WSL環境が動いているコンテナではsystemdの動作が制限されているので、手動で実行しているとのこと。

というわけでsnapコマンドが使えるようになったので、今度こそHeroku CLIのインストールを試します。

が、またしてもエラー。
エラーを見ると、「wsl-x64」に合致するKeyがなく、CLIのダウンロードに失敗しているようです。

$ sudo snap install --classic heroku
2021-09-19T15:07:42+09:00 INFO Waiting for automatic snapd restart...
error: cannot perform the following tasks:
- Run configure hook of "heroku" snap if present (run hook "configure":
-----
>   Warning: Our terms of service have changed:
 >   https://dashboard.heroku.com/terms-of-service
heroku: Updating CLI... !
Error: HTTP Error 404 for GET https://cli-assets.heroku.com/wsl-x64
<html>
<head><title>404 Not Found</title></head>
<body>
<h1>404 Not Found</h1>
<ul>
<li>Code: NoSuchKey</li>
<li>Message: The specified key does not exist.</li>
<li>Key: wsl-x64</li>
<li>RequestId:{ID文字列}</li>
<li>HostId: {ID文字列}</li>
</ul>
<hr/>
</body>
</html>
    at HTTP._request (/snap/heroku/4076/node_modules/http-call/lib/http.js:215:19)
    at async Function.request (/snap/heroku/4076/node_modules/http-call/lib/http.js:162:9)
    at async UpdateCommand.fetchManifest (/snap/heroku/4076/node_modules/@oclif/plugin-update/lib/commands/update.js:46:28)
    at async UpdateCommand.run (/snap/heroku/4076/node_modules/@oclif/plugin-update/lib/commands/update.js:26:26)
    at async UpdateCommand._run (/snap/heroku/4076/node_modules/@oclif/plugin-update/node_modules/@oclif/command/lib/command.js:43:20)
    at async Config.runCommand (/snap/heroku/4076/node_modules/@oclif/command/node_modules/@oclif/config/lib/config.js:173:24)
    at async Main.run (/snap/heroku/4076/node_modules/@oclif/command/lib/main.js:21:9)
    at async Main._run (/snap/heroku/4076/node_modules/@oclif/command/lib/command.js:44:20)
-----)

curlでHeroku CLIをインストールする

snapは諦め、こちらの方法でHeroku CLIをインストールします。

The Heroku CLI | Heroku Dev Center > Other installation methods > Ubuntu / Debian apt-get

$ curl https://cli-assets.heroku.com/install-ubuntu.sh | sh

ok

$ heroku
CLI to interact with Heroku

VERSION
  heroku/7.59.0 linux-x64 node-v12.21.0

USAGE
  $ heroku [COMMAND]

というわけで、紆余曲折ありましたが、最終的にはcurlコマンド一発でWSL2(Ubuntu18.04)環境にHeroku CLIをインストールすることができました。

最後に

「WSL2が使えるようになってWindowsの開発環境もかなり便利になってきたな」と思っていたのですが、やはり罠は存在しますね。

エラーに出くわしたことで、また一つWSLのことを知れた気がしました。

【新パッケージ】Windows 10 Pro 日本語版/May 2019 Update適用/パッケージ版

tweet Share