サマリ
Radiko録音スクリプトを作ったので聞きたい番組をGCPで定期的に録音しようとしました。
GCPは東京リージョンがあるから、東京のラジオが聞けると思っていましたができませんでした。
原因はリージョンについて勘違いをしていて、そもそもできないことをしようとしていたからでした。
前提の話
試した環境
- GCP Cloud Run: (2019/12/14)
Cloud Runでの録音実施とその結果
Radiko録音スクリプトを作ったで作ったスクリプトをDockerで動くようにして、Cloud Runで実行しました。
ラジコから音声ファイルを取得するには前処理として、WebAPIをコールして音声ファイル取得に必要なパーシャルキーという文字列をHTTPヘッダーから取り出します。このとき、HTTPレスポンスボディにラジコがどのエリアで判定したかをWebAPIが返してくれます。
以下はローカルで実行して判定されたエリアをログで出したものです。エリアID:JP13と日本の東京と判定されています。
DEBUG:root:res.content:b'JP13,\xe6\x9d\xb1\xe4\xba\xac\xe9\x83\xbd,tokyo Japan\r\n'
Cloud Runでもasia-northeast1(東京リージョン)で実行すれば同様の動きをすると思っていました。(※ここが勘違いしていた部分)
実行すると以下のようになりました。
DEBUG:root:res.content:b'OUT'
原因をさぐる
OUTというのはローカルで実行したときに返ってきたことがなかったので、もしかして日本からアクセスしたことになっていないのでは?
と仮設を立ててみました。Radikoは日本専用のサービスなので。
『ラジコ』『ラジコプレミアム(エリアフリー聴取)』は日本国内限定のサービスです。
海外からの聴取はできません。
引用元:[radikoヘルプ 海外から聴取できますか?], http://faq.radiko.jp/faq/show/19?category_id=4&page=1&sort=sort_access&sort_order=desc ,(検索年月日:2019年12月16日)
実際にどこの国からアクセスしているか調べるためにipinfo.ioというIPアドレスやその他の情報を取得できるサービスを使ってみました。
詳細はこちらのサイトで紹介されています。
以下のコードを入れて、どこの国からアクセスしているかログに出力させました。(python3.7.5です。)
入れたコード。
import requests
import logging
res = requests.get('http://ipinfo.io')
loggin.debug(f'ipinfo.io content:{res.content}')
ローカルで実行した結果。
ipinfo.io content:b'{\n "ip": "**********",\n "hostname": "*****",\n "city": "*******",\n "region": "******",\n "country": "JP",\n "loc": "******",\n "org": "******",\n "postal": "******",\n "timezone": "Asia/Tokyo",\n "readme": "https://ipinfo.io/missingauth"\n}'
東京ですね。
Croud Runで実行した結果。
2019-12-09 12:15:54.747 JSTDEBUG:root:ipinfo.io content:b'{\n "ip": "**********",\n "hostname": "******.gae.googleusercontent.com",\n "city": "New York City",\n "region": "New York",\n "country": "US",\n "loc": "40.7143,-74.0060",\n "org": "AS15169 Google LLC",\n "postal": "10004",\n "timezone": "America/New_York",\n "readme": "https://ipinfo.io/missingauth"\n}'
"New York"!!!!
国外からのアクセスになっている。それは無理だわ・・・。
ここでリージョンをasia-northeast1にしてもアクセス元が日本になるわけではないことがわかりました。
まとめ
- Cloud Runではリージョンをasia-northeast1にしていてもアクセス元となる。
- アクセス元の国や地域を考慮するWebAPIをCloud Runからコールするときは気をつけないといけない。
じゃあこれはどうやったら解消できるのか?というのを調べてみましたが、わかりませんでした。
ネットワークの問題っぽいなのでGCPのネットワーキングサービスを使えばできるかもしれません。ただ私はネットワークの知識不足でどのプロダクトなら解消できるかドキュメントを読んでもわかりませんでした。
こうすればいいよってわかる方がいたらぜひ教えていただきたいです。