ServiceNowのデータをAppFlow経由でS3に保管してみる

![diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/775ea5eb-1a3d-aaec-e73f-19304893b24a.jpeg)
[ServiceNow](https://www.servicenow.co.jp/)内のデータをどこかに保管しておきたいのですが、楽にできそうなAmazon AppFlowを触ってみることにしました。今回はサーバーの構成情報をS3に保管するという体です。

## Amazon AppFlowとは
[Amazon AppFlow](https://aws.amazon.com/jp/appflow/)はSaaSのアプリケーションとAWSサービスのデータ転送を可能にする「フルマネージド（ここ重要）」なサービスです。SlackやDatadogなど20のサービス(2021/3現在)と接続が可能になっています。

App Flowのセットアップ方法はドキュメントに書いていますが、GUIどおりに進めていけば問題なかったです。
https://docs.aws.amazon.com/ja_jp/appflow/latest/userguide/requirements.html

## AWS Management Consoleへログインし、AppFlowを選択する
![flowsnow (81).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/ab615bb9-68c6-6d90-7617-b52e1481f777.png)
マネジメントコンソールから検索画面で入力します

## 使用するサービスを選択する
![flowsnow (82).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/dd4ae28e-db0e-f0f7-a4ab-d22f03d6bf13.png)
データ送信元のサービスをここで選択します。
新規作成でも大丈夫ですが、ここで選択をしておくと送信元を選択するときに自動で選択されるのでちょっと楽になります。

## フローの詳細を指定
![flowsnow (83).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/0295672d-ad41-bf8b-cde5-f8fc203fe1cc.png)
フロー名を入力する以外はデフォルトのままにします

## フローを設定
![flow (106).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/2d31f282-88c6-704e-6238-cd7fa5367e7c.png)
送信元と送信先を設定します。送信元は自動で選択されているのでそのままです（新規作成から作成した人はここで送信元のサービスを選択します）。接続のボタンがあるので詳細情報を入力します。

### 送信元の詳細
![flow(85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/6c2e7887-4d5c-90bb-cb34-54d0721beb7c.png)
接続するを押すとインスタンスの情報を入力します。

- ユーザー：管理者権限をもつユーザーを入力する必要があるので、使用するユーザーにロールが付与されているかは確認をしておきます。
- パスワード：特に説明なし
- インスタンス名：ServiceNowの個人インスタンスはdevXXXXXX(数字)で表記されているので、そこをコピペしてきます。
- 接続名；どこと接続するのかわからなくなるので、自分が後々わかれば大丈夫です（今回は- ServiceNowからAWSへの接続テストなので名前も適当にしています）

![flowsnow (86).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/8cd8be8f-2138-79ee-1820-2f023deeda63.png)
上記を入力後に接続を押すと、問題なければServiceNowオブジェクトを選択が表示されます。
今回は構成管理のサーバー名を保存したいので、cmdb_si_serverを選択します。どの情報を送信させたいのかはここで検索することも出来ますが、予めServiceNow上でのテーブル名をメモって置くほうがスムーズに行きます

### 送信先の詳細
![flow(84).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/c9ddbb1f-2a23-aa76-df47-116fe1b32b75.png)
送信先は送信元と違って数が限られています(オレゴンはHoneyCodeが追加されています)。
今回単純にServiceNow上のデータを保管したいだけなので、S3を選択します。

### フロートリガー
![flowsnow (89).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/061cbdfe-9306-3fc1-a532-e782ebf86e83.png)
いつどのタイミングで転送するのかを選択します。１分おきにデータを取りに行く設定もできますが、課金されるのも嫌なので今回はオンデマンドで実行を選択します
画面はスケジュールで実行を選択した場合、どのぐらい細かく見れるのかを表示させたかっただけです。

## データフィールドをマッピング
![flowsnow (90).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/4fbf39ae-a33f-19df-ac19-5a50c9da6c8f.png)
送信元の情報を送信先のどこにマッピングするのかをここで設定します。そのまま全てを保存したいだけなので、今回は「全てのフィールドを直接マッピングする」を選択します。
問題がなければ次へ。

## フィルターを追加する
![flowsnow (91).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/f0694c30-4f14-95d3-cee3-36012403b6f1.png)
必要なものだけを送信したい場合はここで指定ができます。
お試しで入力しますが、全部取り込みたい場合はそのまま次へいきます。

![flowsnow (92).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/97fb7c43-2ee0-58d1-6225-7bb305d7088b.png)
確認して全てOKなら、フローを作成を押します。

## フローを実行する
![flowsnow (93).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/79325506-0377-a0e9-998a-a9ee7e8523e1.png)
無事に作成されたのでフローを実行します。割とすぐに完了しましたって出ました。

![flowsnow (95).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/49cc870c-dcbb-6bc7-bfaf-092a59289e10.png)
![flowsnow (96).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/fadbef70-34cf-d38e-3738-576fe4cd6e38.png)
S3のバケットを見てみるときちんと出力されていました。
ファイルをダウンロードして中身を見るとサーバー41台がしっかり「全部」送信されたのが確認できました。
（devXXXXXXは変換しました。ちなみにこれらは全部デモデータです）


## ServiceNowでデータを追加して再度フローを実行する

せっかくなのでサーバーの情報を追加してもう一度実行してみます。

![flowsnow (97).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/abcfbd69-363f-7618-8cd8-1b83ffe20e81.png)
ServiceNowにログインし、フィルターナビゲーターと呼ばれる検索窓に「cmdb_ci_server.list」と入力し、サーバー一覧を表示させます。

![flowsnow (98).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/f3a1aa03-df75-16da-a36e-501d243ba431.png)
新規作成画面から情報を入力して送信します。サーバー名等情報は思いついたものを適当に入力しました。
これで42台に増えましたので、AWSのAppFlowの画面から同じようにフローを実行します。

![flowsnow (99).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/af35a214-fc52-0ee0-7134-83a41771282e.png)
![flowsnow (100).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483933/0e095588-f548-abdc-1b68-25d89f241054.png)
結果がこちら。S3のバケットには新規でファイルが作成され、中身を見るとちゃんと先程のデータがきちんと追加されていますね。

## 構築も管理もめっちゃ楽
ServiceNowのデータ連携をするのに書いたコードは「ゼロ」です。わかりやすくマッピングしたり、データの精査にはCSVファイルを出力したりフィルターの設定をする必要がありますが、どちらにしてもコードを一切書かなくても良いのがメリットです。

ServiceNowは外部の連携ツールに[MIDサーバーを経由させる](https://docs.servicenow.com/bundle/london-servicenow-platform/page/product/mid-server/reference/r-MIDServer.html)のですが、構築するのが地味にめんどくさいです。~~そのためだけに作るのが面倒だったなんて言えない~~
AppFlowを使ってやると1時間もかからずに自動バックアップの仕組みを作れるので、便利だなーって感じました（小並感）