Twilio CLIでプロファイルの切り替えがエラーになる

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

Twilio CLIを使っていて、プロファイルの切替時エラーが出たのでメモ。

<font color='red'>これ、意外と問題が複雑だというのを最後に追記しました。</font>

## エラーの詳細

プロファイルの切り替えコマンド実行時に以下のようなエラーが出た。

```sh
twilio profiles:use プロファイル名
 » twilio-cli encountered an unexpected error. To report this issue, execute the command with the "-l debug" flag, then copy the output to a new issue here: https://github.com/twilio/twilio-cli/issues
```

## 原因を探る

では、言われた通りにデバッグフラグを付けて実行

```sh
twilio profiles:use プロファイル名 -l debug
[DEBUG] Config File: /Users/katsumi/.twilio-cli/config.json
 » twilio-cli encountered an unexpected error. To report this issue, execute the command with the "-l debug" flag, then copy the output to a new issue here: https://github.com/twilio/twilio-cli/issues
[DEBUG] EEXIST: file already exists, mkdir '/Users/katsumi/.twilio-cli'
[DEBUG] Error: EEXIST: file already exists, mkdir '/Users/katsumi/.twilio-cli'
    at Object.mkdirSync (fs.js:729:3)
    at Config.save (/usr/local/Cellar/twilio/2.0.2/libexec/node_modules/@twilio/cli-core/src/services/config.js:183:8)
    at ProfilesUse.run (/usr/local/Cellar/twilio/2.0.2/libexec/src/commands/profiles/use.js:12:54)
```

CLIの環境ファイル`.twilio-cli`がすでにあるからいかんぜよみたいなメッセージ。
でもこれないと困るし。うーん。
一応、`use.js`のソースを確認すると12行目はこんな感じ。

```javascript:use.js(12)
    const configSavedMessage = await this.configFile.save(this.userConfig);
```

で、ここから呼ばれている`config.js`（こいつは`twilio-cli-core`に入っている）の183行目はこんな感じ。

```javascript:config.js(183)
fs.mkdirSync(this.configDir, { recursive: true });
```

なるほど。調べると、この`recursive`オプションは、Node 10.12で実装されたオプションらしい。
[Node.js v10.12.0からは再帰的にディレクトリを作成できる。](https://note.com/teitei_tk/n/n61ce2f1bf7f3)

ということで、現在のNodeのバージョンを見てみたら、

```sh
node -v
v10.8.0
```

はい。すみませんでした。
ということで、Nodeのバージョンを`v12.8.0`に上げたら解決しました。

## どのバージョンから発生したのかを調べる

しかし、いつから`recursive`オプションとか使い始めたんやということで、先程の`config.js`を履歴を追ってみると、`twilio-cli-core`の`v5.1.0`で修正されているようだ。
修正点は[こちら](https://github.com/twilio/twilio-cli-core/commit/42d7d6b862c8d6a785ff1d29aba49db7fb664849)

で、`twilio-cli-core`の`v5.1.0`は、`twilio-cli`の`v2.0.2`から取り込まれているので、結論からすれば、Twilio CLIを2.0.2にバージョンアップしたのが原因ですね。

# まとめ

最初は環境が壊れたのかと思って、`.twilio-cli`をいじったり色々したけど、ちゃんとエラーを追うのって大切ですね。
いずれにしろ、ちゃんとソースが公開されているから便利ですね。

<font color='red'>追記</font>

Nodeのバージョンを上げると、たしかにプロファイルの切り替えはできるようになるんですけど、今度は通常のコマンドが以下のようにエラーになります。

```sh
twilio api:studio:v2:flows:list
 » Installing keytar ...
 » Secure credential storage failed to load.

Alternatively, twilio-cli can use credentials stored in environment variables:

# OPTION 1 (recommended)
TWILIO_ACCOUNT_SID = your Account SID from twil.io/console
TWILIO_API_KEY = an API Key created at twil.io/get-api-key
TWILIO_API_SECRET = the secret for the API Key

# OPTION 2
TWILIO_ACCOUNT_SID = your Account SID from twil.io/console
TWILIO_AUTH_TOKEN = your Auth Token from twil.io/console

Once these environment variables are set, a twilio-cli profile is not required to move forward with installation.
```

今度は`keytar`に問題がありそう。
Nodeのバージョンをv10.8.0に戻すと直るので、バージョンの問題ですね。
ということで、プロファイルの切り替えをするときだけ、Nodeのバージョンを上げて、それ以外は戻すというなんとも面倒なことして対応しています。とほほ。

---
### Twilio（トゥイリオ）とは

https://cloudapi.kddi-web.com
Twilioは音声通話、メッセージング（SMS/チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウドAPIサービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。