プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Amazonのほしい物リストをRSS化するAPIを作ってみた

 執筆上の都合でAmazonのほしい物リストをRSS化するAPIを作ってみました。構成的には、次のような形です。

f:id:dkfj:20161024072647p:plain

 下記のようなURLで取得できます。wishlist_idの部分に公開のほしい物リストのIDを指定したら使えると思います。

https://wishlist-api.takuros.net/prod?wishlist_id=3G4653SB32HMZ

※効果計測の意味を兼ねて、アフィリエイトタグを付けています。

構成上のポイント



 ほしい物リストからNode.jsのLambdaでスクレイプして、リスト内のタイトルとURL・登録日を取得しています。また次のページがある場合は、再帰的に取得できるようにしています。出力は、RSS 2.0形式のXMLで出力しています。それをAPI Gatewayを利用してHTTPSからキックできるようにしています。CloudFrontとAWS Certificate Manager, Route53は、独自ドメインで証明書付で使えるようにする為です。
 問題点としては、API Gatewayのタイムアウトが30秒ということです。Lambdaは300秒まで使えるので、10ページくらいのリストであれば問題なく取得できます。API Gatewayの方の制約で、3〜4ページくらいでタイムアウトすることが多いです。ということで、現状は1ページのみ取得となっています。ここについては、取得済みのページをキャッシュする機構等が必要かなと考えています。

API GatewayとLambdaのバージョニング・エイリアス



 仮に公開するとなると、本番/開発環境とかバージョニングとか考えるよなと思って、導入しています。改めて使ってみると、よく出来た仕組みです。一方で、手動で管理するには、ちょっとつらい領域ですね。最初からCLIでスクリプト化する方が良さそうです。もしくはフレームワークの導入ですね。あと、API Gateway+独自ドメイン+SSLについては、現状AWS Certificate Manager(ACM)が使えません。ここの所は、何とかして欲しいですね。

CloudFront+API Gateway



 ここのところが、よく解りません。キャッシュの設定やヘッダーの転送等で上手く動かない部分があります。いろいろ確認する必要を感じました。一方で、API Gatewayの実装って、もともとCloudFrontに関わっているので、CloudFrontを噛ます意味があるのかという所で疑問も出てきますね。

改善点



 スクレイプのタイミングが要調整です。キャッシュがあればキャッシュを返して、そのリクエストベースでキューに溜めてスクレイプしておくくらいの割り切った実装がよさそうです。スクレイプ結果はS3に保存してキャッシュ代わりにするという形です。

感想



 どんなつまらないものでも、公開するという前提で考えるといい勉強になりますね。

データを集める技術

データを集める技術

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例