MENU

    完全無料で実現!HerokuからGoogle Cloud Functionsへの移行手順〜chatGPT活用事例〜

    完全無料で実現!HerokuからGoogle Cloud Functionsへの移行手順〜chatGPT活用事例〜

    当サイトでは実際に購入した商品のみをレビューし、アフェリエイトリンク付きでご紹介しています

    X(Twitter)のbot🤖の実行環境を、HerokuからGoogle Cloudへ引っ越しました🚚

    月額5ドルのコスト削減に成功です!🌟

    しかも今回は一度もWeb検索をせずに、GPTに相談しながら環境を構築しました💻

    この記事では、HerokuからGoogle Cloud(Cloud Functions)への移行手順を紹介します。

    目次

    HerokuからCloud Functionsへ移行する理由

     Herokuは、2022年11月から有償になり、最低でも、月額5ドルの費用がかかります💸(2024.03現在)

     コストについてGPTに相談してみました💬

     

    Heroku環境から、毎日定期的にツイートするTwitter botを動かしているんだ🤖
    コスト削減のための引越しを考えてて、相談にのってもらえるかな?

    GPT4

    了解です!毎日決まった時間にツイートするシンプルなbotなら、コスト効率の良い選択肢がいくつかありますね🌟

    AWSのLambda: サーバーレスで、コード実行時間にのみ課金されます。低コストで運用でき、スケジュール設定も簡単です。

    Google CloudのCloud Functions: AWS Lambdaと似ており、サーバーレスでイベント駆動型です。Googleのエコシステム内で作業する場合に便利です。

    AzureのFunctions: これもサーバーレスでイベント駆動型のオプションです。特にMicrosoftのツールとの連携が必要な場合に適しています。
    これらのプラットフォームでは、無料枠も用意されているので、小規模なbotではほとんどコストがかからないことが多いです。どのプラットフォームもAPIを介してTwitterと連携することができるので、Herokuからの移行もスムーズに行えるはずですよ👍✨

    移行にあたっての具体的なプロセスや設定方法についてもっと知りたい場合は、教えてくださいね!

     

    Google Cloudを試してみたいんだ!💻✨
    月間160ツイートする場合、Cloud Functionsの無料枠に収まるかな?

    GPT4

    月間で約160ツイートする場合のコストを見積もりましょう。🔍📊

    呼び出し回数: 月160回のツイートは、Google Cloud Functionsの無料枠(毎月200万回の呼び出し)に大きく収まります。

    実行時間とメモリ: Twitterボットの関数は通常、実行時間が非常に短く、低メモリで動作します。例えば、1回のツイートに256MBのメモリを割り当て、実行時間が500msだと仮定すると…

    これらの数値を使って、月間コストを大まかに計算してみましょう。ただし、これはあくまで概算ですので、実際の実行環境によって異なる場合があります。ちょっと計算してみますね!🧮💡 ​​

    計算結果によると、このTwitterボットの月間合計コンピューティング時間は約20GB-秒と80GHz-秒です。これに基づく推定コストは、わずか約0.00085米ドル(約0.1円)です。

    このコストは非常に低く、実際にはGoogle Cloud Functionsの無料枠内で運用できる可能性が非常に高いです。つまり、実質的なコストはかからないと見て良いでしょう。🎉💸

    最新の料金プランはこちらをご確認ください

    無料枠内で使える!ということで、いざ引っ越しです🚚

    Cloud Functionsへの引っ越しの概要

     引っ越しは、すべてGPTのアドバイスのもと進めます🤖

     

    🤖はPythonで書いているんだけど、引っ越せるかな?🐍

    GPT4

    Pythonで書かれたTwitterボットなら、Google Cloud Functionsに引っ越すのは全然問題ありませんよ!🐍✈️

    Google Cloud FunctionsはPythonをサポートしているので、Herokuで動いているPythonのコードをそのまま、あるいは少しの修正で移行できます。基本的なステップはこんな感じです:

    1. Google Cloudアカウントの設定: Google Cloudにサインアップし、プロジェクトを作成します。

    2. Google Cloud SDKのインストール: ローカルマシンにGoogle Cloud SDKをインストールし、認証します。

    3. コードの準備: Herokuで動いているPythonコードを、Cloud Functions用に調整します。特に、エントリポイント(関数)の定義が重要です。

    4. 依存関係の管理: requirements.txtを使って、必要なPythonライブラリを指定します。

    5. デプロイ: Cloud Functionsにコードをデプロイします。これはCLIを使って行うことができます。

    6. スケジュールの設定: Cloud Schedulerを使用して、特定の時間に関数を実行するスケジュールを設定します。

     

    「エントリポイントの定義」って何?

    GPT4

    エントリポイントの定義は、Google Cloud Functionsで特に重要な部分ですね!🚪🔑

    エントリポイントは、Cloud Functionsが関数を呼び出す際に使用する関数名を指します。簡単に言うと、あなたのコードの「スタート地点」です。Cloud Functionsはこのエントリポイントを通じて、コードを実行します。

    たとえば、Pythonで書かれた関数があるとします:

    def tweet_at_scheduled_time(event, context): # ここにツイートを送信するコード ...

    この場合、tweet_at_scheduled_timeがエントリポイントになります。Cloud Functionsを設定する際に、この関数名をエントリポイントとして指定します。

    Cloud Functionsをデプロイする時には、コマンドラインで以下のようにエントリポイントを指定します:

    gcloud functions deploy [FUNCTION_NAME] --entry-point tweet_at_scheduled_time ...

    ここで、[FUNCTION_NAME]はGoogle Cloud上での関数名で、tweet_at_scheduled_timeはあなたのコード内の関数名です。

    要するに、エントリポイントはあなたのコード内で、Cloud Functionsが「どの関数を実行すべきか」を知るための指針となるものです。これにより、Cloud Functionsは正しい関数を適切なタイミングで実行できるようになります。🌟💻

     基礎知識も教えてもらえて、ありがたい!😆🤖

     「エントリポイントの定義」は体験したことのない概念ですが、要するに「最初にキックされる関数名を明らかにしなさい」ということですね☝️

     習うより慣れろと言いますし、早速やってみましょう🏃

    Cloud Functionsへの移行手順

    1. Google Cloudアカウントの設定

    STEP
    Cloud Functionsへアクセス
    STEP
    [Functionsの無料トライアル]をクリック
    Google Cloud Functions
    STEP
    Googleアカウントにログインし、[同意して続行]をクリック
    Google Cloud Functions
    STEP
    お支払い情報を入力

    無料枠を利用する場合も、本人確認のためにカード情報の入力が必要です💳
    自動請求が無効化されている限り、課金されることはないとのこと。

    Google Cloud Functions
    STEP
    カンタンなアンケートに答えた後、早速アカウントができました!
    Google Cloud Functions
     

    できた!はやっ!

    STEP
    プロジェクトの選択画面から「新しいプロジェクト」をクリック
    Google Cloud Functions
    STEP
    プロジェクト名を入力し、[作成]をクリック
    Google Cloud Functions
    STEP
    ヘッダ部分に『Cloud Functions』と入力し、表示されたメニューをクリック
    Google Cloud Functions
    STEP
    これが、はじめてのCloud Functionsの画面!
    Google Cloud Functions

    2. Google Cloud SDKのインストール

     

    Cloud Functionsに入れたよ!😄
    どうやって、既存のPythonコードをアップロードすればいいの?⏫

    GPT4

    次に、Google Cloud SDKをインストールしましょう!💻

    STEP
    「gcloud CLIをインストールする」にアクセス
    STEP
    Pythonのバージョンを確認する
    python -V
    GPT4

    Vは大文字ですよ、気をつけて!🐍

    STEP
    自分に合ったパッケージファイルをダウンロード
     

    わたしはM1 macbookだから…
    macOS 64 ビット(ARM64, Apple M1 silicon)だね!🍎

    STEP
    ダウンロードしたファイルを解凍する

    Macユーザーならダブルクリックで、.tar.gzを解凍できます。

    STEP
    解凍したフォルダ内の「install.sh」をCUIで実行

    ターミナルを起動し、install.shへのPATHを書いて、Enterキーで実行です👍

    ~ $./google-cloud-sdk/install.sh
    Welcome to the Google Cloud CLI!
    
    To help improve the quality of this product, we collect anonymized usage data
    and anonymized stacktraces when crashes are encountered; additional information
    is available at <https://cloud.google.com/sdk/usage-statistics>. This data is
    handled in accordance with our privacy policy
    <https://cloud.google.com/terms/cloud-privacy-notice>. You may choose to opt in this
    collection now (by choosing 'Y' at the below prompt), or at any time in the
    future by running the following command:
    
        gcloud config set disable_usage_reporting false
    
    Do you want to help improve the Google Cloud CLI (y/N)?  y
    
     

    ここはyを選んでみました😃

    色々表示されて…

    The Google Cloud SDK installer will now prompt you to update an rc file to bring
     the Google Cloud CLIs into your environment.
    
    Enter a path to an rc file to update, or leave blank to use
    [/Users/XXXXX/.bash_profile]:
    GPT4

    このステップはGoogle Cloud CLIをインストールする際に、あなたのシェル環境が自動的にgcloudコマンドを認識できるように設定ファイルを更新するかどうかを尋ねています。デフォルトの選択肢で問題ない場合は、何も入力せずにEnterキーを押すと、自動的に設定が完了します。👍💻🌐

     

    Enterキーを押して、設定をします

    Start a new shell for the changes to take effect.
    
    Google Cloud CLI works best with Python 3.11 and certain modules.
    
    Download and run Python 3.11 installer? (Y/n)?
     

    ここは既存環境を優先して、nにしました

    STEP
    パソコンを再起動する

    追加したPATHを反映させるため、パソコンを再起動しましょう💻

    インストールおつかれさまでした!👏
    再起動を待ちながら、一息つきましょう🍵

    猫の挿絵

    3. コードの準備

    STEP
    呼び出し部分の関数定義を変更する
     

    例えば、毎日7時に実行する関数を
    Heroku環境では、以下のように記述していました

    Heroku用のコードはこちら

    scheduler = BlockingScheduler()
    @scheduler.scheduled_job("cron", hour=7)
    def Cron0700():
        tweetKindleSale()
     

    これを、Cloud Functions用に以下のように修正します

    Cloud Functions用のコードはこちら

    def Cron0700(request):
        tweetKindleSale()
        return 'Success', 200
    GPT4

    変更点1:
    Google Cloud FunctionsでHTTPトリガーを使用する場合、関数はHTTPリクエストオブジェクトを引数として受け取る必要があります。
    関数定義を修正して、HTTPリクエストオブジェクトを引数として受け取るようにしましょう。

    GPT4

    変更点2:
    Google Cloud FunctionsのHTTP関数は、有効なHTTPレスポンス(例えば文字列、FlaskのResponseオブジェクトなど)を返す必要があります。関数の最後にreturn文を追加して、適切なHTTPレスポンスを返してください。

    STEP
    異なる関数を呼び出したい場合の対応について、相談

    わたしは、時間によって異なる関数を呼び出したいため、対応方法を相談します。

     

    毎日、7時と12時にそれぞれ実行したい関数があるんだけど…
    どうしたらいい?

    GPT4

    Google Cloud Functionsでは、各関数は基本的に単一のエントリポイント(関数名)を持ちます。しかし、複数の異なるスケジュールで異なるタスクを実行したい場合、いくつかの方法でこれを実現できます。

    方法1: 複数の関数をデプロイする
    最も単純な方法は、それぞれのスケジュールに合わせて異なる関数をデプロイすることです。つまり、7時に実行したいタスク用の関数と、12時に実行したいタスク用の別の関数を作成します。この方法では、それぞれの関数に異なるエントリポイントが設定されます。

    方法2: 単一の関数内で条件分岐
    もう一つの方法は、単一の関数内で時間に基づいて異なるアクションを実行するようにロジックを構築することです。この場合、関数は同じエントリポイントを持ちますが、関数内で現在の時間をチェックし、7時ならあるアクションを、12時なら別のアクションを実行するようにコードを書きます。

    Google Cloud Schedulerの使用
    どちらの方法を選択しても、Google Cloud Schedulerを使用して、指定した時間に関数をトリガーする必要があります。Cloud Schedulerを使用してCronジョブを作成し、7時と12時にそれぞれ関数を呼び出すように設定できます。
    例:
    方法1の場合、二つの異なるCronジョブを作成し、それぞれ異なる関数を指定します。
    方法2の場合、二つのCronジョブを作成しますが、どちらも同じ関数を指定し、関数内のロジックで時間に基づいて異なるアクションを実行させます。

    どちらの方法も実装には異なるアプローチが必要ですが、どちらも有効で柔軟なソリューションを提供します。自分のニーズに最適な方法を選択してください。👨‍💻🕒💡

     

    方法1: 複数の関数をデプロイするでやってみるよ!
    コードを修正する都度、両方デプロイする必要があるのかな?

    GPT4

    はい。方法1を採用し、ソースコードを共有して異なるエントリポイントで複数の関数をデプロイする場合、ソースコードに変更があった際には、それぞれの関数を個別にデプロイし直す必要があります💻

    4. 依存関係の管理

    STEP
    ソースコードと同じフォルダにrequirements.txtを用意する
    GPT4

    requirements.txtファイルは、Pythonプロジェクトにおける重要な要素の一つです。このファイルは、プロジェクトが依存する外部Pythonライブラリの一覧を記載するために使用されます。以下、その必要性について詳しく説明します💬

    依存関係の明確化:
    requirements.txtには、プロジェクトで使用する外部ライブラリやパッケージがリストアップされます。これにより、プロジェクトを正しく動作させるために必要な依存関係が明確になります。

    環境再現の容易さ:
    新しい環境(例えば、別の開発者のマシン、サーバー、CI/CDパイプラインなど)でプロジェクトをセットアップする際、requirements.txtを用いて必要なライブラリを一括でインストールできます。これにより、環境の再現が容易になります。

    バージョン管理:
    ライブラリの特定のバージョンに依存する場合、それをrequirements.txtで指定できます。これにより、異なる環境間でのライブラリのバージョンの一貫性が保たれます。

    デプロイメントの自動化:
    多くのデプロイメントツールやサービス(例:Heroku、Google Cloud Functionsなど)は、requirements.txtを見て自動的に必要なライブラリをインストールします。これにより、デプロイメントプロセスが自動化され、簡素化されます。

    requirements.txtの中身はこんな感じ

    tweepy
    apscheduler
    python-amazon-paapi
    Bs4
    Lxml
    pytz
     

    Herokuで使ってたものと、ほぼ同じです

    STEP
    不要なファイルを移動する
     

    Procfileファイルとか、フォルダ内にあるんだけど、
    そのままでいいのかな?

    GPT4

    Google Cloud Functionsへのデプロイでは、Herokuで使われるProcfileは必要ありません。ProcfileはHerokuの特定のプラットフォームでアプリケーションの実行方法を指示するために使用されますが、Google Cloud Functionsでは異なる方法で関数の実行が管理されます。

    5. デプロイ

    STEP
    gcloud initコマンドを実行する

    ターミナルを起動し、あらかじめソースコードがあるフォルダに移動しておきます

    gcloud init
    Welcome! This command will take you through the configuration of gcloud.
    
    Your current configuration has been set to: [default]
    
    You can skip diagnostics next time by using the following flag:
      gcloud init --skip-diagnostics
    
    Network diagnostic detects and fixes local network connection issues.
    Checking network connection...done.
    Reachability Check passed.
    Network diagnostic passed (1/1 checks passed).
    
    You must log in to continue. Would you like to log in (Y/n)?
     

    yを押して、先に進みます

    STEP
    Googleアカウントでログインする
    Google Cloud Functions
    STEP
    [許可]をクリック
    Google Cloud Functions
    STEP
    デプロイ先のプロジェクトを選ぶ

    ソースコードをアップロードしたいプロジェクトを選びましょう

    Pick cloud project to use:
     [1] project-name-XXXXX1
     [2] project-name-XXXXX2
     [3] Enter a project ID
     [4] Create a new project
    Please enter numeric choice or text value (must exactly match list item):
    STEP
    gcloud functions deployコマンドでデプロイする

    人もすなるデプロイなるものを、我もしてみむとするなり。

    gcloud functions deploy Cron0700 --runtime python39 --trigger-http --entry-point Cron0700
    
    In a future Cloud SDK release, new functions will be deployed as 2nd gen  functions by default. This is equivalent to currently deploying new  with the --gen2 flag. Existing 1st gen functions will not be impacted and will continue to deploy as 1st gen functions.
    You can preview this behavior in beta. Alternatively, you can disable this behavior by explicitly specifying the --no-gen2 flag or by setting the functions/gen2 config property to 'off'.
    To learn more about the differences between 1st gen and 2nd gen functions, visit:
    https://cloud.google.com/functions/docs/concepts/version-comparison
    Created .gcloudignore file. See `gcloud topic gcloudignore` for details.
    API [cloudbuild.googleapis.com] not enabled on project [project-name-XXXXX1].
    Would you like to enable and retry (this will take a few minutes)? (y/N)?  y
    
    Enabling service [cloudbuild.googleapis.com] on project [project-name-XXXXX1]...
    Operation "operations/acf.p2-XXXXXX-XXX-XXXX-XXXX-XXX-XXXXXXX" finished successfully.
    Allow unauthenticated invocations of new function [Cron0700]? (y/N)?  y
    
    Deploying function (may take a while - up to 2 minutes)...working
    STEP
    環境変数を定義してデプロイする
     

    APIの環境変数を設定したいんだけど、どうしたらいい?🤖

    GPT4

    関数にAPIの環境変数を設定する手順を説明します。

    Google Cloud Functionsでは、環境変数は関数をデプロイする際、または関数を更新する際に設定できます。APIのキーなどの秘密情報は、環境変数を通じて安全に管理されるべきです🔐

    環境変数を設定するには、gcloud functions deploy コマンドに --set-env-vars オプションを追加します。たとえば、APIのアクセスキーとシークレットキーを設定するには、次のようにします:

    gcloud functions deploy Cron0700 --runtime python39 --trigger-http --entry-point Cron0700 --set-env-vars ACCESS_KEY="your_access_key",SECRET_KEY="your_secret_key"

    セキュリティ: APIキーは機密情報です。コマンドラインでの入力はログに記録される可能性があるため、環境変数の設定は慎重に行ってください。

    環境変数の変数名及び設定値は、あなたのコードに合わせて適宜変更が必要です

    gcloud functions deploy Cron0700 --runtime python39 --trigger-http --entry-point Cron0700 --set-env-vars ACCESS_KEY="your_access_key",SECRET_KEY="your_secret_key"
     

    コードを直すたびに、この引数を実行するのは面倒だね😅

    GPT4

    Google Cloud Functionsで関数を再デプロイする際、すでに設定されている環境変数は保持されます。つまり、関数を更新するたびに環境変数を再設定する必要はないのです👍

    環境変数は、初めに設定した後は、それを変更する必要がある場合にのみ再設定します。

    STEP
    初めてのデプロイ!
    Google Cloud Functions
    STEP
    テスト実行してみよう

    前の画面で関数名の部分のリンクをクリックし…、

    [テスト中]タブの[関数をテストする]ボタンをクリックします

    Google Cloud Functions
    GPT4

    この画面の下部に実行ログが表示されます。

    エラーが出力されたら、GPTに相談しましょう💬

    記念すべき初めてのCloud Functionsからの投稿!🎉

    あと少しです!🏃

    猫の挿絵

    6. スケジュールの設定

    STEP
    スケジュールから実行すべき、トリガーURLを確認する

    コピーアイコンをクリックして、URLをコピー!

    STEP
    スケジュールを設定する
    GPT4

    スケジュールはCUI、GUIどちらからでも設定できます。
    今回はCUIからコマンドを実行してみましょう。

    以下は、日本時間の午前7時に、https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAMEを実行するコマンドです。

    gcloud scheduler jobs create http JOB_NAME \
      --schedule="0 7 * * *" \
      --time-zone="Asia/Tokyo" \
      --http-method=GET \
      --uri="https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME"

    JOB_NAME, uriの値はあなたの環境に合わせて、適宜変更してください

    STEP
    Cloud Schedule管理画面に移動

    GUIから設定ができたか確認をしてみましょう⏰

    STEP
    実行したコマンドが反映されていることを確認
    STEP
    設定した時間を待つ

    おつかれさまでした!🍵
    設定した時間を待ちながら、のんびりひと休みしましょう🍵

    猫の挿絵007

    7. Herokuのダウングレード

    最後にHerokuのプランをダウングレードして完了です👍

    まとめ

     この移行プロセスを振り返ってみると、GPTと協力して作業したことが大きな成功の鍵でした🔑

     GPTに相談しながら作業を進めたことで、移行は驚くほどスムーズに進みました😳
     Web検索を一度も使わなかった環境構築はこれが初めてです。90分ぐらい作業時間を短縮できたのではないかと感じています。

     Google Cloud Functionsに移行して、ブラウザから直接スケジュールの実行結果やログを確認できるようになりました!

     iPhoneやiPadからも調査できるようになり、運用とデバッグが非常に快適になりました。📱✨

     HerokuからCloud Functionsへの移行は、これらのツールとの連携によって、思っていた以上に簡単かつ効率的なプロジェクトになったと思います!

    もしもこの記事があなたのお役に立てたのなら、
    ぜひXアカウントのフォローをお願いします!🕊

    最後まで読んでいただき、ありがとうございます。
    みなさまの暮らしがより良くなりますように。

    お役に立てたら幸いです
    • URLをコピーしました!
    • URLをコピーしました!
    目次