Erhalten Sie regelmäßige Wechselkurse mit Heroku und laden Sie Protokolle zu Amazon S3 hoch

Erstellen Sie eine Entwicklungsumgebung

Erstellen Sie virtualenv

$ mkdir cronapp && cd cronapp
$ mkvirtualenv venv

Melden Sie sich bei Heroku an

(venv)$ heroku login

Python-Bibliothek hinzugefügt

(venv)$ cat >> requirements.txt << EOF
APScheduler==3.0.4
awscli==1.9.11
boto3==1.2.2
botocore==1.3.11
colorama==0.3.3
docutils==0.12
futures==3.0.3
httplib2==0.9
jmespath==0.9.0
pyasn1==0.1.9
python-dateutil==2.4.2
pytz==2015.7
requests==2.8.1
rsa==3.2.3
six==1.10.0
tzlocal==1.2
wheel==0.26.0
EOF
(venv)$ pip install -r requirements.txt

Erstellen Sie ein Skript für die Funktionsprüfung

(venv)$ vi cron.py
from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

@sched.scheduled_job('interval', minutes=3)
def job_3min():
    print('[cron.py:job_3min] Start.')

sched.start()

Procfile hinzugefügt, um das erstellte Skript regelmäßig auszuführen

(venv)$ echo "bot: python cron.py" > Procfile

.Gitignore hinzugefügt

(venv)$ cat >> .gitignore << EOF
venv
*.pyc
.idea
EOF

Erstellen Sie lokal ein Repository

(venv)$ git init && git add . && git commit -m "initial commit"

In Heroku bereitstellen

Erstellen Sie ein Repository in Heroku

(venv)$ heroku create

Anwendung bereitstellen

(venv)$ git push heroku master

Dyno-Prozesszuweisung

(venv)$ heroku ps:scale bot=1

Funktionsprüfung

(venv)$ heroku logs
2015-12-07T01:36:20.343967+00:00 app[bot.1]: [cron.py:job_3min] Start.
2015-12-07T01:39:20.346373+00:00 app[bot.1]: [cron.py:job_3min] Start.
2015-12-07T01:42:20.344067+00:00 app[bot.1]: [cron.py:job_3min] Start.

Erhalten Sie Austauschdaten auf openexchangerates.org und laden Sie sie auf S3 hoch

Cron.py wurde in den folgenden Inhalt geändert

--Erstellen Sie einen AWS IAM-Benutzer und erhalten Sie im Voraus einen API-Schlüssel für Open Exchange Rates.

import requests, json, datetime, pytz, logging
import boto3, botocore
from apscheduler.schedulers.blocking import BlockingScheduler

logging.basicConfig()
sched = BlockingScheduler()

@sched.scheduled_job('cron', minute='10', hour='*/1')
def job_crawl():
    print('[cron.py:job_crawl] Start.')
    
    ####################################
    # API Keys
    ####################################

    OPEN_EXCHANGE_API_URL = 'https://openexchangerates.org/api/latest.json?app_id='
    OPEN_EXCHANGE_APP_ID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    AWS_ACCESS_KEY_ID = 'xxxxxxxxxxxxxxxx'
    AWS_SECRET_ACCESS_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    AWS_REGION_NAME = 'xx-xxxxx-x'
    AWS_S3_BUCKET_NAME = 'xxxxxxxxxxx'

    ####################################
    # Retrieve json data from openexchangerates.com
    ####################################

    res = requests.get(OPEN_EXCHANGE_API_URL + OPEN_EXCHANGE_APP_ID)
    json_data = json.loads(res.text.decode('utf-8'))
    del json_data['disclaimer']
    del json_data['license']
    json_text = json.dumps(json_data)

    timestamp = json_data['timestamp']
    exchange_date = datetime.datetime.fromtimestamp(timestamp, tz=pytz.utc)

    ####################################
    # Upload json data to S3 bucket
    ####################################

    if json_text:

        #
        # AWS Session
        #
        session = boto3.session.Session(aws_access_key_id=AWS_ACCESS_KEY_ID,
                                        aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                                        region_name=AWS_REGION_NAME)
        s3 = session.resource('s3')
        bucket = s3.Bucket(AWS_S3_BUCKET_NAME)

        #
        # Upload Latest
        #
        bucket_latest_key_name = 'exchange/latest.json'
        obj = bucket.Object(bucket_latest_key_name)
        response = obj.put(
            Body=json_text.encode('utf-8'),
            ContentEncoding='utf-8',
            ContentType='application/json'
        )

        #
        # Upload Daily Data
        #
        bucket_prefix_daily = "{0:%Y-%m-%d}".format(exchange_date)
        bucket_daily_key_name = 'exchange/' + bucket_prefix_daily + '/' + bucket_prefix_daily + '.json'
        obj = bucket.Object(bucket_daily_key_name)
        response = obj.put(
            Body=json_text.encode('utf-8'),
            ContentEncoding='utf-8',
            ContentType='application/json'
        )

        #
        # Upload Hourly Data
        #
        bucket_hourly_prefix = "{0:%Y-%m-%d-%H}".format(exchange_date)
        bucket_hourly_key_name = 'exchange/' + bucket_prefix_daily + '/' + bucket_hourly_prefix + '.json'
        try:
            # If json file already exists, do nothing
            s3.Object(AWS_S3_BUCKET_NAME, bucket_hourly_key_name).load()
        except botocore.exceptions.ClientError as e:
            # If json file doesn't exists
            obj = bucket.Object(bucket_hourly_key_name)
            response = obj.put(
                Body=json_text.encode('utf-8'),
                ContentEncoding='utf-8',
                ContentType='application/json'
            )

    print('[cron.py:job_crawl] Done.')


sched.start()

Bereitstellen, um den aktualisierten Inhalt wiederzugeben

(venv)$ git add . && git commit -m "changed cron job"
(venv)$ git push heroku master

Funktionsprüfung

(venv)$ heroku logs
2015-12-07T03:10:00.003862+00:00 app[bot.1]: [cron.py:job_crawl] Start.
2015-12-07T03:10:01.856428+00:00 app[bot.1]: [cron.py:job_crawl] Done.

Bonus

App umbenennen

(venv)$ heroku apps:rename cronapp

Repository ändern

(venv)$ git remote rm heroku
(venv)$ heroku git:remote -a cronapp

Referenzseite

Recommended Posts

Erhalten Sie regelmäßige Wechselkurse mit Heroku und laden Sie Protokolle zu Amazon S3 hoch
Hinweise zum Implementieren des Schlüssels unter Amazon S3 mit Boto 3, Implementierungsbeispiel, Hinweise
Schritte zum Messen der Abdeckung und zum Abrufen von Abzeichen auf codecov.io
POST das ausgewählte Bild auf der Website mit mehrteiligen / Formulardaten und speichere es in Amazon S3! !!
Ich erhalte [Fehler 2055], wenn ich versuche, mit Heroku eine Verbindung zu MySQL herzustellen
[Python] Exportieren Sie regelmäßig mit Lambda aus CloudWatch-Protokollen nach S3
Verschieben Sie CloudWatch-Protokolle regelmäßig mit Lambda nach S3
[Einführung in Systre] Umtausch und Aktien: Verhalten während eines Absturzes ♬
Installieren Sie Anaconda auf Ihrem Mac und laden Sie Ihr Jupyter (IPython) -Notebook in die Anaconda Cloud hoch
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).