当サイトでは実際に購入した商品のみをレビューし、アフェリエイトリンク付きでご紹介しています
完全無料で実現!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を動かしているんだ🤖
コスト削減のための引越しを考えてて、相談にのってもらえるかな?
了解です!毎日決まった時間にツイートするシンプルなbotなら、コスト効率の良い選択肢がいくつかありますね🌟
AWSのLambda: サーバーレスで、コード実行時間にのみ課金されます。低コストで運用でき、スケジュール設定も簡単です。
Google CloudのCloud Functions: AWS Lambdaと似ており、サーバーレスでイベント駆動型です。Googleのエコシステム内で作業する場合に便利です。
AzureのFunctions: これもサーバーレスでイベント駆動型のオプションです。特にMicrosoftのツールとの連携が必要な場合に適しています。
これらのプラットフォームでは、無料枠も用意されているので、小規模なbotではほとんどコストがかからないことが多いです。どのプラットフォームもAPIを介してTwitterと連携することができるので、Herokuからの移行もスムーズに行えるはずですよ👍✨
移行にあたっての具体的なプロセスや設定方法についてもっと知りたい場合は、教えてくださいね!
Google Cloudを試してみたいんだ!💻✨
月間160ツイートする場合、Cloud Functionsの無料枠に収まるかな?
月間で約160ツイートする場合のコストを見積もりましょう。🔍📊
呼び出し回数: 月160回のツイートは、Google Cloud Functionsの無料枠(毎月200万回の呼び出し)に大きく収まります。
実行時間とメモリ: Twitterボットの関数は通常、実行時間が非常に短く、低メモリで動作します。例えば、1回のツイートに256MBのメモリを割り当て、実行時間が500msだと仮定すると…
これらの数値を使って、月間コストを大まかに計算してみましょう。ただし、これはあくまで概算ですので、実際の実行環境によって異なる場合があります。ちょっと計算してみますね!🧮💡
計算結果によると、このTwitterボットの月間合計コンピューティング時間は約20GB-秒と80GHz-秒です。これに基づく推定コストは、わずか約0.00085米ドル(約0.1円)です。
このコストは非常に低く、実際にはGoogle Cloud Functionsの無料枠内で運用できる可能性が非常に高いです。つまり、実質的なコストはかからないと見て良いでしょう。🎉💸
最新の料金プランはこちらをご確認ください
無料枠内で使える!ということで、いざ引っ越しです🚚
Cloud Functionsへの引っ越しの概要
引っ越しは、すべてGPTのアドバイスのもと進めます🤖
🤖はPythonで書いているんだけど、引っ越せるかな?🐍
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を使用して、特定の時間に関数を実行するスケジュールを設定します。
「エントリポイントの定義」って何?
エントリポイントの定義は、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アカウントの設定
無料枠を利用する場合も、本人確認のためにカード情報の入力が必要です💳
自動請求が無効化されている限り、課金されることはないとのこと。
できた!はやっ!
2. Google Cloud SDKのインストール
Cloud Functionsに入れたよ!😄
どうやって、既存のPythonコードをアップロードすればいいの?⏫
次に、Google Cloud SDKをインストールしましょう!💻
python -V
Vは大文字ですよ、気をつけて!🐍
わたしはM1 macbookだから…
macOS 64 ビット(ARM64, Apple M1 silicon)だね!🍎
Macユーザーならダブルクリックで、.tar.gzを解凍できます。
ターミナルを起動し、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]:
このステップは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にしました
追加したPATHを反映させるため、パソコンを再起動しましょう💻
インストールおつかれさまでした!👏
再起動を待ちながら、一息つきましょう🍵
3. コードの準備
例えば、毎日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
変更点1:
Google Cloud FunctionsでHTTPトリガーを使用する場合、関数はHTTPリクエストオブジェクトを引数として受け取る必要があります。
関数定義を修正して、HTTPリクエストオブジェクトを引数として受け取るようにしましょう。
変更点2:
Google Cloud FunctionsのHTTP関数は、有効なHTTPレスポンス(例えば文字列、FlaskのResponse
オブジェクトなど)を返す必要があります。関数の最後にreturn
文を追加して、適切なHTTPレスポンスを返してください。
わたしは、時間によって異なる関数を呼び出したいため、対応方法を相談します。
毎日、7時と12時にそれぞれ実行したい関数があるんだけど…
どうしたらいい?
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: 複数の関数をデプロイするでやってみるよ!
コードを修正する都度、両方デプロイする必要があるのかな?
はい。方法1を採用し、ソースコードを共有して異なるエントリポイントで複数の関数をデプロイする場合、ソースコードに変更があった際には、それぞれの関数を個別にデプロイし直す必要があります💻
4. 依存関係の管理
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で使ってたものと、ほぼ同じです
Procfileファイルとか、フォルダ内にあるんだけど、
そのままでいいのかな?
Google Cloud Functionsへのデプロイでは、Herokuで使われるProcfile
は必要ありません。Procfile
はHerokuの特定のプラットフォームでアプリケーションの実行方法を指示するために使用されますが、Google Cloud Functionsでは異なる方法で関数の実行が管理されます。
5. デプロイ
ターミナルを起動し、あらかじめソースコードがあるフォルダに移動しておきます
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を押して、先に進みます
ソースコードをアップロードしたいプロジェクトを選びましょう
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):
人もすなるデプロイなるものを、我もしてみむとするなり。
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
APIの環境変数を設定したいんだけど、どうしたらいい?🤖
関数に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"
コードを直すたびに、この引数を実行するのは面倒だね😅
Google Cloud Functionsで関数を再デプロイする際、すでに設定されている環境変数は保持されます。つまり、関数を更新するたびに環境変数を再設定する必要はないのです👍
環境変数は、初めに設定した後は、それを変更する必要がある場合にのみ再設定します。
前の画面で関数名の部分のリンクをクリックし…、
[テスト中]タブの[関数をテストする]ボタンをクリックします
この画面の下部に実行ログが表示されます。
エラーが出力されたら、GPTに相談しましょう💬
記念すべき初めてのCloud Functionsからの投稿!🎉
📖03月02日
— Kindle日替わりセールなど🤖for Engineers (@kindle_sale_jp) March 2, 2024
📖#Kindleセールから1冊ピックアップ
「世界の一流は「雑談」で何を話しているのか」
著者:#ピョートル・フェリクス・グジバチ
セール価格:¥825#ビジネス・経済 #実践経営・リーダーシップ #adhttps://t.co/2ESf96gZJu
あと少しです!🏃
6. スケジュールの設定
コピーアイコンをクリックして、URLをコピー!
スケジュールは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の値はあなたの環境に合わせて、適宜変更してください
GUIから設定ができたか確認をしてみましょう⏰
おつかれさまでした!🍵
設定した時間を待ちながら、のんびりひと休みしましょう🍵
7. Herokuのダウングレード
最後にHerokuのプランをダウングレードして完了です👍
まとめ
この移行プロセスを振り返ってみると、GPTと協力して作業したことが大きな成功の鍵でした🔑
GPTに相談しながら作業を進めたことで、移行は驚くほどスムーズに進みました😳
Web検索を一度も使わなかった環境構築はこれが初めてです。90分ぐらい作業時間を短縮できたのではないかと感じています。
Google Cloud Functionsに移行して、ブラウザから直接スケジュールの実行結果やログを確認できるようになりました!
iPhoneやiPadからも調査できるようになり、運用とデバッグが非常に快適になりました。📱✨
HerokuからCloud Functionsへの移行は、これらのツールとの連携によって、思っていた以上に簡単かつ効率的なプロジェクトになったと思います!
もしもこの記事があなたのお役に立てたのなら、
ぜひXアカウントのフォローをお願いします!🕊
最後まで読んでいただき、ありがとうございます。
みなさまの暮らしがより良くなりますように。