AWSの新サービス「Amazon AppFlow」でSaaS-AWS間のデータ連携を試してみた

# はじめに
2020/4/23にAWSの新たなサービスとして**Amazon AppFlow**なるものが登場しました。
このサービスを検証し、どんな使い道やメリットがあるのかを探ってみました。

# 更新履歴
2020/4/23 : 初版。サービスリリースに合わせて執筆
**2020/9/15 : 更新。S3に出力可能なファイルのフォーマットに、JSONに加えて新たにCSVとParquetが指定可能に**

# Amazon AppFlowとは?
まずは、公式サイトの英文を翻訳して紐解いてみます。
https://aws.amazon.com/jp/appflow/

※引用
>Amazon AppFlowは、**Salesforce、Marketo、Slack、ServiceNowなどのSoftware-as-a-Service（SaaS）アプリケーションと、Amazon S3やAmazon RedshiftなどのAWSサービスとの間で、数回のクリック操作によりデータを安全に転送**できる、フルマネージド統合サービスです。 
AppFlowを使用すると、選択した頻度でほぼすべての規模でデータフローを実行できます。頻度はスケジュール、ビジネスイベントへの応答、またはオンデマンドとなります。
AppFlowには、**マッピング、マージ、マスキング、フィルタリング、検証などの強力なデータ変換機能**が含まれており、追加の手順なしで、フローの構成要素としてすぐに使用できる豊富なデータを生成できます。
AppFlowは、移動中の**データを自動的に暗号化**し、ユーザーがAWS PrivateLinkと統合されているSaaSアプリケーションのパブリックインターネット経由でデータが流れるのを制限でき、セキュリティの脅威への露出を減らします。

>AppFlowは、**データのソースとしてAmazon S3および13 SaaSアプリケーションをサポートし、宛先としてAmazon S3、Amazon Redshift、Salesforce、およびSnowflakeをサポート**します。詳細については、AppFlowのインテグレーションページにアクセスしてください。

>AppFlowを使用するための前払い料金や料金はありません。お客様は、実行するフローの数と処理されるデータの量に対してのみ支払います。

>AWSマネジメントコンソールを使用すると、AppFlowを数分で開始できます。データソースと宛先を選択し、フロートリガーを指定し、フィールドをマップし、データ変換または検証を追加してから、フローを実行します。

>AppFlowは現在、一般的に次のリージョンで利用可能です：米国東部（バージニア北部）、米国東部（オハイオ）、米国西部（北カリフォルニア）、米国西部（オレゴン）、カナダ（中央）、アジア太平洋（シンガポール）、アジア太平洋（東洋）、アジアパシフィック（シドニー）、アジアパシフィック（ソウル）、アジアパシフィック（ムンバイ）、ヨーロッパ（パリ）、ヨーロッパ（フランクフルト）、ヨーロッパ（ロンドン）、南アメリカ（サンパウロ）。

上記を読むと、本質的には、サードパーティのSaaSとAWSのマネージドサービスの間でデータを安全に送信 (連携) できることがポイントのようです。
また、SaaS間連携にも使え、例えば**Salesforce to Salesforce**などが可能となるようです。

# AppFlowを設定してみる
イメージや特徴を掴むために、まずはとにかく触ってみようということで、試してみます。

AWSマネジメントコンソールにアクセスします。
https://ap-northeast-1.console.aws.amazon.com/appflow/home?region=ap-northeast-1#/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/14f7f2ab-b028-5ad9-29a9-d13e4cfab680.png)

「フローの作成」を押すと、すぐにウィザードが開くので、基礎情報を入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/4d389b8e-31df-e89a-65dd-d516a7b1c0eb.png)

暗号化オプションとタグを指定します。
ここまではあまり難しくありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/afb2276e-66fb-9342-a06a-49229181fe87.png)

次にデータの送信元を選びます。
ここではSlackとしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/35393bd9-1b46-c9d9-7bf3-c35755982403.png)

Slackを選んだ後、サービスとの接続を行います。
親切に設定方法が書いてあるので、楽々です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/872de1a3-5e9c-4429-3dff-71657d0661a5.png)

もしSlackでアプリを1つも作っていない場合は、ここでテスト用で構わないのでアプリを1つ作っておきます。
以下URLにアクセスして、右上の「Your Apps」を押し、設定します。
https://api.slack.com/apps

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/d8f2ffef-3c36-605f-10cb-5385abd0f563.png width=600px>

Amazon AppFlowとSlackの間は、OAuthで認証するようなので、アプリを作った後にOAuthの設定をします。
画像のURLが途中で切れていますが「**https://ap-northeast-1.console.aws.amazon.com/appflow/oauth**」を入力します。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/739fb40f-92fa-1f99-81d8-85a8d538e65e.png width=600px>

入力後、AppFlowがアクセスできるSlackの情報について聞かれるため、確認して許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/0e8f2035-62f8-74cd-b574-d4ae3c2aa24b.png)

認証が完了すると、送信元の情報やチャネルを入力できますので設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/0720ba63-9dd1-26b1-c0a0-95026669fcb6.png)

次に、送信先を選びます。
今回はAmazon S3を選んでみます。
S3はバケット以下のパスを指定するだけなので楽々です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/4a1fa93a-3b03-7185-189f-d570d14641fe.png)

**2020/9/15追記** : この画面で「その他の設定」を開くと、出力されるファイルのフォーマットなどが選択できます。
2020/9/14のアップデートで、S3に出力する際のファイルのフォーマットをJSON、CSV、Parquetから選択できるようになっています。
今回は、JSONを選んで次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/0a9edc85-2b63-1470-5cd7-8b2cfda8306a.png)


次にフローの実行方法について選びます。
3パターンありますが、今回はオンデマンドを選んでみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/768556a3-42b8-efc4-34a4-065789bb8a03.png)

次の画面では、データフィールドのマッピングを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/879839b5-411a-fbf2-e2d9-65a837f44b2d.png)

プルダウンを開くと、送信元のSaaS (Slack) で持つデータのフィールド名が列挙されています。
とりあえず全部選んでみると、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/6b295c34-c1fd-2572-cfe3-d195025eeaf3.png)

「フィールドを直接マッピングする」を押すと、マッピングの結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/55120a14-f7bc-face-c2fb-9ef85b9864ee.png)

ここで、フィールドごとに値をどう処理するかを設定できます。
例えば「値をマスクする」を選ぶと、そのフィールドの値はすべて * (アスタリスク) で置換されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/77d97fc3-d5de-cffc-4086-6ae43739f5f4.png)
この設定を活用すると、例えば**個人情報を含むフィールドだけをマスキングして送信する**といったことが可能となります。

また、複数のフィールドを選んで結合することもできます。
(以下は適当に試してみた図)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/5d92702f-eb45-f6d6-de95-a22a25479496.png)

さらに、データの値のチェックもでき、特定のフィールドに値が入っていない時にスキップしたりできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/9e869b6e-8a3a-5fe1-e4f2-a4ec43a30778.png)

フィルターで条件も指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/74ea857f-4767-38bc-1daf-f5b7f8ef5a26.png)

最後に設定内容を確認し、フローを作成すると、以下の通り出来上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/6d63306a-d77f-4201-7206-1884b367ed7a.png)

# 送信元SaaSにデータを用意
今回、送信元をSlackにしましたので、Slackに適当に会話を書き込んでおきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/155db36e-a8f5-c07e-0383-19a16122d109.png)

# AppFlowのフローを実行
フローを実行してみます。
実行が完了すると、緑背景で結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/b535c1bd-9ab9-d53c-4b62-dd580a751304.png)

フローの実行が完了すると、SlackからS3にデータが送信 (出力) されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/478f4d02-76f0-d6c0-f785-8ec5b48171ef.png)

S3に送信されたデータを開くと、先に指定していた通り、JSON形式でデータが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/6bc653c2-4bc3-ad6e-6f24-4462be034245.png)

以上のように、AppFlowを使って、SaaSからAWSマネージドサービスにデータを送信できました。

# 考えられる使い道の例
* Webサイトのアクセスデータをエクスポート、加工、分析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/a1c87f15-3d84-0d40-1056-d90857622d9d.png)

* 営業データのエクスポート、加工、分析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/1fced72d-eb73-be37-e447-5e839a484cd5.png)

* 既にS3に存在するデータを、規則的に一括変換 (ソースにcsv縛り有)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/5e26ce2b-5878-46ad-b25d-05b522bd550d.png)


# まとめ
AppFlowは、サービス間のデータ連携に使うブローカーのような役割と言えそうです。

上記の手順を振り返っても分かるように、非常に簡単にデータ連携ができるようになります。

また、注目すべきは、単なる連携だけではなく、データのマスキングや切り捨てが容易であり、これらの処理にプログラムでの作りこみが不要になる点でしょう。
この点は、公共や金融等の、個人情報等の取り扱いが大変厳しく、データの性質に応じて保管基準・方法が厳格に分けられている業界やシステムにおいて、非常に重宝しそうです。

また、SaaSが持っているデータをS3に持ってくることができれば、その後Athena、Glue、QuickSight等を使って、分析・可視化も簡単にできます。

AppFlowを使いこなすことで、SaaSとAWSをまたぐデータの取り扱いも、安全性や機密性等を確保しつつ、よりスピーディーに構築できそうです。

# 参考文献
* [Amazon AppFlow](https://aws.amazon.com/jp/appflow/)
* [Amazon AppFlow Documentation](https://docs.aws.amazon.com/appflow/index.html)
* [Amazon AppFlow now supports new data formats for ingesting files into Amazon S3](https://aws.amazon.com/about-aws/whats-new/2020/09/amazon-appflow-supports-new-data-formats-ingesting-flies-amazon-s3/) (2020/9/14)