AJA SSPとその技術について

※この記事は、[CyberAgent PTA Advent Calendar 2020](https://adventar.org/calendars/5741)の4日目の記事です。

サイバーエージェントグループの株式会社AJAにてプロダクトマネージャーをしている@_tarofです。
なかなか普段の業務関連などはQiitaには書きづらいので実は投稿するのははじめてだったりします。
ストックなどはしていましたが･･･。

さて、前置きが長くなってもしょうがないので、さっそく本題に入っていきましょう。
[昨日の記事](https://ameblo.jp/oekun/entry-12641389289.html)のアクが強すぎて真面目記事に戻るのもアレですが、気にしません。気にしたら負けです。

## はじめに

この記事では、サイバーエージェントのPTAに所属する株式会社AJA(以下当社)にて提供しているAJA SSPについて、その概要と使用している技術など、お見せできる範囲で紹介していこうと思います。

そもそもPTAとはなんぞや、が知りたい方はまずこちらの[会長による紹介記事記事](https://qiita.com/wataru420/items/8968f1127d0af00aea99)からご覧ください。

## AJA SSPとは

![AJA SSP](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31746/08272169-45b6-470e-f0a4-8c6952e331cb.png)

AJA SSPは、当社が提供しているSupply Side Platform(サプライサイドプラットフォーム、以下SSP)で、リアルタイムのオークションにより広告枠を販売する仕組みを駆使し、メディアの広告でのマネタイズをサポートするサービスです。

当社では創業当初は、親会社サイバーエージェントにて運営しているアメーバブログでの広告マネタイズのノウハウをベースとして、AJA Recommendというレコメンドウィジェット(あなたにオススメの記事はこちら、と出るアレです)を提供していましたが、アメーバブログ自体のマネタイズや、AJA Recommendにおけるマネタイズ部分の強化のための基盤システムとして、2017年初頭にAJA SSPを立ち上げました。

現在では、アメーバブログにおける広告マネタイズの一部や、テレビ朝日さんとサイバーエージェントで共同運営しているABEMAをはじめとした広告付きの動画配信サービス向けに、プレミアムな広告マーケットのサービスなどを提供しています。

グループ外のメディア様に向けたバナー広告やネイティブ広告の配信については、ヘッダービディングのみご提供しております。


## SSPとは

システムの構成などについてお話しする前に、軽くSSPについてふれておきます。
SSPとは、Webやアプリなどのメディアに向けて提供するサービスで、数多ある広告配信サービスとメディアを繋ぎ、広告のマネタイズの機会と単価最大化するサービスを言います。

![SSP Ecosystem](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31746/fde797eb-4840-c214-22a7-be3e58c8d953.png)


図に記載されているアドネットワークとは、SSPより古くから存在する広告配信サービスで、例えば1クリック辺り何円という形で、提携しているメディアに横断して広告を配信することが可能です。

DSPはDemand Side Platform(デマンドサイドプラットフォーム)の略で、我々のようなSSPと連携してリアルタイムのオークションにより広告の買い付けを行う広告主向けのサービスです。約50ミリ秒という短い時間でそのユーザーに最適な広告と入札単価を決定し、広告の表示権利を他のDSPと争います。

SSPは、上記のようにDSPに対するオークションの機会を提供するほか、アドネットワークから配信される広告なども組み合わせ、メディアの広告収益を高めていくサービスを提供しています。

## 使用言語

さて、ここからはシステムの話に入っていきます。
まずは使用言語している言語からお話ししていきます。

### Go言語

![adserver code with GoLand](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31746/a3524b6d-05e1-2db4-420c-faf3e1b7a312.png)

AJA SSPでは、バックエンドの開発言語としてはGo言語を中心として使用しています。
SSPのシステムにおいてはDSPへのリクエストなどで並列処理を実施する必要があることなどから、それが簡便かつそれなりに堅牢に利用できたり、またハイパフォーマンスな言語が求められていることから、配信サーバーを記述する言語としてGo言語が選ばれ、周辺システムについてもコードの再利用などの観点からも、直近Go言語で記述されることが多くなってきました。

昨今、例えばOSSのサーバーサイドヘッダービディングサーバーである[Prebid Server](https://github.com/prebid/prebid-server)についてもGo言語で記述されていることが知られています。

### TypeScript / JavaScript

メディア向け管理画面のフロントエンド、従来から利用されてきた定期実行されるスクリプト群の記述にTypeScriptが使われています。
スクリプト群は簡単なフレームワークを作成し、共通の初期化処理などを行えるようにするなど工夫して実装されています。

また、Webサイト上から広告を呼び出すスクリプトは、現在JavaScriptで記述されたものが使用されています。
しかしながら、メンテナンス性などの観点からTypeScriptへの移行を検討しています。

### その他

その他、アプリ向け広告配信SDKの開発にはKotlinやJava、Swiftが使用されています。
配信ログの集計には一部Python(PySpark)が使用されている部分もあるなど、比較的多岐にわたる言語でSSPのシステムは構築されています。

## システム構成

今回ここではあまり詳細にはお伝えできませんが、使用しているサービスなどについてお話ししていきたいと思います。
(図を書こうと思ったのですが、かなりカオスになりそうなので今回は割愛させてください･･･)

AJA SSPは、ほぼ全てのシステムがAmazon Web Services(AWS)上に構築されています。
その中から、代表的なサービスと用途をご紹介していきたいと思います。

### AWS Elastic Beanstalk

広告配信サーバーや集計基盤の一部にサービスリリース当初から利用されています。
自由度が高い部分と低い部分が混ざっており、なかなか管理が難しいところもありますが、

スケーリング部分やアプリケーションのデプロイなどは、専用のスクリプトを一部で用いていたり、Slack上のBotと連携してChatOpsが実現されていたりします。

### AWS Lambda / Amazon EventBridge(旧Amazon CloudWatch Events)

かなり広範に使われているサービスとしてLambdaがあります。
広告配信用データのキャッシュ化、外部のアドネットワークとのレポート連携やスクレイピング、一部の集計処理、果ては管理画面のバックエンドなど、用途は多岐にわたっています。
定期実行されるLambdaの関数は、EventBridgeのトリガーにより動作しています。

### Amazon CloudFront

広告配信においては必要不可欠なCDNとして、Amazon CloudFrontが使用されています。
詳細はここではお知らせできませんが、CloudFront自体はかなり適用範囲が広く、無くてはならないサービスの一つです。

### AWS Glue / Amazon Athena

広告配信ログの集計には、AWS GlueのETL Jobが使用されています。
集計スクリプトは前述の通りGlueで提供されているPySpark上で実行されるSpark SQLで記述されています。

集計されたレポートはApache Parquet形式でAWS S3上に保存されており、管理画面や社内向けに準備しているRedashなどからは、Amazon Athenaを通じてこれらにクエリが投げられています。
基本的にレポート周りにはRDBは使用されていません。

### Amazon DynamoDB / Amazon ElastiCache

Webサイトへの広告配信では、その肝となるユーザーシンクというプロセスがあるのですが、この部分にAmazon DynamoDB/Amazon DynamoDB Acceleratorが使用されています。
Amazon ElastiCacheは、配信に使用される一部のデータをキャッシュするために使用しています。

## さいごに

駆け足で紹介をしてきましたが、今回はここまでとなります。
これまであまり外部向けに情報を公開してきていなかったことから、表面だけをさっとなぞるような紹介となってしまいましたが、AJA SSPはこれらの技術やサービスを組み合わせて運営されています。
あまり踏み込んで公開できなかった部分もございますが、今後PTAが主催するイベント等において、ご紹介していけたらと思っております。

さて、そんなPTAでは、来週12月11日(金)に定期開催しているイベント、[オレシカナイト忘年会](https://cyberagent.connpass.com/event/195409/)を開催する予定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31746/902a3baf-ffce-df57-1bc4-12654d89a87a.png)

昨今の事情を鑑み、前回の開催からオンライン開催となってしまっておりますが、今回は忘年会スペシャルとして、お取引のある各社様にもご登壇をいただくことが決まっております。
当日はYouTube Liveでの配信を予定しておりますので、少しでも今回の記事の内容やPTAについてご興味をお持ち頂いた方は、覗いてみて頂ければ幸いです！

みなさまのお越しをお待ちしております。