LookerActionを使ってBigQueryのデータをMarketoに連携する

#ナニコレ
https://community.looker.com/general-looker-administration-35/looker-actions-marketo-7796
この記事を参考に、Lookerを使ってBigQueryに入っているデータでMarketoのリード情報を更新したので、そのメモ。

#前提
私はLookerユーザーのデータアナリストで、Marketo側のことはよくわかっていない
が、簡単に実装できたという話をしたい。

#実装方法
上記記事を適宜参照しつつ解説していきます。

###まずはLooker側でMarketoActionを有効化する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77126/047211c7-ca74-9daa-b1ab-5174443e8905.png)
Admin > Platform > ActionsにアクセスするとMarketoのアイコンがあるので"Enable"ボタンを押して有効化する

###次にMarketo側でもAPIを有効化＆接続情報を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77126/cfc9e289-6b0d-5e59-77e3-1457f085c1c2.png)
Marketo側設定の詳細は[この辺](https://docs.marketo.com/pages/releaseview.action?pageId=7509777)を参照のこと。
IP制限をかけている場合、ここでLookerインスタンスのIPアドレスをホワイトリストに入れておきましょう。（※ここでめっちゃ詰まった。後述。）
各インスタンスのIPアドレスは[こちらのページ](https://docs.looker.com/ja/setup-and-management/enabling-secure-db)にまとまってます。


###上で確認した接続情報をLookerのMarketoActionの設定に入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77126/2d3b0ffb-78bf-3808-f9e9-6c726dfc3619.png)

TestActionも実行しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77126/6bdc564a-9cfe-c0a1-e953-32576c4b593b.png)

###viewファイル内でLooker項目とMarketo項目の対応関係を定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77126/9b1c2444-03fe-60dc-6365-2a1a0376a4c4.png)
画像のように、[tags](https://docs.looker.com/reference/field-params/tags)パラメータで定義します。
Marketo側の項目はREST API名を指定するように注意してください。

###あとは可視化して送信 or スケジュール設定するだけ！
1. Lookerでいつものように更新のキーとなる項目、更新したい項目を可視化（LookでもDashboardでもExploreでも良さそう）
2. 右上の歯車から送信 or スケジュールを押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77126/8e443bab-0163-5f68-03d5-cc382780fce2.png)
3. データの移動先でMarketoを選択し、Lead Lookup Fieldで更新のキーとなる項目を入力する（※Marketo側の名称を書く必要があるので注意）
4. Additional ActionとしてCampaignやListにデータを追加したい場合はそのIDを設定する（ListID等は[URLからわかる](https://nation.marketo.com/t5/Product-Discussions/How-do-I-find-a-List-ID-for-use-with-the-REST-API/td-p/175885)らしい）
5. 高度なオプションで"すべての結果"にするのがオススメ。表の結果にしてしまうとLookerで可視化できた行の分しか更新されない（はず）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77126/37fb288b-14c8-9db0-5f7f-1c348b5c1228.png)
6. 送信！

#詰まったところ
上述したが、Looker側のIPアドレスがよくわからずめちゃくちゃ詰まった。
ChatSupportにも問合せ、間違いなく弊社のLookerインスタンスは日本、東京（asia-northeast1）ぽいのだが、どうしてもそのIPだと弾かれてしまった。しかもエラーコードは603（権限不足）で余計に混乱。
Marketoに問い合わせて、APIを叩いたタイミングでアクセスがあったIPを教えてもらってホワイトリストに追加するという力技で解決。
SSHトンネルを設定していると上で紹介したページで書かれているIPアドレスではなくなる可能性があると教えてもらったが、果たして…いまだに真相がわかっていない。
↓
[2021/04/16追記]
LookerActionはLooker > ActionHub > Endpointという構成で実行されるとのことで、
最終的にMarketo側のホワイトリストに登録すべきIPはActionHubのIPでした。なるほど。
https://docs.looker.com/ja/sharing-and-publishing/action-hub

#エラーを吐く
Marketo側の設計が余程うまく行っていない限り、エラーと向き合い続けることになると思います。
メールで通知されるエラーメッセージは情報量が少ないので、Admin > Server > Logでエラーログを確認しましょう。
僕が出会ったログは以下の2つでした。
* Access denied(code:603) :上の通り、ホワイトリストにLookerのIPアドレスが足りなかったがゆえのエラーでした
* keyとなる項目がないエラー：Lead Lookup Fieldに指定した項目がMarketo側でnullだと起こるっぽいです。


#その他注意点
API RequestはbulkではなくLooker側で可視化したリスト一行一行で行われるっぽく、Marketo側のMaxRateLimitにひっかかってしまった。これも状況証拠から推測したにすぎないので、是非詳しい方いたら教えていただきたいです。bulkで実行されるようになったら嬉しい…