SORACOMイベントハンドラーを使ってSIMが利用中になったら通信クラスを変更する

#背景
会社でほそぼそとSORACOMを運用しているんですが、ちょっと困ったことがおきてしまいました。
IoT用途で専用の機械にSIMを挿すためSORACOMコンソールからSIMを購入していてキッティング会社に送付しています。
キッティング会社から出荷されて実際にお客様のところで使い始めるまではタイムラグがあります。本当はお客様のところで実際に使い始めるところからSIM登録したいのですが、みなさまご存知の通り(？) コンソールから購入すると5日後には自動的に「準備完了」状態に移行されてしまいます。

![SORACOM Air利用状態フロー.png](https://qiita-image-store.s3.amazonaws.com/0/142746/8590908c-13dd-d96c-45c2-a8d26ae3d23f.png)
（SORACOM Air料金ページ：https://soracom.jp/services/air/price/ より引用）

「準備完了」状態になると基本料5円/日が発生するため、現状はSIM購入した後に自動的に登録されるまで放置しています。
ここで本来であれば5日後にコンソールから登録済のSIMの通信クラスをs1.minimumに変更する作業をするのですが、この作業が漏れてしまい s1.standardで通信開始してしまい、本来よりも通信料金が高くなってしまうという事故が発生してしまいました(/_;)

SIM購入後にすぐに通信クラスを変更すればいいのですが、SIM登録前の状態では通信クラス変更はできません。かといって購入後にすぐSIM登録してしまうと本来は払わなくて良い基本料（5円×5日=25円）が発生します(/_;)

SORACOMサポートに通信クラスのデフォルトをs1.minimumに変更できないか聞いたところ、デフォルトは変えられないがイベントハンドラーを使ったらどうか、というアドバイスをもらったので、さっそく試してみました。

どうでもいいけど「イベントハンドラ」のほうがしっくり来るんだけどなぁ…(￣ー￣)

#SORACOMイベントハンドラーの設定方法
##SAMアカウントの作成
イベントハンドラーはコンソールから設定できない。soracom-cliもしくはAPIにより設定する。今回はsoracom-cliで設定することにする（楽そうだから…）。
設定するためのSAMアカウントを作成。
SAMアカウントはコンソールから作成。Webコンソールログインはなし。
アクセスキーのみ設定しておく。（手順は割愛）
アクセスキーとシークレットキーを控えておく。

##soracom-cliのインストールと設定
まずはsoracom-cliを使えるようにする。
soracom-cliは↓ここからダウンロード
https://github.com/soracom/soracom-cli/releases

今回はAmazon Linuxで実行するので以下の手順でインストール
（というか恒常的には使わないので取ってきただけ^^;）

```
$ wget https://github.com/soracom/soracom-cli/releases/download/v0.1.5/soracom_0.1.5_linux_386.tar.gz
$ tar xvfz soracom_0.1.5_linux_386.tar.gz
```

soracom-cliの設定
SAMアカウント作成時にひかえたアクセスキーとシークレットキーを使ってsoracom-cliが使えるように設定する。

```
$ cd soracom_0.1.5_linux_386
$ ./soracom configure
--- SORACOM CLI setup ---
This will create a directory /home/ikeda/.soracom if it does not exist yet and place 'default.json' in it.

Please select which authentication method to use.

1. Input AuthKeyId and AuthKey * Recommended *
2. Input Operator credentials(Operator Email and Password)
3. Input SAM credentials(OperatorId, User name and Password)

select (1-3) > 1
authKeyId: keyId-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
authKey: secret-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

うまくコマンド実行できるかテスト
登録されてるSIMの情報をリスト

```
$ ./soracom subscliber list
（登録されたSIMの情報がJASONで出力される）
```
##イベントハンドラーの登録
まずはかんたんなイベントハンドラーを試してみる。
SIMのステータスがactiveになったら指定のメールアドレスにメールを送るには、以下のようなJSONファイルを作成。
今回はSORACOMアカウント全体で設定するためオペレーションIDで指定したが、グループなどでの指定も可能。
↓イベントハンドラーのリファレンスはこちら
https://dev.soracom.io/jp/docs/event_handler/

```sim-status-mail.json
{
  "targetOperatorId": "【自分のオペレーションID】",

  "name": "SIMステータス変更通知",
  "description": "SIMステータスが変更されたらメール通知",
  "ruleConfig": {
    "type": "SubscriberStatusAttributeRule",
    "properties": {
        "inactiveTimeoutDateConst": "IMMEDIATELY",
        "targetStatus": "active" }
  },
  "actionConfigList": [
    { "type": "SendMailAction",
      "properties": {
        "executionDateTimeConst": "IMMEDIATELY",
        "to": "dai@d-line.net",
        "title": "[TEST] SIM Activate",
        "message": "IMSI:${imsi} Activate." }
    }
  ]
}
```
上記で作成したJSONファイルでイベントハンドラーを登録する。

```
$  ./soracom event-handlers create --body @sim-status-mail.json
```
登録されたイベントハンドラーの確認。

```
$ ./soracom event-handlers list
```
テストでコンソールからSIMを一旦休止してから利用可能にするとメールが飛んでくる。

というわけで本題の利用中になったらSIMの通信クラスをs1.minimumに変更するイベントハンドラーは以下のとおり。

```sim-active-s1minnium.json
{
  "targetOperatorId": "【自分のオペレーションID】",

  "name": "SIM初期設定",
  "description": "SIMがアクティベートしたら通信クラスをs1.minmumに設定",
  "ruleConfig": {
    "type": "SubscriberStatusAttributeRule",
    "properties": {
        "inactiveTimeoutDateConst": "IMMEDIATELY",
        "targetStatus": "active" }
  },
  "actionConfigList": [
    { "type": "ChangeSpeedClassAction",
      "properties": {
        "executionDateTimeConst": "IMMEDIATELY",
        "speedClass": "s1.minimum" }
    }
  ]
}
```
このJSONファイルを上記と同様の手順で登録すれば、無事に利用開始とともにs1.minimumに設定される。

めでたしめでたし(￣ー￣)