経緯
前の記事でS3のインベントリ機能を使用してS3内のデータサイズを取得しましたが、今回はそのデータをAthenaから確認できるようにします。
前回
capybara-engineer.hatenablog.com
実施内容
- S3バケットポリシー修正
- Glue クローラ作成
- Glue クローラ実行
- Athena確認
実施作業
S3バケットポリシー修正
Glueクローラを実行するS3バケットのバケットポリシーをGlueからアクセスできるように修正します。
※今回は前回インベントリ結果を出力したoutput-test-inventoryバケットがクロール対象です。
修正内容はActionを"s3:PutObject"から"s3:*"に変更するだけです。
{ "Version": "2012-10-17", "Id": "S3-Console-Auto-Gen-Policy-1572326515353", "Statement": [ { "Sid": "S3PolicyStmt-DO-NOT-MODIFY-1572326515353", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "s3:*", "Resource": "arn:aws:s3:::output-test-inventory/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceAccount": "************" }, "ArnLike": { "aws:SourceArn": "arn:aws:s3:::input-test-inventory" } } } ] }
Glue クローラ作成
逐一設定手順をキャプチャ取って載せるのは手間なので、設定した内容だけお見せします。
Glue クローラ実行
作成したクローラを実行します。
データカタログにテーブルが作成されていることが確認できます。
スキーマも正常に認識されていることも確認できました。
Athena確認
AthenaからDBとテーブルが認識されていることを確認します。
クエリを発行してデータが取得できることを確認します。
感想及び所感
前回のと組み合わせて構築すると簡単にS3のデータサイズを取得することができました。
気になる点としては、こんな感じです。
- インベントリの出力がS3のキー単位なので、Athenaから確認した際にファイル以外のデータ行が存在している(上記でいうと"apple/")
- インベントリの出力先は自由にカスタマイズできない(『出力先に指定したパス/対象S3バケット名/実行インベントリ名』配下に自動作成される)
- 1つのインベントリの設定で、複数のインプットから1つのアウトプット先を指定できない(複数のフォルダ配下のインベントリを取得するなら、そのフォルダ分インベントリ設定を設定する必要がある)
- Glueクローラでデータカタログに取り込む場合は、クロールするデータソース分手動でクローラに設定する必要がある
- parquetファイルの出力先のフォルダ名がdata固定
特に最後のやつは、Glueクローラで指定したデータソースの末尾プレフィックス名が同名だと、ランダム英数字を末尾に付けて別データとしてテーブルが作成されるので、こちらで名前を指定できないのは不便かなと。
もし実運用するなら、dataフォルダに出力されたparquetファイルをコピーで別の場所に集約すれば使えそうではありますが、そこにかかる手間やコストを考えるとあまり使う機会はなさそうです。
あー、でも特定のフォルダ配下のみ取得するとかせずに、シンプルにS3バケット配下全部のオブジェクトを対象としてインベントリを取得→Athenaのクエリ発行時の条件で対象を絞ってデータサイズを取得、のようにすればできなくはないのか。
Athenaを使用する人にバケット配下の○○フォルダにはアクセスしてほしくない、といった要件がなければこの方法でもよさそう。