SPSS License ManagerをAWS上で冗長構成にしてみた（自動編）

## 目的
IBM SPSS StatisticsやIBM SPSS Modelerの同時接続ユーザライセンスを購入した場合、Licnese Managerを導入する必要があります。業務上の理由で冗長構成を選択する場合、製品として推奨している構成は、3台のActiveーActive構成のため、ダウンタイムが全く許容できない場合は、この構成が必要です。この構成の問題点としては、３台のサーバをacitve-activeで運用しなければならないため、運用コストが増大することです。仮に数分から10分程度のダウンタイムが許容できるならば、AWSのサービスをうまく組み合わせて、Acitve-Standby構成を構築することで、管理の省力化と運用コストの削減を行うことが出来ます。

## 対象読者
- インフラ構築担当者
- SPSS Modelerを利用しているが、運用コストが高いと考えている人
- AWS EC2 ,EventBridge ,Lamdbaについて基本的なことを理解している人

## 前提条件
- 冗長構成は同じAZ内で2台のEC2を作成しております。
- SPSSのクライアントからLicenseManagerに接続するときはPublicIPを使用しています。
- 1号機と2号機は同じサブネットに所属している。

## 目次
 [1. 事前準備](##1-事前準備)

 [2. 1号機から2号機への切替Lamdbaの作成](#21号機から2号機への切替Lamdbaの作成)

 [3. 1号機のイベント(EventBridge)の作成](#31号機のイベント(EventBridge)の作成)
 
 [4. 試してみた](#4-試してみた)

 [5. まとめ](#5まとめ)

## 1.事前準備

この記事の内容は前回からの続編になります。まずは
[SPSS License ManagerをAWS上で冗長構成にしてみた（手動編）](https://qiita.com/anlait246/items/e9a75223661c213d46f8/)を参照ください。

## 2. 1号機から2号機への切替Lamdbaの作成
Lambdaを新規に開いて以下のコードを記述下さい。
全体のコードになります。
```
import boto3
from time import sleep
region = 'ap-northeast-1'
instances = ['i-xxxxxxxxxxx2']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    #dinamic get attachment id
    response = ec2.describe_network_interfaces(NetworkInterfaceIds=['eni-xxxxxxxxxxxxxxxx'],)
    #get attachment id
    res_attachid = response['NetworkInterfaces'][0]['Attachment']['AttachmentId']
    # excecute detach
    response = ec2.detach_network_interface(AttachmentId=res_attachid)
    #execute attach
    response = ec2.attach_network_interface(DeviceIndex=1,InstanceId='i-xxxxxxxxxxx',NetworkInterfaceId='eni-xxxxxxxxxxxxxxxxf')
    
    #instance start
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))
```

インスタンスID：i-xxxxxxxxxxx2、ネットワークインターフェースID：eni-xxxxxxxxxxxxxxxxfは各自の環境で置き換えてください。

以下のコードで動的にアタッチメントIDを取得しております（アタッチメントIDは動的に割当てられるため）
```
#get attachment id
res_attachid = response['NetworkInterfaces'][0]['Attachment']['AttachmentId']
```
で動的に取得しております。次に以下のコードで1号機のインスタンスからデタッチをしております。
```
response = ec2.detach_network_interface(AttachmentId=res_attachid)
```
次に2号機のインスタンスにアタッチしております。
```
response = ec2.attach_network_interface(DeviceIndex=1,InstanceId='i-xxxxxxxxxxx',NetworkInterfaceId='eni-xxxxxxxxxxxxxxxxf')
```
最後に2号機のインスタンスを起動しております。
```
ec2.start_instances(InstanceIds=instances)
```
Lambdaの名前を「StartEC2-lm-redundant1」にして保存します。

## 3. 1号機のイベント(EventBridge)の作成
### 3.1 Amazon EventBridgeのルールの作成
- Amazon EventBridgeサービスを選択して「ルール」→「ルールの作成」を選択する。
- ルールの名前「rule-ec2-lm-redundant1」で「次へ」を選択する。
- イベントパターンのところで以下のコードを貼り付けて「次へ」を選択する。
```
{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["stopped"],
    "instance-id": ["i-xxxxxxxxxxx1", ""]
  }
}
```
インスタンスIDは各自のお客様環境に併せて変更してください。今回はイベントパターンをEC2インスタンスの状態が停止済み("stopped")と致します。

ターゲットを選択する画面になりますので「AWSのサービス」を選択して、ターゲットタイプを「Lambda関数」を選択します。次に「関数」の欄が表示されますので、先ほど作成した「StartEC2-lm-redundant1」を選択して「次へ」を選択します。
Tagの画面になりますので、必要に応じてタグ名を作成し、「次へ」を選択し、「ルールを作成」を選択します（タグ名がよくわからない方は設定しなくても大丈夫です）

### 3.2 Lambda上で先ほど作成したEventBridgeのルールをトリガー条件にする。
- Lambdaを選択して、先ほど選作成した「StartEC2-lm-redundant1」を選択して「設定」タブを開きます。
- 「トリガーの追加」を選択して、トリガーの設定で「EventBridge」を選択して「rule-ec2-lm-redundant1」を選択して「追加」を選択します。

## 4 試してみた

### 4.1 SPSS Modelerから1号機への接続
- 自分の端末のSPSS Modler 18.5を起動します。
![spss185_use011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/dd5d28be-937f-4733-99fd-b9b66ea28e91.png)

- 1号機のLicnense Managerを見るとライセンスが「1 in use」になっていることが分かる。
![lm1_user012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/513e543e-6db8-4bda-8028-9d4ae83117d5.png)


### 4.2 1号機から2号機へ
- 1号機のインスタンスを停止する。
![instancestop1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/045926e8-b7a0-4e3d-8170-a60b4c160a17.png)

### 4.3 SPSS Modelerから2号機への接続
- 自分の端末のSPSS Modler 18.5を起動します。
![spss185_use011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/3b9589d5-4adb-4b39-88fb-012c9c0c943e.png)

- 2号機のLicnense Managerを見るとライセンスが「1 in use」になっていることが分かる。
![lm2_user012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3971791/fa119545-5568-4f2f-aca1-2c2641cd66dd.png)

## 5.まとめ
今回は、SPSSのLicenseManagerの冗長化について記事を作成しました。この検証環境ではダウンを検知してから切り替わるまで、1分程度で完了しております。但し、この方法だとAWSに詳しい方はお気づきかと思いますが、AZ障害のときは救うことが出来ません。AZ障害対応の冗長化については、NLBを用いたマルチAZ構成が考えられますが、今後機会がありましたら検証して記載したいと思います。