クラウド機能をクラウドに移す


エーcron ジョブは指定された間隔でサーバ上でプログラムを実行する方法です.これはしばしば、いくつかの反復タスクを行う小さなスクリプトで、メトリックを収集したり、サービスのヘルスをチェックしたり、いくつかのデータセットのスナップショットを取るなどです.
cronユーティリティはcrontabファイルと呼ばれる非常にカスタマイズ可能な形式を持っています.あなたのスクリプトを頻繁に1分として実行することができますし、頻繁に1年に1回.
ほとんどの場合、cronジョブはいくつかの入力を受け取り、少し処理を行い、出力を生成します.入力は、Webページ、別のアプリケーション、データベースなどです.出力は、データベース内のテーブルに行を追加したり、ストレージにファイルを入れたり、メッセージを送信するためのものです.

cronジョブの使用
cronジョブには多くの用途があります:あなたが繰り返し可能な方法で起こりたいものはcronジョブにすることができます.
私がcron仕事を使うのが好きである1つのものは、私が頻繁に訪問するウェブサイトの目を保つことです.例えば、記事を見たいですHacker News Serverlessについては、私はそれを毎日チェックする時間がないし、すべてのポストのタイトルを見て、それがPythonについてのかどうかを確認します.
代わりに、私はcronジョブを書くことができます.その手順は、次のようになる.
  • 一日一日、APIからトップ記事を取得する
  • すべての物語を繰り返します
  • いずれかのタイトルが"Serverless "とマッチする場合:
  • リンクでメールを送る
  • スクリプトです.
    #!/usr/bin/python
    
    import requests
    from utils import send_email
    
    api_url = 'https://hacker-news.firebaseio.com/v0/'
    top_stories_url = api_url + 'topstories.json'
    item_url = api_url + 'item/{}.json'
    
    def scan_hacker_news()
        # Make a request to the API
        top_stories = requests.get(top_stories_url).json()
        serverless_stories = []
    
        # Iterate over every story
        for story_id in top_stories:
            story = requests.get(item_url.format(story_id)).json()
            if 'serverless' in story['title'].lower():
                serverless_stories.append(story)
    
        # If there are any, send an email
        if serverless_stories:
            send_email(serverless_stories)
    
    これは、APIに要求を行い、すべての物語を繰り返し、タイトルの“Serverless”を持っている物語をフィルタリングし、私にメール(私たちは読者に運動としてその機能を残して)を送信します.
    私がLinuxマシンでcronジョブとして設定したいなら、ファイルに保存しますsend_me_pythons.py ), 実行可能にするchmod 755 send_me_pythons.py ) そして、それを私のローカルビンに入れてください/usr/local/bin/send_me_pythons.py ).
    それから、私はcrontabを編集します/etc/crontab ) 次の行を追加します.
    0 0 * * * /usr/local/bin/send_me_pythons.py
    
    これは真夜中に1日1回スクリプトを実行します.私のようにhttps://crontab.guru/ 設定する前にcrontabが正しいことを確認します.以下に各フィールドの図を示します.
    # 0 0 * * * /usr/local/bin/send_me_pythons.py
    # │ │ │ │ │ └── run this script
    # │ │ │ │ └──── every year
    # │ │ │ └────── every month
    # │ │ └──────── every day
    # │ └────────── at hour zero
    # └──────────── at minute zero
    
    crontabがセットされると、私のマシンは新しいcronジョブを取り上げ、指定したとおりに実行します.

    スクリプトをクラウドに動かす
    これは素晴らしいですが、それは1つの巨大なダウンサイドを持っています:今私はメールを送信することを確認するために私のサーバーを維持し、実行している必要があります、さもなければ、私は貴重なサーバーレスコンテンツを欠落しているでしょう.そして、これはさらに私がこの1つのスクリプトを一日一回実行する他のもののためにこのサーバーを使用しなければならないという事実によってさらに複雑です.理想的でない.
    代わりに、この関数を雲にしましょう.最初に、我々はそれをAに変えますGoogle Cloud Function . 既存のスクリプトをPython関数でラップし、それをmain.py :
    import requests
    from utils import send_email
    
    api_url = 'https://hacker-news.firebaseio.com/v0/'
    top_stories_url = api_url + 'topstories.json'
    item_url = api_url + 'item/{}.json'
    
    def send_pythons(request):
        # Make a request to the API
        top_stories = requests.get(top_stories_url).json()
        serverless_stories = []
    
        # Iterate over every story
        for story_id in top_stories:
            story = requests.get(item_url.format(story_id)).json()
            if 'serverless' in story['title'].lower():
                serverless_stories.append(story)
    
        # If there are any, send an email
        if serverless_stories:
            send_email(serverless_stories)
    
    注意:関数が呼び出される度に実際に起こる必要のある行だけがsend_pythons 関数.import文は、関数がロードされたときに一度だけ実行する必要があり、関数の外側に残されます.
    次に、依存関係を定義します.私たちはrequests , それで、我々はそれを我々に入れなければなりませんrequirements.txt :
    requests==2.20.0
    
    そして、これを展開します gcloud コマンドラインツール
    $ gcloud beta functions deploy test --runtime python37 --trigger-http
    
    これによってエンドポイントが得られます.
    https://us-central1-[PROJECT_ID].cloudfunctions.net/send_pythons
    
    とHTTPを作るGET そのエンドポイントへの要求は、私たちの関数が実行される結果になります.

    クラウド内のスクリプトのスケジューリング
    今、我々は雲の中の関数としてスクリプトを持っています.我々は、新しいGoogleのクラウドスケジューラのジョブを作成することができますgcloud コマンドラインツール
    $ gcloud beta scheduler jobs create http send_pythons_job \
        --schedule="0 0 * * *" \
        --uri=https://us-central1-[PROJECT_ID].cloudfunctions.net/send_pythons
    
    これは私たちの仕事の名前を指定します.send_pythons_job , プロジェクトごとにユニークです.また、上記のcrontabスケジュールを指定し、作成したHTTP関数にジョブを指し示します.
    我々の仕事をリストすることができます.
    $ gcloud beta scheduler jobs list --project=$PROJECT
    ID                LOCATION     SCHEDULE (TZ)        TARGET_TYPE  STATE
    send_pythons_job  us-central1  0 0 * * * (Etc/UTC)  HTTP         ENABLED
    
    そして、スケジュールから仕事を実行したいなら、コマンドラインから実行できます.
    $ gcloud beta scheduler jobs run send_pythons_job
    

    次の手順
    雲の機能+雲スケジューラで行うことができますもっとたくさんあります!次のリンクに従ってください.
  • Schedule more complex tasks with Cloud Scheduler
  • Use Cloud Scheduler and Pub/Sub to trigger a Cloud Function
  • App Engineからメールを送るMailjet or SendGrid
  • すべてのコードは、Google