Amazon AppFlow カスタムコネクタで Slack から MySQL にデータ転送してみた

送信元が Slack であることに特に意味はありませんが、AppFlow で MySQL にデータ転送してみました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンバンハ、千葉(幸)です。

ここしばらく Amazon AppFlow でのデータ転送を何パターンか試しています。

標準で用意されているコネクタでは MySQL を送信元/先に指定できないのですが、独自の Lambda 関数を用意しカスタムコネクタとして使用することで実現できるようになります。

カスタムコネクタ用 Lambda 関数のサンプルが以下で提供されており、これを送信元として試したことがありました。

これを送信先として指定した場合にはどういった挙動になるのだろう?というのが気になったので、今回はそれを試してみます。

MySQL → MySQL がメジャーな使い方として想定されていそうなのですが、少しズラして Slack から転送してみます。実用性はあまり思いついていないです。(転送も一応成功したもののあまりバッチリな内容になっていないです。)

今回作成する構成

以下のイメージで構成します。Slack を送信元、Aurora MySQL を送信先とする AppFlow フローを作成しデータ転送を行います。

これまで試してきた内容で再利用できるパーツはなるべく再利用していきます。

なお、今回はネットワーク的には以下構成で行います。

  • Aurora DB クラスターはパブリックアクセス可能
  • Lambda 関数は VPC との関連付けなし

VPC Lambda で構成したい場合にはいくつか注意点がありますので以下をご参考ください。

1. Slack 用のコネクタプロパティの準備

以下エントリで作成したコネクタプロパティ(接続)を再利用します。

接続作成前には Slack 側でアプリの設定や OAuth、パーミッションの設定などが必要ですので上記のエントリをご参考ください。

以下のTestConnectを使っていきます。

Appflow_slack_property_Amazon_AppFlow

2. MySQL 用のカスタムコネクタプロパティの作成

いくつかの段階に分けて確認していきます。

2.1. Lambda 関数の準備

カスタムコネクタに関連付ける Lambda 関数を準備します。冒頭で載せたリポジトリにあるものをデプロイすることで実現できます。

これも以下エントリで作成したものを再利用します。

SAM でデプロイすることが想定されているので、そのセットアップの部分から手順を載せてあります。ご参考ください。

2.2 接続先 Aurora DB クラスターの準備

以下の設定で Aurora DB クラスターを作成しました。

  • エンジンバージョン:8.0.mysql_aurora.3.02.1
  • パブリックアクセス:有効
  • SecuriryGroup:0.0.0.0/0から 3306 ポートへのインバウンドを許可
    • 今回は検証なので広めに開けましたが真似しないでください!

2.1 の Lambda 関数からこの DB クラスターにアクセスできる必要があるのでネットワーク経路や SecuriryGroup の設定を意識してください。

DB に接続し、slackdbデータベースを作成します。

$ mysql -h database-1.cluster-xxxxxxxr0und.ap-northeast-1.rds.amazonaws.com -u username -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 33
Server version: 8.0.23 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> create database slackdb;                                                                                                         
Query OK, 1 row affected (0.01 sec)

AppFlow フロー作成時にデータフィールドのマッピングをする必要があり、その際にテーブルにカラムが存在する必要があります。

今回送信元となる Slack のデータフィールドはこのようになっています。(どこかドキュメントから確認できるのかも知れませんが、見つけられなかったのでマネジメントコンソールから確認しました。)

送信元フィールド データ型
Attachments object
Bot Id string
Blocks object
Client Message Id string
Is Starred boolean
Last Read string
Latest Reply string
Reactions object
Replies object
Reply Count integer
Reply Users object
Reply Users Count integer
Subscribed boolean
Subtype string
Text string
Team string
Thread Timestamp string
Timestamp string
Type string
User string

カラム名やデータ型を上記に似せてテーブルを作成します。(結果的にこれだ不都合が生じることが後で分かるのですが……)

create table slacktable (
id INT AUTO_INCREMENT PRIMARY KEY,
Attachments JSON,
Bot_Id TEXT,
Blocks JSON,
Client_Message_Id TEXT,
Is_Starred BOOLEAN,
Last_Read TEXT,
Latest_Reply TEXT,
Reactions JSON,
Replies JSON,
Reply_Count INT,
Reply_Users JSON,
Reply_Users_Count INT,
Subscribed BOOLEAN,
Subtype TEXT,
Text TEXT,
Team TEXT,
Thread_Timestamp TEXT,
Timestamp TEXT,
Type TEXT,
User TEXT
);

slackdbデータベース内にslacktableテーブルが作成できました。

MySQL [(none)]> use slackdb
Database changed
MySQL [slackdb]> create table slacktable (
    -> id INT AUTO_INCREMENT PRIMARY KEY,
    -> Attachments JSON,
    -> Bot_Id TEXT,
    -> Blocks JSON,
    -> Client_Message_Id TEXT,
    -> Is_Starred BOOLEAN,
    -> Last_Read TEXT,
    -> Latest_Reply TEXT,
    -> Reactions JSON,
    -> Replies JSON,
    -> Reply_Count INT,
    -> Reply_Users JSON,
    -> Reply_Users_Count INT,
    -> Subscribed BOOLEAN,
    -> Text TEXT,
    -> Team TEXT,
    -> Thread_Timestamp TEXT,
    -> Timestamp TEXT,
    -> Type TEXT,
    -> User TEXT
    -> );
Query OK, 0 rows affected (0.03 sec) 

MySQL [slackdb]> show columns from slacktable;
+-------------------+------------+------+-----+---------+----------------+
| Field             | Type       | Null | Key | Default | Extra          |
+-------------------+------------+------+-----+---------+----------------+
| id                | int        | NO   | PRI | NULL    | auto_increment |
| Attachments       | json       | YES  |     | NULL    |                |
| Bot_Id            | text       | YES  |     | NULL    |                |
| Blocks            | json       | YES  |     | NULL    |                |
| Client_Message_Id | text       | YES  |     | NULL    |                |
| Is_Starred        | tinyint(1) | YES  |     | NULL    |                |
| Last_Read         | text       | YES  |     | NULL    |                |
| Latest_Reply      | text       | YES  |     | NULL    |                |
| Reactions         | json       | YES  |     | NULL    |                |
| Replies           | json       | YES  |     | NULL    |                |
| Reply_Count       | int        | YES  |     | NULL    |                |
| Reply_Users       | json       | YES  |     | NULL    |                |
| Reply_Users_Count | int        | YES  |     | NULL    |                |
| Subscribed        | tinyint(1) | YES  |     | NULL    |                |
| Subtype           | text       | YES  |     | NULL    |                |
| Text              | text       | YES  |     | NULL    |                |
| Team              | text       | YES  |     | NULL    |                |
| Thread_Timestamp  | text       | YES  |     | NULL    |                |
| Timestamp         | text       | YES  |     | NULL    |                |
| Type              | text       | YES  |     | NULL    |                |
| User              | text       | YES  |     | NULL    |                |
+-------------------+------------+------+-----+---------+----------------+
21 rows in set (0.00 sec)

2.3. カスタムコネクタプロパティの作成

AppFlow コンソールの「コネクタ」から「新しいコネクタを登録」を押下し、登録を進めます。2.1. の Lambda 関数を指定し、ラベルに適当な名前(今回はjdbc)を入力して登録します。

Appflow_jdbc_register_Amazon_AppFlow

コネクタの画面、もしくは「接続」の画面から接続(コネクタプロパティ)を作成していきます。

Appflow_jdbc_connector_profile_Amazon_AppFlow

各種情報を入力し、「接続する」を押下します。

項目 説明
Driver 今回使用するコネクタでは mysql のみ
Hostname DB クラスターの接続エンドポイント
Port ポート番号
Username DB ユーザー名
Password DB ユーザーのパスワード
Database Name データベース名
接続名 接続(コネクタプロパティ)名

AppFlow_jdbc-connector_create_Amazon_AppFlow

jdbc-connectorという名称でコネクタプロパティが作成されました。

Appflow_jdbc_connctor_create_Amazon_AppFlow

ちなみに「接続する」というボタンを押しましたが、この段階で実際に DB クラスターに接続している訳ではありません。(なのでこのタイミングで間違った接続情報を入力していてもコネクタプロパティは正常に作成されます。)

3. AppFlow フローを作成する

送信元・送信先それぞれのコネクタプロパティが用意できたのでフローを作成していきます。

AppFlow コンソールの「フロー」から「フローを作成」を押下します。手順 1 でフロー名を入力し、次に進みます。

Appflow_slack_to_mysql_Amazon_AppFlow

手順2 でまずは送信元を指定します。Slack 用の接続を選択した上で、他の項目も選択します。

  • Slack オブジェクト:2022/11時点でConversationsが唯一の選択肢
  • Slack チャネル:書き込みを収集したい Slack チャンネル

AppFlow_connector_source_slack_Amazon_AppFlow

続いて送信先を指定します。カスタムコネクタプロファイルを指定した上で、以下を選択します。

  • API バージョン:このコネクタの状態だとv1が唯一の選択肢
  • {コネクタ名}オブジェクト:テーブルを選択(DB内に存在するテーブルが読み込まれる)

AppFLow_destination_flow_Amazon_AppFlow

エラー処理、フロートリガーを指定して次に進みます。

AppFLow_error_hundling_flow_trriger_Amazon_AppFlow

手順 3 でデータフィールドのマッピングを指定します。

まずはマッピング方法とデータの処理方法です。今回はどちらもデフォルトにします。

AppFLow_data_mapping_Amazon_AppFlow

続いてフィールドのマッピングです。送信元フィールド名から「すべてのフールドを直接マッピングする」を押下します。

Appflow_mapping_data_Amazon_AppFlow

Slack のフィールドが表示され、それに対応する送信先フィールド(今回で言えば接続先 DB のカラム)を設定していきます。

(余談ですが今回のテーブルでは先頭にidというカラムを作っていたので、一個ずつずれて表示されており指定し直すのが大変でした。)

Appflow_data_mapping

フィールドごとにマスク・切り捨てといった値の変更も可能です。今回は特に変更はしません。

Appflow_datamapping_changevalue_Amazon_AppFlow

妥当性確認(バリデーション)も特に指定せず次に進みます。

AppFLow_Validation_no_Amazon_AppFlow

手順4ではフィルターが追加できますが、特に何もせず次に進みます。

AppFLow_filter_no_Amazon_AppFlow

次の「手順5」で最終確認をして作成すればフローの完成です。

4. フローの実行

作成できたフローを早速実行します。

AppFlow_run_flow_slack_Amazon_AppFlow

失敗しました。

slack-to-mysql からエラーを受け取りました

Amazon AppFlow received the following error: The request failed because the service Destination JDBCConnector returned the following error: Details: Connector failed with error Unhandled.

Appflow_run_Amazon_AppFlow

ひとまず送信先の DB のテーブルを覗いてみると、全量ではないものの何らかデータは転送できていそうです。

MySQL [slackdb]> select * from slacktable;
+----+-------------+--------+--------+--------------------------------------+------------+-----------+--------------+-----------+---------+-------------+-------------+-------------------+------------+------------------+-------------------------------------------------------------------------------------------+-------------+-------------------+-------------------+---------+-------------+
| id | Attachments | Bot_Id | Blocks | Client_Message_Id                    | Is_Starred | Last_Read | Latest_Reply | Reactions | Replies | Reply_Count | Reply_Users | Reply_Users_Count | Subscribed | Subtype          | Text                                                                                      | Team        | Thread_Timestamp  | Timestamp         | Type    | User        |
+----+-------------+--------+--------+--------------------------------------+------------+-----------+--------------+-----------+---------+-------------+-------------+-------------------+------------+------------------+-------------------------------------------------------------------------------------------+-------------+-------------------+-------------------+---------+-------------+
|  1 | NULL        | NULL   | null   | 20d50577-5e01-48b7-be07-c740c3e3e5de |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | NULL             | u30B3u30B1u30FC                                                                           | NULL        | NULL              | 1668445059.725439 | message | U04A4K1NRT3 |
|  2 | NULL        | NULL   | null   | 28fe097a-0d2b-4fbf-b55c-f890e59a99bf |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | NULL             | <!here> u30C6u30B9u30C8                                                                   | T04AFLPMR16 | NULL              | 1668445027.664479 | message | U04A4K1NRT3 |
|  3 | NULL        | NULL   | null   | 58810e95-aa04-402a-8a2f-f160a933e9bf |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | thread_broadcast | u2022 u3042u3042
u2022 u3042u3042u3042
u2022 u3042u3042u3042u3042                         | NULL        | 1668444956.382429 | 1668444995.627219 | message | U04A4K1NRT3 |
|  4 | NULL        | NULL   | null   | 35186ecd-1860-4fff-8b6e-b93018f1d182 |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | NULL             | ~u30C6u30B9u30C8~                                                                         | T04AFLPMR16 | NULL              | 1668444967.128749 | message | U04A4K1NRT3 |
|  5 | NULL        | NULL   | null   | aa74684e-b3b5-4c66-b946-6da53bab4344 |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | NULL             | *u30C6u30B9u30C8*                                                                         | T04AFLPMR16 | NULL              | 1668444951.573549 | message | U04A4K1NRT3 |
|  6 | NULL        | NULL   | null   | 92a5e3e2-0d50-4711-8c4d-02d2baf5b9d4 |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | NULL             | `test`                                                                                    | T04AFLPMR16 | NULL              | 1668444945.654789 | message | U04A4K1NRT3 |
|  7 | null        | NULL   | null   | ac907ff5-c12b-4757-ac85-7a256a1fb74f |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | NULL             | <https://dev.classmethod.jp/articles/amazon-appflow-beginning-slack-to-s3/>               | T04AFLPMR16 | NULL              | 1668444927.289839 | message | U04A4K1NRT3 |
|  8 | NULL        | NULL   | null   | 70c4fd9c-62e4-4fdd-a076-9570394bffc6 |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | NULL             | ```hogehogehoge```                                                                        | T04AFLPMR16 | NULL              | 1668444898.505249 | message | U04A4K1NRT3 |
|  9 | NULL        | NULL   | null   | 7ea5bc4f-8ac3-405d-8024-af315b253cb5 |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | NULL             | :bow:                                                                                     | T04AFLPMR16 | NULL              | 1668444887.429069 | message | U04A4K1NRT3 |
| 10 | NULL        | NULL   | null   | 9f75e39d-3c7a-4c63-9206-0fa9ad39ec58 |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | NULL             | u30C6u30B9u30C8u66F8u304Du8FBCu307Fu3067u3059                                             | T04AFLPMR16 | NULL              | 1667820261.475789 | message | U04A4K1NRT3 |
| 11 | NULL        | NULL   | null   | 4def0244-af04-4e95-8dc9-e5c0a98d23ac |       NULL | NULL      | NULL         | null      | NULL    |        NULL | NULL        |              NULL |       NULL | NULL             | u30C6u30B9u30C8u66F8u304Du8FBCu307F                                                       | T04AFLPMR16 | NULL              | 1667820254.200019 | message | U04A4K1NRT3 |
| 12 | NULL        | NULL   | NULL   | NULL                                 |       NULL | NULL      | NULL         | NULL      | NULL    |        NULL | NULL        |              NULL |       NULL | channel_join     | <@U04A4K1NRT3>u3055u3093u304Cu30C1u30E3u30F3u30CDu30EBu306Bu53C2u52A0u3057u307Eu3057u305F | NULL        | NULL              | 1667815968.901369 | message | U04A4K1NRT3 |
+----+-------------+--------+--------+--------------------------------------+------------+-----------+--------------+-----------+---------+-------------+-------------+-------------------+------------+------------------+-------------------------------------------------------------------------------------------+-------------+-------------------+-------------------+---------+-------------+
12 rows in set (0.00 sec)

そしてカスタムコネクタ用 Lambda 関数の実行ログを確認すると、以下のエラーが記録されていました。カラムでデータ型にINTを指定していたものの null が入ってきてしまったようです。

15:30:28.780 [main] ERROR org.custom.connector.jdbc.client.MySQLClient - Error msg: Incorrect integer value: 'null' for column 'Reply_Count' at row 1

とりあえずガサッとカラムを削ってみるか、と適当な項目だけ残してテーブルを作り直します。

create table slacktable (
Id INT AUTO_INCREMENT PRIMARY KEY,
Attachments TEXT,
Blocks JSON,
Client_Message_Id TEXT,
Is_Starred TEXT,
Last_Read TEXT,
Reactions TEXT,
Text TEXT,
Timestamp TEXT,
Type TEXT,
User TEXT
);

それに合わせてフローで定義済みのデータマッピングも修正します。

AppFlow_mapping_fileld_Amazon_AppFlow

その状態でフローを再実行すると、正常に完了しました。特にコネクタやフローの自体は作り直さなくともいい感じにやってくれました。

AppFlow_success_Amazon_AppFlow

完了後のテーブルの状態はこんな感じ。NULL が結構多いですね……

MySQL [slackdb]> select * from slacktable;
+----+-------------+--------+--------------------------------------+------------+-------------------+-----------+-------------------------------------------------------------------------------------------+-------------------+---------+-------------+
| Id | Attachments | Blocks | Client_Message_Id                    | Is_Starred | Last_Read         | Reactions | Text                                                                                      | Timestamp         | Type    | User        |
+----+-------------+--------+--------------------------------------+------------+-------------------+-----------+-------------------------------------------------------------------------------------------+-------------------+---------+-------------+
|  1 | NULL        | null   | 20d50577-5e01-48b7-be07-c740c3e3e5de | NULL       | NULL              | NULL      | u30B3u30B1u30FC                                                                           | 1668445059.725439 | message | U04A4K1NRT3 |
|  2 | NULL        | null   | 28fe097a-0d2b-4fbf-b55c-f890e59a99bf | NULL       | NULL              | NULL      | <!here> u30C6u30B9u30C8                                                                   | 1668445027.664479 | message | U04A4K1NRT3 |
|  3 | NULL        | null   | 58810e95-aa04-402a-8a2f-f160a933e9bf | NULL       | NULL              | NULL      | u2022 u3042u3042
u2022 u3042u3042u3042
u2022 u3042u3042u3042u3042                         | 1668444995.627219 | message | U04A4K1NRT3 |
|  4 | NULL        | null   | 35186ecd-1860-4fff-8b6e-b93018f1d182 | NULL       | NULL              | NULL      | ~u30C6u30B9u30C8~                                                                         | 1668444967.128749 | message | U04A4K1NRT3 |
|  5 | NULL        | null   | fe1247fb-4e91-4aad-b7ab-43515990da20 | NULL       | 1668444995.627219 | NULL      | _u30C6u30B9u30C8_                                                                         | 1668444956.382429 | message | U04A4K1NRT3 |
|  6 | NULL        | null   | aa74684e-b3b5-4c66-b946-6da53bab4344 | NULL       | NULL              | NULL      | *u30C6u30B9u30C8*                                                                         | 1668444951.573549 | message | U04A4K1NRT3 |
|  7 | NULL        | null   | 92a5e3e2-0d50-4711-8c4d-02d2baf5b9d4 | NULL       | NULL              | NULL      | `test`                                                                                    | 1668444945.654789 | message | U04A4K1NRT3 |
|  8 | null        | null   | ac907ff5-c12b-4757-ac85-7a256a1fb74f | NULL       | NULL              | NULL      | <https://dev.classmethod.jp/articles/amazon-appflow-beginning-slack-to-s3/>               | 1668444927.289839 | message | U04A4K1NRT3 |
|  9 | NULL        | null   | 70c4fd9c-62e4-4fdd-a076-9570394bffc6 | NULL       | NULL              | NULL      | ```hogehogehoge```                                                                        | 1668444898.505249 | message | U04A4K1NRT3 |
| 10 | NULL        | null   | 7ea5bc4f-8ac3-405d-8024-af315b253cb5 | NULL       | NULL              | NULL      | :bow:                                                                                     | 1668444887.429069 | message | U04A4K1NRT3 |
| 11 | NULL        | null   | 9f75e39d-3c7a-4c63-9206-0fa9ad39ec58 | NULL       | NULL              | NULL      | u30C6u30B9u30C8u66F8u304Du8FBCu307Fu3067u3059                                             | 1667820261.475789 | message | U04A4K1NRT3 |
| 12 | NULL        | null   | 4def0244-af04-4e95-8dc9-e5c0a98d23ac | NULL       | NULL              | null      | u30C6u30B9u30C8u66F8u304Du8FBCu307F                                                       | 1667820254.200019 | message | U04A4K1NRT3 |
| 13 | NULL        | NULL   | NULL                                 | NULL       | NULL              | NULL      | <@U04A4K1NRT3>u3055u3093u304Cu30C1u30E3u30F3u30CDu30EBu306Bu53C2u52A0u3057u307Eu3057u305F | 1667815968.901369 | message | U04A4K1NRT3 |
+----+-------------+--------+--------------------------------------+------------+-------------------+-----------+-------------------------------------------------------------------------------------------+-------------------+---------+-------------+
13 rows in set (0.00 sec)

このあたりはどういうデータ構造なのかの深掘りの余地がありそうですが、ひとまず最低限データ転送が完了したということで満足したので切り上げることにしました。

終わりに

AppFlow カスタムコネクタで MySQL へデータ転送してみました。

少なくとも Slack からのデータ転送はあまり使い道がなさそうな気がします。(S3 に出力した方が使い回しが効きそう。) MySQL → MySQL へのデータ転送であれば比較的お手軽なデータ移行の選択肢して使えるかも知れません。

今回は「事前にデータフィールドに対応したカラムを用意しておく必要があること」「コンポーネント間のデータ型の違いを意識しておく必要があること」を学びました。

以上、 チバユキ (@batchicchi) がお送りしました。

おまけ:Slack から送信されるデータ

今回は Slack → MySQL でデータ転送しましたが、Slack → S3 にデータ転送(CSV形式)した結果を添付します。

送信対象の Slack チャンネルはこんな感じ。

これをデータ転送するとこんな内訳になりました。

"attachments","bot_id","blocks","client_msg_id","is_starred","last_read","latest_reply","reactions","replies","reply_count","reply_users","reply_users_count","subscribed","subtype","text","team","thread_ts","ts","type","user"
,,"[{""type"":""rich_text"",""block_id"":""LEu"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""text"",""text"":""コケー""}]}]}]","20d50577-5e01-48b7-be07-c740c3e3e5de",,,,,,,,,,,"コケー",,,"1668445059.725439","message","U04A4K1NRT3"
,,"[{""type"":""rich_text"",""block_id"":""52ZnK"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""broadcast"",""range"":""here""},{""type"":""text"",""text"":"" テスト""}]}]}]","28fe097a-0d2b-4fbf-b55c-f890e59a99bf",,,,,,,,,,,"<!here> テスト","T04AFLPMR16",,"1668445027.664479","message","U04A4K1NRT3"
,,"[{""type"":""rich_text"",""block_id"":""gqNh"",""elements"":[{""type"":""rich_text_list"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""text"",""text"":""ああ""}]},{""type"":""rich_text_section"",""elements"":[{""type"":""text"",""text"":""あああ""}]},{""type"":""rich_text_section"",""elements"":[{""type"":""text"",""text"":""ああああ""}]}],""style"":""bullet"",""indent"":0,""border"":0}]}]","58810e95-aa04-402a-8a2f-f160a933e9bf",,,,,,,,,,"thread_broadcast","• ああ
• あああ
• ああああ",,"1668444956.382429","1668444995.627219","message","U04A4K1NRT3"
,,"[{""type"":""rich_text"",""block_id"":""EAc"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""text"",""text"":""テスト"",""style"":{""strike"":true}}]}]}]","35186ecd-1860-4fff-8b6e-b93018f1d182",,,,,,,,,,,"~テスト~","T04AFLPMR16",,"1668444967.128749","message","U04A4K1NRT3"
,,"[{""type"":""rich_text"",""block_id"":""wcvLZ"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""text"",""text"":""テスト"",""style"":{""italic"":true}}]}]}]","fe1247fb-4e91-4aad-b7ab-43515990da20",,"1668444995.627219","1668444995.627219",,,"1","[""U04A4K1NRT3""]","1","true",,"_テスト_","T04AFLPMR16","1668444956.382429","1668444956.382429","message","U04A4K1NRT3"
,,"[{""type"":""rich_text"",""block_id"":""ilG"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""text"",""text"":""テスト"",""style"":{""bold"":true}}]}]}]","aa74684e-b3b5-4c66-b946-6da53bab4344",,,,,,,,,,,"*テスト*","T04AFLPMR16",,"1668444951.573549","message","U04A4K1NRT3"
,,"[{""type"":""rich_text"",""block_id"":""Ldg7"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""text"",""text"":""test"",""style"":{""code"":true}}]}]}]","92a5e3e2-0d50-4711-8c4d-02d2baf5b9d4",,,,,,,,,,,"`test`","T04AFLPMR16",,"1668444945.654789","message","U04A4K1NRT3"
"[{""from_url"":""https://dev.classmethod.jp/articles/amazon-appflow-beginning-slack-to-s3/"",""image_url"":""https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2022/08/amazon-appflow.png"",""image_width"":476,""image_height"":250,""image_bytes"":70755,""service_icon"":""https://dev.classmethod.jp/apple-touch-icon.png"",""id"":1,""original_url"":""https://dev.classmethod.jp/articles/amazon-appflow-beginning-slack-to-s3/"",""fallback"":""クラスメソッド発「やってみた」系技術メディア | DevelopersIO: Amazon AppFlow 入門として Slack から S3 へデータをロードするフローを作ってみた | DevelopersIO"",""text"":""Amazon AppFlow を完全に理解しました。"",""title"":""Amazon AppFlow 入門として Slack から S3 へデータをロードするフローを作ってみた | DevelopersIO"",""title_link"":""https://dev.classmethod.jp/articles/amazon-appflow-beginning-slack-to-s3/"",""service_name"":""クラスメソッド発「やってみた」系技術メディア | DevelopersIO""}]",,"[{""type"":""rich_text"",""block_id"":""78URr"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""link"",""url"":""https://dev.classmethod.jp/articles/amazon-appflow-beginning-slack-to-s3/""}]}]}]","ac907ff5-c12b-4757-ac85-7a256a1fb74f",,,,,,,,,,,"<https://dev.classmethod.jp/articles/amazon-appflow-beginning-slack-to-s3/>","T04AFLPMR16",,"1668444927.289839","message","U04A4K1NRT3"
,,"[{""type"":""rich_text"",""block_id"":""4uS"",""elements"":[{""type"":""rich_text_preformatted"",""elements"":[{""type"":""text"",""text"":""hogehogehoge""}],""border"":0}]}]","70c4fd9c-62e4-4fdd-a076-9570394bffc6",,,,,,,,,,,"```hogehogehoge```","T04AFLPMR16",,"1668444898.505249","message","U04A4K1NRT3"
,,"[{""type"":""rich_text"",""block_id"":""ILA"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""emoji"",""name"":""bow"",""unicode"":""1f647""}]}]}]","7ea5bc4f-8ac3-405d-8024-af315b253cb5",,,,,,,,,,,":bow:","T04AFLPMR16",,"1668444887.429069","message","U04A4K1NRT3"
,,"[{""type"":""rich_text"",""block_id"":""IMzDL"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""text"",""text"":""テスト書き込みです""}]}]}]","9f75e39d-3c7a-4c63-9206-0fa9ad39ec58",,,,,,,,,,,"テスト書き込みです","T04AFLPMR16",,"1667820261.475789","message","U04A4K1NRT3"
,,"[{""type"":""rich_text"",""block_id"":""IY=R"",""elements"":[{""type"":""rich_text_section"",""elements"":[{""type"":""text"",""text"":""テスト書き込み""}]}]}]","4def0244-af04-4e95-8dc9-e5c0a98d23ac",,,,"[{""name"":""raised_hands"",""users"":[""U04A4K1NRT3""],""count"":1}]",,,,,,,"テスト書き込み","T04AFLPMR16",,"1667820254.200019","message","U04A4K1NRT3"
,,,,,,,,,,,,,"channel_join","<@U04A4K1NRT3>さんがチャンネルに参加しました",,,"1667815968.901369","message","U04A4K1NRT3"

改めて見るとかなりの部分が MySQL に転送できていなかったことがわかります。AppFlow で転送する時にはどういうデータが入ってくるのかを意識してあげる必要がありそうです。