pixiv spring boot camp 2024　データ基盤コースに参加してきた


# 初めに
これは、pixiv spring boot camp 2024　データ基盤コースの参加体験記です。
ピクシブ株式会社様より許可をいただいて投稿しています。

# 参加までの流れ
1. ES提出
ピクシブのインターンに参加したいと思った理由と希望コースの志望動機を聞かれます。（2つまで併願可能）
自分は、データ基盤コースと機械学習コースを志望しましたが、書類選考が通ったのはデータ基盤コースのみでした（両方通る場合もあるらしい）
2. 面接
見事、書類選考を突破すると次は面接です。ここでは、質疑応答に加えて技術面接もあります。（形式はいろいろです）
3. 参加
自分は、次の日に合格の連絡が来ましたが、２週間くらいたってから合格の連絡がくる場合もあるそうです。
他の参加者はほとんど26卒でしかも院生は自分だけでした。

# 受け入れについて
8日間で、日給1万円がもらえます。
さらに、交通費が支給されます。
遠方から参加される方にはさらに宿泊費が給料と一緒に振り込まれます
おしゃれなお店が多く、金額さえ気にしなければ食事には困りません。
近くに、オーケーというディスカウントストアもあるのでケチりたければそこに行きましょう。

# スケジュール
- 1日目　
    - オリエンテーション、受け入れ部署の方とランチ、PCのセットアップ、課題説明
- 2~7日目
    - 作業
- 8日目
    - プレゼン練習、成果発表会

大体こんな感じです。

# 私が参加した、データ基盤コースでの取り組み

## データ基盤チームについて
はじめに、ピクシブにおけるデータ基盤チームとは、データインフラの整備を行なっているチームです。しかし、最近ではアナリストの方が入りデータ活用におけるアンケートを行うなどのデータ利用の推進も行なっているみたいです。

参考　[ピクシブのデータインフラと組織構造についての紹介](https://speakerdeck.com/kashira/pixiv-meetup-2023-pikusibunodeta-inhuratozu-zhi-gou-zao)

## 行ったタスク
Cloud Loggingに収納されたBigQueryの監査ログをterroformを利用してBigQueryに送り、dbtを利用して監査ログの統合viewを作成しました。
これを行った理由としては、もともと、ピクシブではBigQueryの監査ログをAudit形式という形で取得していました。しかし、2019年ごろに新形式のBigQueryAuditMetadata形式が発表され、こちらの形式が推奨になりました。旧形式のAudit形式のサポートがいつ終わるかわからないけど、急務でもない、、、ってくらいの事案だったので、この移行作業がインターンの課題となったそうです。
[公式の発表](https://cloud.google.com/bigquery/docs/introduction-audit-workloads?hl=ja#audit_log_format)
</br>
</br>
また、旧形式と新形式の互換についてまとめた記事を別に書いたので興味がありましたら見ていただけると幸いです。（これが一番大変だった）

### Terraformを利用して監査ログをBigQueryに送信するCloud Logging Sinkの作成
以前は、gcpのコンソールを利用して手動でCloud Logging Sinkを作成していましたが、今はGitLabとTerraformでインフラをIaCで管理しているので、新形式の監査ログ取得のCloud Logging SinkはTerraformを使って作成しました。

参考　[Terraform公式のCloud Logging Sink作成ドキュメント](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/logging_project_sink)

こちらはドキュメントにあるサンプルです。
```
resource "google_logging_project_sink" "my-sink" {
  name = "my-pubsub-instance-sink"

  # Can export to pubsub, cloud storage, bigquery, log bucket, or another project
  destination = "pubsub.googleapis.com/projects/my-project/topics/instance-activity"

  # Log all WARN or higher severity messages relating to instances
  filter = "resource.type = gce_instance AND severity >= WARNING"

  # Use a unique writer (creates a unique service account used for writing)
  unique_writer_identity = true
}
```
ここにあるfilter引数の``resource.type``を``("bigquery_project" OR "bigquery_dataset")``とすると新形式で監査ログを取得できます。
＊　旧形式は``"bigquery_resource"``
＊　[公式の移行ガイド](https://cloud.google.com/bigquery/docs/reference/auditlogs/migration)

あとは、宛先などを任意のものに変更してください

### dbtを利用して旧形式と新形式の監査ログを統合するviewの作成
ここからは、旧形式で取得していた監査ログと今回取得した新形式を統合するviewを作成するためにdbtを利用しました。
#### dbtとは
[本家ドキュメント](https://docs.getdbt.com/docs/build/projects)
まず、dbtとはdbt-tokyoというコミュニティが出しているZennによるとこのような記載がされています。
> dbt（正式名称はdata build tool）はデータアナリストやアナリティクスエンジニアが（ほぼ）SQLだけで、データを変換しデータウエアハウス、データマートを構築していくことができるツールです。
> dbtはELTデータパイプラインのアプローチにおける「T」層の部分を担います。データの抽出やロードは出来ませんが、既にデータウェアハウスに読み込まれたデータを変換することに優れています。

引用　[dbtとは](https://zenn.dev/dbt_tokyo/books/537de43829f3a0/viewer/what_dbt)

じゃあどのように優れていて、利用するとどんなメリットがあるのか実際行ったタスクを事例として説明します。

#### なぜ使うのか
今回は、監査ログをそのままもってくるview、その中から必要なデータを取得するview、そうしてすべての過去の監査ログをまとめたviewと３つのviewを作成する必要があります。そんなパイプラインを簡単にそして関係性の把握をしやすくするためにdbtを利用しました。(作ったviewはこんな感じ)
```mermaid
flowchart TB
  new_data[新形式の監査ログデータ]-->new_dump[新形式の監査ログデータをそのまま取得するview]
  new_dump--> new_get_view[必要なデータを取得するview]
  new_get_view --> DB[すべての監査ログを統合したview]
  old_data[旧形式の監査ログデータ]-->old_dump[旧形式の監査ログデータをそのまま取得するview]
  old_dump--> old_get_view[必要なデータを取得するview]
  old_get_view --> DB[すべての監査ログを統合したview]
```

## インターンをする上で、意識したこと
### 業務上
- タスクの管理とそれを踏まえた計画スケジュールを立てる
    - 参加者にはnotionの利用権限も与えられ、そこに課題の説明やあらかじめ用意された看板ボート等を利用することができます。
    - 自分は、そこにTODOリストを都度作成して、どのくらいの時間に終わらせるのかをgoogleカレンダーに計画を立てて一日のはじめにメンターさんに確認してもらっていました。
- Merge Requestを出すときは、自分の環境でしっかりと確認してテストをする。
    - はい。当たり前ですが、初めはできていませんでした。ごめんなさい。
- １５分ルールの徹底
    - これは、有名なルールですが、15分自分で考えてわからなかったら人に聞くというgoogleのルールです。
    - 終盤のバタバタしているときは以外は、これを守って質問していました。特に、今回はじめてTerraformやdbtを使用したGitLabにおけるCIを体験したので慣れるまで時間かかりましたが、序盤にある程度時間をかけて理解したことで終盤はかなりスラスラとmerge requestを投げることができました.

### 業務外
- なるべくメンターのkashiraさんをはじめとしたいろんな社員さんとお話をする
    - これは蛇足な気もしますが、気になるポジションや部署の社員さんとは、メンターさんや人事の方にお願いをすればランチをセッティングしてくれます。
    - 自分は、データ基盤チームのみなさんの他に、機械学習エンジニア、データサイエンティスト、財務基盤チームの方（病欠でいけなかったけど、、）とランチに行きました。
    - こんな感じで、希望をすればマッチングをしてくれるのでこんな人とお話ししたい！くらいのテンションでもメンターさんにお願いしてみましょう。

### インターンを通じての感想

- 実務を体験できる（マジ）
    - よくあるワークショップや実務を模した課題ではなく、ガチの本番環境をいじります。当然、僕が作成したviewも今この瞬間も利用するとこができます。
    - 実際に社員さんがMRをしているGitLabを使用します。快適なCI/CDを実現しているGitLab CI/CDに感動しました。
- 社員さんがほんとうにドメインやプロダクトが好きで働いている
    - いろんな社員さんとお話を聞きましたが、とても技術力が高く、チーム開発にもなれている優秀な社員さんが多かったのです。（言い方はよくないですが、もっと上の企業にも入れると思います）しかし、そんな方々になぜピクシブに入ったのかと聞くと、自社のプロダクトやサブカルチャーが好きでそのために働きたいと皆言っていました。

### 最後に
7日間お世話になりました。最終日は参加できずにすみませんでした。
メンターのkashiraさん、人事のmarikoさんをはじめとしたピクシブのみなさんには本当にお世話になりました。
今年の夏にも開催されるみたいなので興味がある人は応募して見てください！

[今年のインターンの募集記事](https://internship.pixiv.co.jp/)
[新卒採用](https://www.pixiv.co.jp/new-graduates/)