.jpg)
目次
今回は、FirebaseAnalyticsからBigQueryにエクスポートしたデータをQuickSight上で、表形式で閲覧したいという要件を実現するための過程を記事にしました。
以前書いたこの記事の続きみたいな感じです。
なぜ、BigQueryのデータをわざわざQuickSightで見ようとするかというと、BigQuery上のデータとRDSのDBデータをガッチャンこして見たいという要件があり、少し回りくどく見えるような構成になっています。
要件を実現するための構成はこれ以外にも案はあると思いますが、考えた結果、これが最適と考えた末なので、何かいい案をお持ちの方がいれば優しく教えて欲しいです。(ここには出てこない隠れた要件も色々あるので最適な構成を考えるのはかなり難しかったです。)
それぞれのツールについての概要の公式記事は以下です。
QuickSight上で以下のような表示を目指したい。

以下のような流れが処理の大枠です。


https://dev.classmethod.jp/articles/aws-glue-connector-for-google-bigquery-bigquery-to-s3/
base64エンコードする
$ base64 gcp-credentials.json
key名: credentials
シークレット1あたり0.40USD/月
https://aws.amazon.com/jp/secrets-manager/pricing/

バケットの作り方は割愛しますが、適切な命名でバケットを作成してください。
stg/prod環境の共通設定としてロールとポリシーを作りました。
GlueがAWSの各種必要なサービス(s3,secret manager)を呼び出すことを許可するための信頼ポリシーを作成(これでGlueに紐付けされる)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "glue.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "glue:StartJobRun",
      "Resource": "*"
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "secretsmanager:GetResourcePolicy",
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret",
        "s3:ListBucket",
        "s3:GetBucketAcl",
        "s3:DeleteObject",
        "s3:GetBucketLocation",
        "secretsmanager:ListSecretVersionIds"
      ],
      "Resource": [
        "${stgのsecret_manegerのarn}",
        "${prodのsecret_manegerのarn}",
        "arn:aws:s3:::${stgのバケット名}",
        "arn:aws:s3:::${stgのバケット名}/*",
        "arn:aws:s3:::${prodのバケット名}",
        "arn:aws:s3:::${prodのバケット名}/*"
      ]
    }
  ]
}以下のポリシーを紐付けてGlueが各種必要なサービスにアクセスするためのロールが完成する
https://aws.amazon.com/marketplace/pp/prodview-sqnd4gn5fykx6




GlueからBigQueryにアクセスするためのコネクターを設定(これによりAWS Glue Studioに紐付けられる)





"parentProject": "${プロジェクト名}
"table": "${テーブル名}",
"connectionName": "${コネクター名}
ジョブスクリプトのロックを解除すると、ビジュアルモードからスクリプトオンリーモードに変換されます。この操作は元に戻すことができません。ビジュアルモードのジョブのコピーを保持するには、Glue Studioのジョブページでジョブのクローンを作成します。

import datetime
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
args = getResolvedOptions(sys.argv, ["JOB_NAME"])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args["JOB_NAME"], args)
# 対象のデータは昨日のものを指定
target_date = datetime.datetime.now() - datetime.timedelta(days=1)
# Script generated for node Google BigQuery Connector 0.22.0 for AWS Glue 3.0
GoogleBigQueryConnector0220forAWSGlue30_node1 = (
    glueContext.create_dynamic_frame.from_options(
        connection_type="marketplace.spark",
        connection_options={
            "parentProject": "${BigQuery上のプロジェクト名}",
            "table": "${BigQuery上のテーブル名}",
            "connectionName": "${コネクター名}",
        },
        transformation_ctx="GoogleBigQueryConnector0220forAWSGlue30_node1",
    )
)
# Script generated for node S3 bucket
S3bucket_node3 = glueContext.write_dynamic_frame.from_options(
    frame=GoogleBigQueryConnector0220forAWSGlue30_node1,
    connection_type="s3",
    format="csv",
    connection_options={
        "path": "s3://${データを吐き出す先のS3バケット名}/",
        "partitionKeys": [],
    },
    transformation_ctx="S3bucket_node3",
)
job.commit()

ロケーションはアナリティクスのデータに合わせて US を指定(ロケーションが違うとうまく動かない)

最終的に付与した権限は以下の通り
bigquery.datasets.update
bigquery.jobs.create
bigquery.readsessions.create
bigquery.readsessions.getData
bigquery.tables.create
bigquery.tables.get
bigquery.tables.getData
bigquery.tables.update
bigquery.tables.updateData
bigquery.transfers.get
bigquery.transfers.update
https://cloud.google.com/bigquery/docs/scheduling-queries?hl=ja
「スケジュール」→「スケジュールの新規作成」





こちらのクラスメソッドさんの記事が非常に参考になります。
https://dev.classmethod.jp/articles/aurora-quicksight/





して、データベース名、ユーザー名、ホスト名、パスワードなどを入力して繋ぎ込む


{
  "fileLocations": [
    {
      "URIPrefixes": [
        "s3://${S3のバケット名}/"
      ]
    }
  ],
  "globalUploadSettings": {
    "format": "CSV",
    "delimiter": ",",
    "textqualifier": "'",
    "containsHeader": "true"
  }
}




作ったデータセットやデータソースをダッシュボード上で読み込んであげればあとは煮るなり焼くなり可視化は可能になる
いかがでしたでしょうか??何かのお役に立てば幸いです。
記事をシェアする

関連記事