【Twilio CLI】テストと本番でプロジェクトを切り替える

##バージョン
twilio-cli/2.13.0

#■Twilio CLIでプロジェクトを切り替える■
テスト用のプロジェクトでServerlessやFlexを構築して確認したりしていたのを
いざ本番に乗っけるぞ！となった時に、ちょっと困惑したので、やり方をメモしておきます。

もっとこういうやり方があるよ！というのがありましたらお教え頂ければと思います。

##プロジェクトは別なんだけど、ソースは同じなんだよな
テスト用と本番用で一部の環境的なファイル以外はソース変わらないので、
デプロイ先だけ切り替えたいってことがほとんどだと思います。

CLIのセットアップ手順は調べれば色々出てきますが、↑のような時にどう切り替えるか。
最終手段として、別プロジェクトを作成して0からっていうのもありますが…

デプロイ時にデプロイ先だけ指定するとかで出来ればベストですがそんなことが可能なのか…

ゴールとしては、テスト用プロジェクトで作成していた、ServerlessとFlexPluginを
本番用の別プロジェクトへデプロイしリリースすること。

#■Serverless編■

##切り替えを色々試してみる

まずは、プロファイルを追加してみた

```
twilio profiles:add

? The Account SID for your Twilio Account or Subaccount: ACyyyyyy
? Your Twilio Auth Token for your Twilio Account or Subaccount: [hidden]
? Shorthand identifier for your profile: honban

Created API Key SKyyyyyy and stored the secret in the Windows credential vault. See: https://www.twilio.com/console/runtime/api-keys/SKxxxxxx
twilio-cli configuration saved to "C:\Users\aaaaa\.twilio-cli\config.json"
Saved honban.
```

そしてアカウント切り替え

```
twilio profiles:use honban
```

切り替わったか確認

```
twilio profiles:list
ID        Account SID                         Active
test      ACxxxxxx                            
honban    ACyyyyyy                            true
```

切り替わりました。

###いざServerlessデプロイ！

```
× Failed Deployment

│ ERROR Service with name "xxxxx" already exists with SID "ZSxxxxxx".
│
│ Here are a few ways to solve this problem:
│
│ - Rename your project in the package.json "name" property
│ - Pass an explicit name to your deployment
│   > twilio-run.js deploy -n my-new-service-name
│ - Deploy to the existing service with the name "xxxxx"
│   > twilio-run.js deploy --override-existing-project
│ - Run deployment in force mode
│   > twilio-run.js deploy --force
```

**エラーぴえん:cry:**

>with SID "ZSxxxxxx"

こいつが怪しい。こんなのどっかで指定してたっけ？？
検索してみると「.twilio-functions」ってのががひっかかった。誰だ君は:cop:

```-.twilio-functions
{
	"projects": {
		"ACxxxxxx": {
			"serviceSid": "ZSxxxxxx",
			"latestBuild": "ZBxxxxxx"
		}
	},
	"serviceSid": "ZSxxxxxx",
	"latestBuild": "ZBxxxxxx"
}
```

**なんかでも、1回Functionsのサービスを消して、やり直す時とかに**
**このファイルを消してから。ってどっかで見たことある気がするぞ…**

####消します！:sunglasses:

---
###:warning:注意:warning:
**.twilio-functionsファイルは、プロジェクトへの初回デプロイ時のみ削除してください。**
**一度デプロイすると、latestBuild SIDなどを持った状態になります。**

**初回デプロイ以降、プロジェクトを切り替える場合は**
**.twilio-functionsも保持しておいて、プロジェクトごとに切り替えましょう**

---

他にもなんか元のプロジェクトを参照しているのがあるかも？？
探してみる:nerd:

```
Deploying functions & assets to the Twilio Runtime

Account         SKxxxxxx
Token           xxxx****************************
Service Name    xxxxxx
Environment     dev
Root Directory  C:\xxxproject\
Dependencies    xxx
Env Variables   xxx
```

↑そういえば、デプロイコマンド実行した時に出てくるログの最初のとこが、元プロジェクトのSIDにままなってるので
これを設定している箇所を探してみる。

「.env」ファイルが出てきました。そうでした、これに指定してました。

```-.env
ACCOUNT_SID=SKxxxxxx
AUTH_TOKEN=xxxxxx
```

これに、プロファイルを追加した時に作成されたAPI KeyのSIDとトークンを設定して…

```-.env
ACCOUNT_SID=SKyyyyyy
AUTH_TOKEN=
```

####あれ、、AUTH_TOKENなんなんだろう…:disappointed_relieved:

>Created API Key SKyyyyyy and stored the secret in the Windows credential vault. See: https://www.twilio.com/console/runtime/api-keys/SKxxxxxx
twilio-cli configuration saved to "C:\Users\aaaaa\.twilio-cli\config.json"
Saved honban.

API KeyのSIDしか書いてないぞ…

##API KEYをコンソールから作成
twilio profiles:addで追加するとAPI Keyのトークンがわからない為、
コンソールから新しいAPI Keyを追加することに

コンソールから作成すると、登録した時だけトークンが表示されますのでそれをコピーして
.envファイルを書き換えます。


```-.env
ACCOUNT_SID=SKzzzzzz
AUTH_TOKEN=zzzzzz
```


###いざServerlessデプロイ！！

```
√ Serverless project successfully deployed
```

####無事デプロイ完了！やったね:smiley:


#■Flex Plugin編■
この調子でFlexの方もデプロイしてみましょう。


###いざFlex Pluginデプロイ！

```
twilio flex:plugins:deploy --changelog='deploy'"
```

```
Using profile honban (ACyyyyyy)

 » Error code 20003 from Twilio: Authenticate. See https://www.twilio.com/docs/errors/20003 for more info.

twilio-cli profiles use Standard API Keys which are not permitted to manage Accounts (e.g., create Subaccounts) and other API Keys. If you require this functionality a Master API Key or Auth Token must be stored in environment variables:

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

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


**エラーぴえん:cry:**

Flexの方に.envみたいなファイルあったっけ…
appConfigの方は変えたし:expressionless:

エラーメッセージをちゃんと訳して見てみると
>twilio-cliプロファイルは、アカウントの管理が許可されていない標準APIキーを使用します

こっちもAPI Key問題のようです。
たしかに指定して無いけど、指定するとこ（.envとか）も無くない？？

エラーメッセージの次に、環境変数でAPI Keyを設定するようなことがコマンドごと書いてますね。
テスト環境作った時こんな設定した記憶がないけども:confused:

####言われた通りにやってみましょう

Serverless編で追加したAPI Keyの情報を環境変数に設定

```
set TWILIO_ACCOUNT_SID=ACyyyyyy
set TWILIO_API_KEY=SKzzzzzz
set TWILIO_API_SECRET=zzzzzz
```


###いざFlex Pluginデプロイ！！

```
√ Validating deployment of plugin xxxx-flex
√ Uploading xxxx-flex
√ Registering plugin xxxx-flex with Plugins API
√ Registering version v0.0.1 with Plugins API

� Plugin (private) xxxx-flex@0.0.1 was successfully deployed using Plugins API
```

####無事デプロイ完了！やったね:smiley:

#■まとめ■

###Serverlessの方は
+ twilio profiles:addでアカウントを追加
+ コンソールからAPI Keyを追加
+ .twilio-functionsファイルを削除　**（※初回のみ、2回目以降は消しちゃダメ）**
+ コンソールから追加したAPI Keyの情報で.envファイルを書き換え

###Flex Pluginの方は
+ 環境変数でAPI Keyの情報を設定

以上で、ソースなどはそのまま、プロジェクトを切り替えることが出来ました。


**.envファイル、.twilio-functionsファイル、環境変数等を**
**プロジェクトごとに切り替えるバッチ等を用意しておくと、次回以降切り替えが楽になるかもです:clap:**

とりあえず詰まった内容もそのまま記載したので、ややこしい流れになってしまいましたが
備忘録として書いておいた方がいいかなと。


このやり方が正式な方法とは思えないので、冒頭にも書きましたが
もっとこういうやり方があるよ！というのがありましたらお教え頂ければと思います。