Amazon AppFlow カスタムコネクタで Slack から MySQL にデータ転送してみた
コンバンハ、千葉(幸)です。
ここしばらく Amazon AppFlow でのデータ転送を何パターンか試しています。
標準で用意されているコネクタでは MySQL を送信元/先に指定できないのですが、独自の Lambda 関数を用意しカスタムコネクタとして使用することで実現できるようになります。
カスタムコネクタ用 Lambda 関数のサンプルが以下で提供されており、これを送信元として試したことがありました。
これを送信先として指定した場合にはどういった挙動になるのだろう?というのが気になったので、今回はそれを試してみます。
MySQL → MySQL がメジャーな使い方として想定されていそうなのですが、少しズラして Slack から転送してみます。実用性はあまり思いついていないです。(転送も一応成功したもののあまりバッチリな内容になっていないです。)
今回作成する構成
以下のイメージで構成します。Slack を送信元、Aurora MySQL を送信先とする AppFlow フローを作成しデータ転送を行います。
これまで試してきた内容で再利用できるパーツはなるべく再利用していきます。
なお、今回はネットワーク的には以下構成で行います。
- Aurora DB クラスターはパブリックアクセス可能
- Lambda 関数は VPC との関連付けなし
VPC Lambda で構成したい場合にはいくつか注意点がありますので以下をご参考ください。
1. Slack 用のコネクタプロパティの準備
以下エントリで作成したコネクタプロパティ(接続)を再利用します。
接続作成前には Slack 側でアプリの設定や OAuth、パーミッションの設定などが必要ですので上記のエントリをご参考ください。
以下のTestConnect
を使っていきます。
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
)を入力して登録します。
コネクタの画面、もしくは「接続」の画面から接続(コネクタプロパティ)を作成していきます。
各種情報を入力し、「接続する」を押下します。
項目 | 説明 |
---|---|
Driver | 今回使用するコネクタでは mysql のみ |
Hostname | DB クラスターの接続エンドポイント |
Port | ポート番号 |
Username | DB ユーザー名 |
Password | DB ユーザーのパスワード |
Database Name | データベース名 |
接続名 | 接続(コネクタプロパティ)名 |
jdbc-connector
という名称でコネクタプロパティが作成されました。
ちなみに「接続する」というボタンを押しましたが、この段階で実際に DB クラスターに接続している訳ではありません。(なのでこのタイミングで間違った接続情報を入力していてもコネクタプロパティは正常に作成されます。)
3. AppFlow フローを作成する
送信元・送信先それぞれのコネクタプロパティが用意できたのでフローを作成していきます。
AppFlow コンソールの「フロー」から「フローを作成」を押下します。手順 1 でフロー名を入力し、次に進みます。
手順2 でまずは送信元を指定します。Slack 用の接続を選択した上で、他の項目も選択します。
- Slack オブジェクト:2022/11時点で
Conversations
が唯一の選択肢 - Slack チャネル:書き込みを収集したい Slack チャンネル
続いて送信先を指定します。カスタムコネクタプロファイルを指定した上で、以下を選択します。
- API バージョン:このコネクタの状態だと
v1
が唯一の選択肢 - {コネクタ名}オブジェクト:テーブルを選択(DB内に存在するテーブルが読み込まれる)
エラー処理、フロートリガーを指定して次に進みます。
手順 3 でデータフィールドのマッピングを指定します。
まずはマッピング方法とデータの処理方法です。今回はどちらもデフォルトにします。
続いてフィールドのマッピングです。送信元フィールド名から「すべてのフールドを直接マッピングする」を押下します。
Slack のフィールドが表示され、それに対応する送信先フィールド(今回で言えば接続先 DB のカラム)を設定していきます。
(余談ですが今回のテーブルでは先頭にid
というカラムを作っていたので、一個ずつずれて表示されており指定し直すのが大変でした。)
フィールドごとにマスク・切り捨てといった値の変更も可能です。今回は特に変更はしません。
妥当性確認(バリデーション)も特に指定せず次に進みます。
手順4ではフィルターが追加できますが、特に何もせず次に進みます。
次の「手順5」で最終確認をして作成すればフローの完成です。
4. フローの実行
作成できたフローを早速実行します。
失敗しました。
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.
ひとまず送信先の 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 );
それに合わせてフローで定義済みのデータマッピングも修正します。
その状態でフローを再実行すると、正常に完了しました。特にコネクタやフローの自体は作り直さなくともいい感じにやってくれました。
完了後のテーブルの状態はこんな感じ。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 で転送する時にはどういうデータが入ってくるのかを意識してあげる必要がありそうです。