Azure Data Lake Storage Gen2にcsvをアップロードするWFを作ったときに丸二日ハマったので、こちらで共有します。
事象
Microsoftの公式ドキュメントに従ってURIおよびヘッダを作成してダウンロードツールを使ったが、”必須のヘッダーがついてません”というエラーが出た。具体的になんのヘッダが足りてないかが、応答結果に書いておらず、ハマってしまった。
解決方法
ヘッダに”Transfer-Encoding”を追加。値は空欄にする。どうやらAlteryxでサイレントでTransfer-Encodingヘッダを追加して値をchunkedに設定しているらしく、それが原因とのこと。なので、値を空欄で上書きする。
以下の記事を参考。
その他参考情報
私の環境では共有アカウントキーを使いました。URIと明示的に指定したヘッダは以下
URI: https://{storagename}.blob.core.windows.net/{containername}/{filename}{SAS Query}
Header:
x-ms-blob-type: BlockBlob
Content-Type: application/octet-stream
Transfer-Encoding: 空欄にする
Content-Length: ファイルサイズ(byte)
※Content-Lengthヘッダでファイルサイズ指定が必須で、これも地味に面倒だった。Blobフィールドのファイルサイズをフィールドサマリーツール等で取得しようとしたが、できず。結局、以下のようにした。
csvファイルをブロブ変換ツールで16進数(HEX)に変換➡フォーミュラツールで16進数データのLengthを計算し2で割る(Byte相当長さになる)➡この値をContent-Lengthヘッダの値に設定
AWS以外のオブジェクトストレージについてはサポートがいまいちですよね・・・。
いっそのことCDATAのコネクトとか使った方が楽なのでしょうか・・・・
※私もGCPのGoogle Cloud Storageにダウンロードツールで接続しましたが、結構面倒でした・・・。Pythonツールが一番楽・・・。
コネクタの種類充実してほしいというのも、来週のユーザ会での直訴ポイントですかね・・・?笑
Pythonでもダウンロードツールの代わりになるとは知らなかったので、試してみようと思います(Pythonツールはカーネル起動が遅いので、どうしても必要な時以外は使わないです。。。)
Pythonツールは普通にRestAPI叩けますので、、、また、Pythonだと普通にAPI叩くよりもライブラリ提供されている事が多くて、それ使うと遥かに楽にできますね・・・。
ただ、おっしゃるとおり、起動が遅いので最終手段にしたいところです・・・。
日本のツールのコネクタはしょうがないにしても、グローバルで使われそうなところはしっかり欲しいですよね・・・。