カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

S3インベントリで取得したデータをAthenaからクエリする

経緯

前の記事で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 クローラ作成

逐一設定手順をキャプチャ取って載せるのは手間なので、設定した内容だけお見せします。
f:id:live-your-life-dd18:20191031152941p:plain
f:id:live-your-life-dd18:20191031153001p:plain

Glue クローラ実行

作成したクローラを実行します。
f:id:live-your-life-dd18:20191031153430p:plain

データカタログにテーブルが作成されていることが確認できます。
f:id:live-your-life-dd18:20191031153518p:plain

スキーマも正常に認識されていることも確認できました。
f:id:live-your-life-dd18:20191031153545p:plain
f:id:live-your-life-dd18:20191031153558p:plain

Athena確認

AthenaからDBとテーブルが認識されていることを確認します。
f:id:live-your-life-dd18:20191031153838p:plain

クエリを発行してデータが取得できることを確認します。
f:id:live-your-life-dd18:20191031154019p:plain


感想及び所感

前回のと組み合わせて構築すると簡単にS3のデータサイズを取得することができました。
気になる点としては、こんな感じです。

  • インベントリの出力がS3のキー単位なので、Athenaから確認した際にファイル以外のデータ行が存在している(上記でいうと"apple/")
  • インベントリの出力先は自由にカスタマイズできない(『出力先に指定したパス/対象S3バケット名/実行インベントリ名』配下に自動作成される)
  • 1つのインベントリの設定で、複数のインプットから1つのアウトプット先を指定できない(複数のフォルダ配下のインベントリを取得するなら、そのフォルダ分インベントリ設定を設定する必要がある)
  • Glueクローラでデータカタログに取り込む場合は、クロールするデータソース分手動でクローラに設定する必要がある
  • parquetファイルの出力先のフォルダ名がdata固定

特に最後のやつは、Glueクローラで指定したデータソースの末尾プレフィックス名が同名だと、ランダム英数字を末尾に付けて別データとしてテーブルが作成されるので、こちらで名前を指定できないのは不便かなと。
f:id:live-your-life-dd18:20191031155724p:plain

もし実運用するなら、dataフォルダに出力されたparquetファイルをコピーで別の場所に集約すれば使えそうではありますが、そこにかかる手間やコストを考えるとあまり使う機会はなさそうです。


あー、でも特定のフォルダ配下のみ取得するとかせずに、シンプルにS3バケット配下全部のオブジェクトを対象としてインベントリを取得→Athenaのクエリ発行時の条件で対象を絞ってデータサイズを取得、のようにすればできなくはないのか。
Athenaを使用する人にバケット配下の○○フォルダにはアクセスしてほしくない、といった要件がなければこの方法でもよさそう。