AWS Appflow で ServiceNow からデータを連携させる

# はじめに
AWS から Appflow というデータ連携の新しいサービスがリリースされましたね！
連携できるサービスの中に ServiceNow があったので、AWS & ServiceNow の有資格者としては早速試さないわけにはいかないので、簡単に実装してみました。

# 1.事前準備
## ServiceNow にてアカウントを作る。
何も見ずに早速 Appflow を作ろうとすると、こんな画面が出てきました。
<img width="300" alt="1-01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/a4de7ac7-3a34-0870-94ac-4de3a0670b6e.png">
まぁ、当たり前ですが、然るべき権限（role）を持ったユーザを指定してほしい、という事です。早速 ServiceNow で作りましょう。
ServiceNow のインスタンスは、Orland の Developer instance を使用しています。
<img width="300" alt="1-02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/b919d06a-0304-db5d-d4ab-b308db1287c4.png">
role は以下の2つと指定されたので、まずはそれでやってみましょう。

1. web_service_admin
2. rest_api_explorer

<img width="500" alt="1-03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/0f4e196f-d0ce-ba70-c054-5a46346a6c0b.png">

# 2. Appflow を作成する
## 2-1. Appflow の作成
じゃあ、準備完了したので早速作りましょうかね。
<img width="300" alt="2-1-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/aeda692e-f5eb-1a31-d988-53ec5435abfa.png">
<img width="500" alt="2-1-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/1ae2c235-2f97-974f-8c96-c4f10c0dd64e.png">
<img width="500" alt="2-1-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/135f7ca6-262d-0881-12c9-f73ed2df0d7a.png">
テーブルの指定が出てきました。まぁ当たり前ですね。っていうか、テーブルの参照権限（role）を`appflow_user`に付与していないのに出てくる、という事は、このテーブルは現在は固定値なんですね。テーブルから明らかですが、現在サポートしているのは、以下の2つだという事がわかります。

- CMDB
- ITSM

そのまま進んでみると、権限がなくて取れないエラーが起きますね。
<img width="400" alt="2-1-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/5f2cca6e-6f38-68bb-4520-44715757f8af.png">

## 2-2. ServiceNow で再権限付与
Incident を対象にしてみましょう。なので、`ITIL`をつける事にします。
<img width="400" alt="2-2-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/4beb9bc5-0411-3b9d-7578-17db2e0379b6.png">

でもやっぱりまだエラーです。
<img width="400" alt="2-2-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/5f2cca6e-6f38-68bb-4520-44715757f8af.png">

よくよく考えてみると、フィールドって書いてあるので、テーブルのカラム名を取得に行っているんじゃないかと想定。
ServiceNow 上では、テーブルのカラムは `sys_dictionary` というテーブルに保持しているため、そのアクセス権がないんじゃないかと想定されますね。早速 `personalize_dictionary` を付与しましょう。
<img width="500" alt="2-2-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/5b435592-3bba-226b-6d89-5166600551eb.png">

出来ました！
<img width="500" alt="2-2-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/b3a3206d-8fd1-167a-e12c-c1860c49f824.png">

## 2-3. Appflow 作成の続き
それでは続けていきましょう。
<img width="400" alt="2-3-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/56c2cfa7-256a-34fe-9e92-7ec6508116c0.png">

フィールドがマッピングされます。
<img width="400" alt="2-3-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/a5e5efdf-11b7-a44a-3465-d5603bc6305b.png">

作成完了！
![2020-04-26 103018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/58abe854-6b00-7592-279b-108cc4dc3246.png)

# 3. 動作確認
早速、動かしてみましょう。右上の `フローを実行` を押すと、実行され、完了すると以下の様になります。
<img width="400" alt="3-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/e9044e55-d1f1-d802-e343-137a68969489.png">

S3を見てみましょう。
<img width="400" alt="3-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/e793f2da-7f6f-9afa-8662-5bf3e955a892.png">
何かファイルが出来ていますね。

```bash:test-appflow/4d37c1d95cdbe26802f050b51695b4c2
{"business_stc":"28800","calendar_stc":"102197","caller_id":{"link":"https://devxxxxx.service-now.com/api/now/v2/table/sys_user/681ccaf9c0a8016400b98a06818d57c7","value":"681ccaf9c0a8016400b98a06818d57c7"},"category":"inquiry","caused_by":"","child_incidents":"0","close_code":"Solved (Permanently)","hold_reason":"","incident_state":"7","notify":"1","parent_incident":"","problem_id":"","reopened_by":"","reopened_time":"","reopen_count":"0","resolved_at":"2016-12-13 21:43:14","resolved_by":{"link":"https://devxxxxx.service-now.com/api/now/v2/table/sys_user/5137153cc611227c000bbd1bd8cd2007","value":"5137153cc611227c000bbd1bd8cd2007"},"rfc":"","severity":"3","subcategory":"email","sys_id":"1c741bd70b2322007518478d83673af3"}
{"business_stc":"1749949","calendar_stc":"7333549","caller_id":{"link":"https://devxxxxx.service-now.com/api/now/v2/table/sys_user/5137153cc611227c000bbd1bd8cd2006","value":"5137153cc611227c000bbd1bd8cd2006"},"category":"inquiry","caused_by":"","child_incidents":"","close_code":"Closed/Resolved by Caller","hold_reason":"","incident_state":"7","notify":"1","parent_incident":"","problem_id":"","reopened_by":"","reopened_time":"","reopen_count":"","resolved_at":"2019-09-05 19:56:12","resolved_by":{"link":"https://devxxxxx.service-now.com/api/now/v2/table/sys_user/6816f79cc0a8016401c5a33be04be441","value":"6816f79cc0a8016401c5a33be04be441"},"rfc":"","severity":"3","subcategory":"","sys_id":"46b66a40a9fe198101f243dfbc79033d"}
{"business_stc":"1864990","calendar_stc":"7851790","caller_id":{"link":"https://devxxxxx.service-now.com/api/now/v2/table/sys_user/5137153cc611227c000bbd1bd8cd2005","value":"5137153cc611227c000bbd1bd8cd2005"},"category":"database","caused_by":"","child_incidents":"","close_code":"Closed/Resolved by Caller","hold_reason":"","incident_state":"7","notify":"1","parent_incident":"","problem_id":"","reopened_by":"","reopened_time":"","reopen_count":"","resolved_at":"2019-09-05 19:56:12","resolved_by":{"link":"https://devxxxxx.service-now.com/api/now/v2/table/sys_user/6816f79cc0a8016401c5a33be04be441","value":"6816f79cc0a8016401c5a33be04be441"},"rfc":"","severity":"3","subcategory":"","sys_id":"46b9490da9fe1981003c938dab89bda3"}
{"business_stc":"1720500","calendar_stc":"7246500","caller_id":{"link":"https://devxxxxx.service-now.com/api/now/v2/table/sys_user/9ee1b13dc6112271007f9d0efdb69cd0","value":"9ee1b13dc6112271007f9d0efdb69cd0"},"category":"inquiry","caused_by":"","child_incidents":"","close_code":"Closed/Resolved by Caller","hold_reason":"","incident_state":"7","notify":"1","parent_incident":"","problem_id":"","reopened_by":"","reopened_time":"","reopen_count":"","resolved_at":"2019-09-05 19:56:12","resolved_by":{"link":"https://devxxxxx.service-now.com/api/now/v2/table/sys_user/6816f79cc0a8016401c5a33be04be441","value":"6816f79cc0a8016401c5a33be04be441"},"rfc":"","severity":"3","subcategory":"","sys_id":"46c03489a9fe19810148cd5b8cbf501e"}
～～～略～～～
```
連携されていますね！

# 4. Appflow のオプション機能(少し脱線)
右上の方に、`式を追加`と`値を変更`というボタンがありますので、押してみました。
<img width="600" alt="4-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/b9801598-7ee6-0e6e-37a2-e50ca9eb2002.png">

## 4-1. 式を追加
取得したカラム同士の数値演算や文字列連結が出来ます。
<img width="400" alt="4-1-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/d114b0e7-d65f-d9ed-6338-2843cc7f3d55.png">
試しに一番下の`連結`を押したらこうなります。
<img width="400" alt="4-1-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/2f9cc6ab-119c-1783-08be-2606cd2abdcf.png">
これは文字列として連結する事が出来るようです。

## 4-2. 値を変更
こちらは値をマスクしたり、文字列そのものではなく、文字数にしたりすることが可能です。
<img width="400" alt="4-2-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/eb1f3a30-6416-c860-e544-423a995a8ba7.png">
**値をマスクする**
<img width="400" alt="4-2-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/351ac50e-a4b9-e6ca-9de8-aab535ebcad2.png">
**テキスト値の切り捨て**
<img width="400" alt="4-2-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/2192a975-2315-8072-9a36-9b6d3e5c50c1.png">

# 5. 考察
さて、本題に戻ります。データが連携されたのはいいんですが…
例えば、ServiceNow のインシデントとしては割と重要な以下とかがないんですよね…

- short description
- description
- comments
- work_notes

まじまじと連携できるカラムを眺めてもやっぱりありません。
![2020-04-26 103021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/1d1f5e34-0bd6-eeec-473c-219256a4baea.png)

データ分析目的のデータ連携だから、という話なのかもしれません。
また、`Problem` などは取れてはいますが、SYS_ID で取れている状態なので、分析するにしても Lookup で実レコードの値を持ってきたいですよね。
『それは `Redshift` でやる』というのもまぁ当然の意見としてはありますが、`Flow Designer` + `Database view`の方が楽なのでは？という場合もあるでしょうから、やりたい事に対して、いくつか方式案を検討した方がよさそうですね。
まだ機能の出始めという事ですし、データ連携は結構煩わしい箇所なので、それをGUIベースで簡単に出来るようにしたのは良いと思います。今後に期待しています。