Pocket

さて、2ヶ月ぶりのブログとなります。今回は分析基盤についてお話できればと思います。私個人の経験の中で分析基盤の知見を得られたのは現職のおかげでもありますが、Digdag、Embulk、BigQueryを利用せずに、AWS内で完結したい場合はどのような仕組みで実装すれば良いのだろうと経験なかったので、検証がてら試してみました。

昔はEmbulkのブログめっちゃ書いてましたね。

https://blog.adachin.me/archives/category/embulk


構成

  • Lambda(Python3.9)
  • EventBridge Rule
  • KMS
  • RDS(snapshot)
  • S3
  • AWS Glue
  • Amazon Athena
  • Redash

https://docs.aws.amazon.com//AmazonRDS/latest/UserGuide/USER_ExportSnapshot.html

RDSにはスナップショットからS3にエクスポートする機能があり、AWS Glueのクローラーを利用してAthenaにデータを蓄積することが可能です。またエクスポート時も、対象のテーブルに絞ったり、差分更新なども可能です。Embulkと比べるとテーブル追加時に設定ファイルを書く必要はないので、運用工数がかからないというのがメリットです。デメリットは構成がシンプルではないので、設定が多すぎるのとTerraformによるコード化が必須となります。それではいってみましょう。


Terraform

まずはAthenaからS3に参照できるようにAWS Glueを追加します。

※ちなみにバケット名はhoge

  • files/assume_role_policy/export-rds-s3-glue.json

  • files/assume_role_policy/export-rds-s3.json

  • files/assume_role_policy/glue-s3.json

  • files/assume_role_policy/kms-glue.json

  • glue.tf

  • iam.tf

見て分かると思いますが、IAMロールとポリシーまみれとなっております。セキュリティ的にS3にエクスポートする際のデータは既存のKMSを利用して暗号化するのがベストです。Parquet形式になっているので、データ分析する際便利ですね。また、Glueのスケジュールは朝の5時にしました。以下のように手動でエクスポート後、GlueのクローリングでAthenaに読み込ませれば完了となります。

  • 確認

BigQueryと同じでクエリも問題なく叩けますね。viewテーブルも以下のようにクエリを実行すれば作成することが可能です。

  • viewの作成

上記実装できたら次は手動で毎回エクスポートするにはいかないので、Lambdaで定期実行するように作ってみました。


Lambda/Terraform

    • files/assume_role_policy/kms.json

    • files/assume_role_policy/lambda.json

    • files/assume_role_policy/lambda_rds_s3.json

    • files/assume_role_policy/lambda_rds_s3_execution.json

    • files/assume_role_policy/lambda_rds_s3_export.json

    • files/assume_role_policy/rds_s3_export.json

    • iam.tf

    • lambda.tf

    • lambda-handler.py

    • eventrule.tf

    またIAMロールとポリシーまみれですが、Lambdaでは前日分のスナップショットから取得したいテーブルのみに絞りました。EventBridge Ruleで実行できていれば完了となります。しかしこの場合だと日付ごとにテーブル化されてしまうので色々と考慮しないといけないですね。Glueの設定で Crawl new folders only があるのでこれで良さそう。

    Crawl new folders only
    Only Amazon S3 folders that were added since the last crawl will be crawled. If the schemas are compatible, new partitions will be added to existing tables.

    最後のクロール以降に追加されたAmazonS3フォルダーのみがクロールされます。スキーマに互換性がある場合、新しいパーティションが既存のテーブルに追加されます。

    GlueのTerraformは以下のように追記すればOK。


    まとめ

    この構成を実装するのが大変でIAMロールのポリシー不足でハマりましたが、一度作ってしまえばなんともない感じですね。テーブル追加はLambdaだけ変更してデプロイすれば完了なので、運用工数が下がるのはメリットですね。Digdagのワークフローの部分は Step Functionsを利用すればできそうだけども、また次回のブログで書きたいと思います。

    Athenaほとんど触ったことないので、パーティションやら料金のところを確認してみよう。BigQueryと比べるとクエリ速度どのくらい変わるんだろうか…あまりAthenaの事例見たことないような気がする。

    Pocket

    カテゴリー: AthenaAWSTerraform

    adachin

    1989年生まれのSRE。ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、オブザーバビリティ、緊急対応、AWS/Azureでのインフラ構築、Docker開発環境の提供、Kubernetes保守、インフラコード化、新技術の検証、リファクタリング、セキュリティ強化などを担当している。個人事業主では数社サーバー保守とベンチャー企業のSREインフラコンサルティングやMENTAで未経験者にインフラのコーチング/コミュニティの運用を実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。

    0件のコメント

    コメントを残す

    このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください