AlteryxでS3から複数のGzipファイルを読み込む

2023.02.01

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

AlteryxからS3上の複数Gzipファイルを一つのワークフローで読み込む手順になります。

前提条件

下記の環境で検証しています。
・Windows 10 Pro
・Ubuntu 22.04.1 LTS on Windows
・AWS-CLI 2.9.18
・Alteryx Designer 2022.3.1

AlteryxでのS3からのファイルの読み込み

Alteryxには、S3からのデータを取得する機能を持った Amazon S3ダウンロードツールがあります。
2023/2/1 時点では、このツールを通したS3へのアクセスには、アクセスキー(アクセスキーID・シークレットキー)の入力が必要です。

※追記
Version 2023.1 のアップデートで、IAM Role のサポートが開始されました!
Designer 2023.1リリースノート | Alteryx Documentation

ツール自体は単一ファイルの読み込みのみ対応しています。
複数ファイルファイル取得の方法は、下記の記事で紹介されています。

対応するファイルフォーマット
Amazon S3ダウンロードツールは、下記の4ファイルフォーマットをサポートしており、Gzip は未対応となっています。
・Alteryx Database(.yxdb)
・Avro(.avro)
・Comma Separated Value(.csv)
・JSON(.json)

そのためS3からGzipファイルを読み込む場合、一度ローカルにファイルを保存する必要があります。
ローカルのGzipファイルは、データ入力ツール動的入力ツールで読み込み可能です。

S3に圧縮ファイルを配置する場面は多々あるかと思いますし、その際、都度「S3からローカルに保存 → 読み込み」はやや手間なので、コマンド実行ツールを用いて、一つのワークフローで実行する処理を作成してみました。

S3からの複数Gzipファイル読み込み

S3側の設定

下記のようにCSV形式の圧縮ファイルを10ファイル用意しました。それぞれ10行のデータで、合計100件のデータとしています。

aws s3 ls s3://<バケット>
--出力
2023-01-27 13:40:23         94 file_1.csv.gz
2023-01-27 13:40:23         97 file_10.csv.gz
2023-01-27 13:40:23         95 file_2.csv.gz
2023-01-27 13:40:23         93 file_3.csv.gz
2023-01-27 13:40:23         95 file_4.csv.gz
2023-01-27 13:40:23         95 file_5.csv.gz
2023-01-27 13:40:24         96 file_6.csv.gz
2023-01-27 13:40:23         95 file_7.csv.gz
2023-01-27 13:40:23         95 file_8.csv.gz
2023-01-27 13:40:23         94 file_9.csv.gz

S3からのファイル取得

Amazon S3ダウンロードツールは、Gzipファイル未対応なので、ここでは下記の手順とすることで、一つのワークフローでファイル取得を行います。

1.コマンド実行ツールで、S3からGzipファイルをローカルに保存(AWS CLIを使用)
2.ローカルのGzipファイルを一括読み込み

2については、下記の記事で紹介している手順とほぼ同様です。

ワークフロー

作成したワークフローは下記になります。

一つのワークフローで完結し、かつ「ファイル取得 → 読み込み」の順に処理を行うために、バッチマクロを使用しています。

コマンドの生成

左上のテキスト入力ツールでは、バケット・フォルダを入力として与えています。

フォーミュラツールでは、実行するコマンドを作成しています。

今回、WSL上にインストールした AWS CLI を用いています。そのため、WSLからWindows側のファイルを参照するため下記の変換を行っています。

・Cドライブパスの参照をWSLパスに変更

Replace([command], "C:", "/mnt/c")

・パスの区切り文字を変更

Replace([command], "\", "/")

変換後のコマンドは下記の通りです。

START /WAIT /B wsl aws s3 cp s3://<バケット> /mnt/c/Users/<一時ディレクトリ>/ --recursive

そのあとのセレクトツールでは、元のデータのバケット名、フォルダ名をこの先不要なので削除しています。
なお、一時ディレクトリの詳細は下記を参照ください。

Alteryx と一時ファイル


左下のテキスト入力ツールでは、コマンド実行ツールの出力となるデータの元となるファイル名を与えています。

次のフォーミュラツールでは、先ほどと同様に実行するコマンドを作成しています。

セレクトツールでは、不要列を削除後、それぞれのコマンドをユニオンしています。

コマンド実行ツール設定

ツールの設定は下記の通りです。

ユニオンツールの出力を、ワークフローの一時ディレクトリに、command.batという名称のバッチファイルとして書き出し、同じファイルを実行ファイルとして指定しています。
「結果の読み取り」に、tempdirname.txtを指定し、ワークフローの一時ディレクトリをツール出力としています。

また、上述のファイル出力時は、いずれも下記の設定としています。
・ファイルフォーマット:CSVファイル
・先頭行にフィールドを含める:含めない(チェック無し)

コマンド実行ツール出力

AWSコマンドを実行するために、aws configureでアクセスユーザーの設定、ユーザーには適切なIAM Roleを付与しておく必要があります。

コマンド実行ツールの詳細は、下記を参照ください。
AlteryxのRun Commandで任意のプログラムを利用する | Developers IO

バッチマクロ

バッチマクロは下記の構成となっています。

ディレクトリツールで指定するパスを入力で更新しています。
S3から取得したファイル保存先ディレクトリをマクロの入力とすれば、読み込みたいファイルのフルパスを取得できることになります。
その後のフォーミュラツールでは、Gzipファイル読み込み用にフルパスを加工しています。
加工内容の詳細は、上述の複数Gzipファイル読み込みの記事を参照ください。

バッチマクロの入出力の内容をまとめると、下記の通りとなります。

入力
・S3から取得したファイルの保存先ディレクトリ
※コマンド実行ツールの出力。ここでは、ワークフローの一時ディレクトリ。

出力
・読み込み対象の複数Gzipファイルのフルパス
※ディレクトリツールでは、「ファイル指定オプション」で「.csv.gz」ファイルの取得する設定としています。

複数ファイル読み込み

動的入力ツール
さいごの動的入力ツールは、下記の設定です。
テンプレートファイルには、「.csv.gz」ファイルを指定しています。

ワークフローを実行すると、コマンドを記載したバッチファイルが一時ディレクトリに生成され、同じディレクトリに、指定のS3オブジェクトをコピーします。
その後、一時ディレクトリにコピーされた Gzip ファイルが動的入力ツールにより、一括読み込みされます。

さいごに

今回は単一のワークフローで、S3から複数のGzipファイルを取得する方法を試してみました。
単一のワークフローに収めるために、やや複雑になりましたが、コマンド実行ツールを使用すると、ワークフローでできることの幅が広がる部分を見れたと思います。

参考

Amazon S3 Downloadツール

Download a zipped text file (....txt.gz) from Amazon S3 Bucket | Alteryx Community

AWS Roles | Alteryx Community

Access to S3 using IAM roles | Alteryx Community

AlteryxのRun Commandツールを使ってPythonを動かす | Developers IO

Alteryx Serverのバックアップを定期的に取得してS3バケットに保存する | Developers IO