Amazon AppFlow で送信先に S3 を指定する際に Glue データカタログ自動作成とパーティション設定のオプションが利用できるようになりました

2022.11.21

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

いわさです。

先日のアップデートで Amazon AppFlow で S3 を出力先とするときに、Glue データカタログの自動作成とパーティション設定のオプションが利用できるようになりました。

うまく活用出来れば AppFlow を使って S3 へ出力を行ったあとに、別途ジョブなどを使って再配置せずすぐにデータカタログを使って Athena などでクエリできるようになります。
追加されたオプションとしては大きく 2 つあります。

ひとつがデータカタログの自動作成機能で、もうひとつがパーティション設定機能です。
どちらかだけ利用も出来ますし、併用も可能です。

サンプル実行のためにチバユキさんの記事を以下を参考に Slack + S3 統合で今回は試してみました。

データカタログ設定

こちらの機能はフローの実行時に Glue データカタログにテーブルを自動作成する機能です。
このあと使ってみますが、注意点としてはフローの実行ごとにテーブルが作成され、取り込み先の S3 ロケーションが指定されます。

AppFlow から Glue データカタログを作成するので、AppFlow を信頼したカタログ作成権限を持つロールの作成が必要です。

フロー実行後にデータカタログテーブルが表示されます。
この名称は先程設定したテーブル名のプレフィックスに、フロー名やスキーマバージョン・実行 ID などを付与してフロー実行のたびに自動作成を行います。

AppFlow では基本的に実行ごとに取り込みファイルが作成されますが、テーブルのロケーションとして取り込みタイミングのファイルが指定されています。
そのためテーブルごとに参照する実行結果ファイルが異なっています。
後述のパーティション設定機能を使って S3 の配置構造をカスタマイズしパーティションを効かせたい場合はこちらのオプションは OFF にしたほうが良さそうです。
パーティションを作成せずに取り込み結果の最新や過去をテーブルで保持したいという場合はこちらのオプションを使うのが良さそうです。

以下のように AppFlow 取り込み後にすぐ Athena でクエリを実行することが出来ました。
latest サフィックスのテーブルは常に最終取り込み結果を指すようになっているようです。

取り込みごとにテーブルは更新されてバージョン管理されていました。

パーティションの設定

こちらは S3 へ格納する際にパーティションに関する設定を行う機能です。
配置するパスやファイル出力の単位などをカスタマイズできるようになりました。

パーティションの設定ではデフォルトで実行 ID ごとのパーティション作成だったものを、タイムスタンプや指定したフィールドに基づいたものに変更することが出来ます。

タイムスタンプは年から分まで指定が可能ですが、フロー実行時のタイムスタンプであってデータレコードのものではないので注意してください。
データのプロパティが指定できるので送信元のフィールドにパーティションキーになる情報が含まれていればかなり使いやすいと思います。
ただ、AppFlow は加工周りが少しまだ弱い感じがするのでフィールドの特定部分のみ切り出す方法は AppFlow だけだとまだ厳しい感じです。未加工で利用できる状態であればそのまま使えると思います。

タイムスタンプであれば以下のような感じです。

送信先フィールドの場合は以下のようになります。
今回はタイムスタンプなしの Slack.user フィールドを指定しました。

こちらの場合は事前に AppFlow のパーティション設定とあわせたテーブルを作成しておくのが良さそうですね。

さいごに

本日は Amazon AppFlow で送信先に S3 を指定する際に Glue データカタログ自動作成とパーティション設定のオプションが利用できるようになったので試してみました。

送信元のフィールド構成によってはかなり有効に利用できるのではないでしょうか。
パーティション化のために Glue ジョブなどで再配置している場合は AppFlow のパーティション機能でカバーできるかもしれません。