19
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS上でPostgreSQL、Scrapy、Metabaseが動く個人用データ収集環境の構築

Last updated at Posted at 2019-04-27

#目指せ百万円!不労所得!
株価分析のための簡単な分析基盤をAWS上に作ろうと思ったら、想像以上に試行錯誤したので、忘備録として。

仕組みとしては

  1. Scrapyを使って株価をサイトからスクレイピング。cronで定期実行。
  2. スクレイピングした株価をデータベースに格納
  3. 格納されたデータをBIツールで可視化

目指せ不労所得は忘れてください。

過去のデータ収集基盤

  • 個人のMac上にdockerで構築。
    • elasticsearch(データベース)
    • kibana(可視化ツール)
    • 自作ウェブスクレイピングプログラム(Python/BeautifulSoup)

試行錯誤した結果のデータ収集基盤

  • AWS EC2
    • PostgreSQL(データベース)
    • Metabase(可視化ツール)
    • Scrapy (Pythonスクレイピング・フレームワーク)
  • AWS lambda
    • EC2の定期起動/定期停止に使用

#なぜAWS上に移行したかったか

  • 当初の構成はできたのはいいが、以下の問題点が
    • スクレイピング中ずっと自分の(ノート)パソコンを起動しっぱなしにするのは、なんだかカッコよくない。
    • 分析するための基盤なのに、スクレイピングプログラムを自分で起動しなければデータを集めてくれない残念仕様。
    • 俺のパソコン、データ容量が足りない
    • AWS試したかった

構築で使うモノ

  • docker
    • 他環境に移植する手間を減らす
    • 個人用途だと必要性は全く感じないがk8s対応も一応視野に
  • Metabase(BIツール)
    • Kibanaの代わり
    • 導入楽そう
    • SQL知らなくても、それなりの図を出してくれそう
  • PostgreSQL(データベース)
    • Elasticsearchの代わり
    • Metabaseとの連携が楽
    • PostgreSQLは色々分析するのに便利な機能があると、どっかで書いていた
  • Scrapy(webスクレイピング・フレームワーク)
    • フレームワーク活用してスクレイピングやった方があとで色々使いまわしやすい
      • 実際、elasticsearchからPostgreSQLに出力先を変える変更は楽だった
    • 個人で一から開発しているとどうしてもハードコーディングが生まれるが、フレームワークに沿って書けば、可読性、可用性の高いプログラムを楽に書ける

断念したもの

環境構築

1. EC2インスタンスの構築

0から始めるAWS入門:概要を参考にVPCとEC2インスタンス(t2.micro)を3つ作成。今回3インスタンスともOSはAmazon Linuxを選択しましたが、dockerを使うのでOSはお好みで。

3インスタンスにdockerdocker-composeをインストール。以下の通りコマンドを入力すればインストールされます(参考:dockerとdocker-composeのインストール(Linux編)

  • ちなみに、下のコマンドを実行しただけだとsudo /usr/local/bin/docker-composeと指定しないとdocker-composeしてくれないので、面倒ならログインユーザーを docker グループに追加する等々してください。
sudo yum update -y
sudo yum install docker -y
sudo systemctl start docker
sudo systemctl enable docker
sudo -i
curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
exit

t2.microだとメモリが心許ないので以下のようにスワップ領域を設定
- スワップファイルを使用して、Amazon EC2 インスタンスのスワップ領域として動作するようにメモリを割り当てる
- AWS Amazon Linux スワップファイル作成によりSwap領域のサイズを増やす

$ sudo dd if=/dev/zero of=/swapfile bs=1G count=2
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo vi /etc/fstab
$ /swapfile swap swap defaults 0 0

2. Postgresインスタンスの構築

docker-composeを使えば、以下のymlをコピペしてdocker-compose up -dすれば環境構築は完了する。

 - postgresql.confPGTuneで適宜設定
 - Postgresのdockerはデータを永続化させる為にボリュームを作成

docker-compose.yml
version: '2'
services:
    postgres:
        image: postgres
        environment:
            POSTGRES_USER: postgres
            POSTGRES_PASSWORD: postgres
            POSTGRES_DB: metabase
        ports:
            - "5432:5432"
        container_name: postgres-db
        volumes:
            - "./postgresql/postgresql.conf:/etc/postgresql.conf"
            - postgres-data:/var/lib/postgresql/data
        command: 'postgres -c config_file="/etc/postgresql.conf"'
        restart: always
volumes:
    postgres-data:
        driver: local

3. Metabaseインスタンス

docker-compose.yml
version: '2'
services:
    metabase:
        image: metabase/metabase
        container_name: metabase
        ports:
            - "3000:3000"
        environment:
            - JAVA_TOOL_OPTIONS=-Xmx1g
            - MB_DB_TYPE=postgres
            - MB_DB_DBNAME=metabase
            - MB_DB_PORT=5432
            - MB_DB_USER=postgres
            - MB_DB_PASS=postgres
            - MB_DB_HOST= 10.0.0.* #Postgres EC2インスタンスのプライベートIP
        restart: always

4. Scrapyインスタンス

Scrapyの環境は以下の通り構築。

ディレクトリ構成
/home/ec2-user/scrapydock
├── Scrapy_Docker
├── docker-compose.yml
├── requirements.txt
└── ScrapyProject
    ├── scrapy.cfg
    └── ScrapyProject
        ├── __init__.py
        ├── __pycache__
        ├── items.py
        ├── middlewares.py
        ├── pipelines.py
        ├── settings.py
        └── spiders
            ├── __init__.py
            └── __pycache__
Scrapy_Docker
FROM python:3.7.2

ARG project_dir=/app/
RUN mkdir $project_dir
ADD requirements.txt $project_dir

RUN apt-get update -y
RUN apt-get install vim -y

WORKDIR $project_dir
RUN pip install -r requirements.txt

ADD ./ScrapyProject $project_dir/ScrapyProject
WORKDIR $project_dir/ScrapyProject
requirements.txt
pandas
scrapy
beautifulsoup4
pytz
xlrd
psycopg2
docker-compose.yml
version: '2'
services:
  nikkei_parser:
    container_name: nikkei_scrapy
    build:
      context : .
      dockerfile: Scrapy_Docker
    tty: true

ディレクトリ構成の通りにファイルを配置できたら、docker-compose buildのみ行う。

crondを使って以下のシェルを管理者権限で定期実行すれば、定期的にウェブスクレイピングを行ってくれます(参考:/etc/crontabと/etc/cron.d設定ファイルの書き方)

scrape.sh
docker rm nik_scrape
docker run --name nik_scrape scrapydock_nikkei_scrapy scrapy crawl nikkei_Spider

##5. Lambdaの設定
3つのインスタンスを24時間起動し続けると無料枠を超えてしまうので、動かしたい時にだけ、EC2を起動します。
できるだけシンプルな仕組みで簡単にEC2の自動起動・停止を実現したい!を参考に。
記事の内容をコピペすれば実現できます。

気になるお値段

  • 2ヶ月ほどこの収集基盤を放置運用しているが、費用は月500円ほどAWSにお支払いしています。

参考(Metabaseの画面)

  • ある企業の株価を表示
スクリーンショット 2019-04-28 4.29.08.png

構築する際に参考にしたもの

19
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?