🦥

Google Cloud Platform の GCE で DBインスタンスと接続し、Python定期実行・インスタンスの稼働時間を管理する

2022/04/13に公開

仮想サーバー用E2インスタンス

サーバーサービス Compute Engine を使う流れ

プロジェクトを作成し、IAMを付与されたら、インスタンスを作成します。

Google Cloud の VM(compute engine) の中で総所有コストが最も安価という「E2」を選択。サイズも小さいものでお試し。添付画像以外のところはデフォルト値のままにしておく。

E2の説明はこちら
https://cloud.google.com/blog/ja/products/compute/google-compute-engine-gets-new-e2-vm-machine-types

VPC

デフォルトサブネットがすでに用意されているということなので、検索窓から「default」と入力して念のため確認。東京リージョン(asia-east1)があることを確認しておく。

GCP なら SSH接続も簡単

参考記事
https://qiita.com/NewGyu/items/c34bcddd13d96c740d82

公式ドキュメント ブラウザからのSSH
https://cloud.google.com/compute/docs/ssh-in-browser?hl=ja

GCP検索窓から「vmインスタンス」を検索
「SSH」をクリック

ブラウザ上で専用ターミナルが立ち上がる

E2インスタンスにgitを入れる

E2インスタンスに GCP ダッシュボードからSSH接続をしてターミナルが開いたら、下記を順番に入力していく。

sudo apt-get update
sudo apt-get install git
which git

最終的にインストールされて、結果が下記のようになればOK

/usr/bin/git

E2インスタンスにPython3を入れる

sudo apt-get install python3

Pythonが入った事を確認する

python3 --version

E2インスタンスに仮想環境を準備する

sudo apt-get install python3-venv

仮想環境を有効化する

python3 -m venv env
source env/bin/activate

E2インスタンスにモジュールを入れる

pip install mysql-connector-python
pip install requests
pip install bs4
pip install python-dotenv
pip install lxml

E2インスタンスにpythonファイルを入れる

通常のclone方法と同じ

git clone [リポジトリ]

GCP 専用コマンドラインツール(gcloud)について

gcloudで作成・管理できること

  • Compute Engine 仮想マシン インスタンスと他のリソース
  • Cloud SQL のインスタンス
  • Google Kubernetes Engine クラスタ
  • Dataproc クラスタとジョブ
  • Cloud DNS マネージド ゾーンとレコードセット
  • Cloud Deployment Manager のデプロイ
  • App Engine アプリケーションのデプロイ
  • 認証の管理
  • ローカル構成のカスタマイズ
  • その他タスク実行

gcloudツールとCloud SDK

gcloud を使うには、別途 Cloud SDK をダウンロードしインストール、Cloud SDK の初期化が必要なので、下記を参考に設定する。
https://cloud.google.com/sdk/docs/install?hl=ja
インストーラーをダウンロードして進める。




以下の表示が出たら完了で「finish」

gcloud の CLI が出てきたら表示に従って進む。

「Y」と入力すると、Google アカウント選択画面が出てくるので該当アカウントを選択し、Google Cloud SDK のアクセスを許可する。

Google Cloud のドキュメントに遷移し、Cloud SDK 認証の完了画面が表示される。

完了した状態だと下記にアクセスできる。
https://cloud.google.com/sdk/auth_success
チュートリアルも充実。

DB用インスタンス

Cloud SQL for MySQL instance を使用するにあたって

検索窓から「cloud sql for mysql」と入力するとチュートリアルを確認できる。

SQL DB インスタンスを作成する


MySQL を選択

MySQL インスタンスの作成
インスタンスIDやパスワードは任意のもので入力。
「リージョンとゾーンの可用性の選択」欄の、「ゾーンの可用性」については、今回はテストということもあるので本番環境には非推奨のシングルゾーンを選択してみる。

「インスタンスのカスタマイズ」欄で極力小さいものを選択(テストなので)

VPC ネットワークの外部IPアドレスで静的アドレスを予約

静的アドレスとは、変更されないアドレス。
検索窓で「vpc」と検索したら、VPC ネットワーク→外部IPアドレス→静的アドレスを予約 に進む。

「名前」「Description」「リージョン」を入力したら「予約」をクリック。

IPアドレスの接続先が、接続したいインスタンスが選択できず、「なし」しかない場合は作成後に変更できる。

SQL DB インスタンスに静的アドレスを紐づける

SQL DB インスタンスのダッシュボードに戻り、「接続」から「ネットワークを追加」をクリック

先程作成した静的アドレスを入力して保存する。

SQL DB インスタンスに接続するために、ローカルで使用中のIPアドレスをネットワークに追加する

事前に自分がローカルで使っているIPアドレスを調べておく。
先程の「接続」から「ネットワークを追加」をクリックし、アドレスを追加する。(作業場所が違う場合は追加する必要があるので注意。)追加しておかないと、MySQL Workbench からアクセスできない。

SQL DB インスタンスを扱うための API を有効化する

「Cloud SQL Admin API」と検索窓に入力

GCPダッシュボードからSQL DBインスタンスにアクセスする

「cloud shell」をクリック。

シェルの中にすでに下記コマンドが入力されているのでそのまま Enter

gcloud sql connect [SQLインスタンス名] --user=root --quiet

MySQL Workbench からSQL DBインスタンスにアクセスする

必要な情報

  • SQL DBインスタンスのパブリックIPアドレス
  • ユーザーネーム(ルートユーザー以外を作成していないので root を使用)
  • 作業場所で使用中のIPアドレスがネットワークに追加済かどうか確認しておく。

パブリックIPアドレスはSQL DBインスタンスの GCP ダッシュボードから確認できる。

MySQL Workbenchの設定画面で新たに設定したもの

  • Connection Name: GCP (任意の名前)
  • Username: root
  • Password: インスタンス作成時に作ったもの

MySQL Workbench で DB情報を追加する

準備すること

  • レンタルサーバーにある既存のDBについてSQL形式でエクスポート(ローカルにダウンロード)
  • Windowsの場合、Windows(C;) > ユーザー > ユーザーネーム > OneDrive > ドキュメント > dumps に sqlファイルを移動

MySQL Workbench で該当ファイルを選択
Default Target Schema のところの「New...」ボタンをクリック。
DBの名前となる任意の名前を入力してインポートする。

SQL インスタンスを最初に作って、VM インスタンス(compute engine)と紐づける方法

この場合の参考記事がこちら
https://qiita.com/_kyamasan/items/0f8cb9d2549838dca8f1

compute engine に MySQLクライアントを入れる

下記記事を参考に設定する。
https://zenn.dev/naonao70/articles/cf12356254b249

Cloud Shell で Python 環境構築する

ブラウザを使い、インフラストラクチャ管理とアプリケーション開発できる「Cloud Shell」を使う。「クイックスタートを見る」でエディタが立ち上がる。
https://cloud.google.com/shell?hl=ja

Cloud Shell エディタの起動方法

※Cloud Shell エディタは各インスタンスのコンソール画面の「SSH」横のプルダウンから「gcloud」選択ができるので、そちらを選択すると分かりやすいです。

https://cloud.google.com/shell/docs/launching-cloud-shell-editor?hl=ja
一番簡単なのは、下記にアクセスしてエディタを直接起動すること。
https://ide.cloud.google.com/?hl=ja
添付↓の箇所にコマンドを入力できるので、

プロジェクト設定をするために、

gcloud config set project [PROJECT_ID]

Cloud Shell の承認をする
gitHub の該当リポジトリを clone する

git clone [リポジトリのURL等]

Cloud Shell エディタのターミナル上に、clone したリポジトリができていればOK。

Python3用の gcloud コンポーネントをインストールする

※コンポーネントインストールせずにpython3をインストールすることも出来るので、こちらは参考程度に。

参考: App Engine スタンダード環境での Python 3 のクイックスタート
https://cloud.google.com/appengine/docs/standard/python3/create-app?hl=ja

Python3用の App Engine 拡張機能が含まれる gcloudコンポーネントをインストール

sudo apt-get install google-cloud-sdk-app-engine-python

下記のようになるとインストール完了。

分離された Python 環境の作成

python3 -m venv env
source env/bin/activate

必要なモジュールのインストール

source myenv/bin/activate
pip install mysql-connector-python
pip install requests
pip install bs4
pip install python-dotenv
pip install lxml

Python 用の cron 定期実行を設定する

実行シェルファイル execute.sh の作成

Compute Engine(E2)のコンソール画面から「gcloudコマンドを表示」をクリック。

SSH通信でgcloudコマンドラインを使う事になるので、下記画像が表示されたら「CLOUD SHELLで実行」をクリック。

ターミナルに下記がデフォルトで入っているのでこのまま Enter。

gcloud compute ssh --zone "asia-northeast1-b" "仮想マシンE2インスタンス名"  --tunnel-through-iap --project "プロジェクト名"

該当ディレクトリに移動し、その中に定期実行用のシェルファイルを作成する。

vi execute.sh

ファイル内容

#!/bin/sh

sudo apt-get install python3 -y
python3 -m venv myenv
. myenv/bin/activate
pip install mysql-connector-python
pip install requests
pip install bs4
pip install python-dotenv
pip install lxml

python /home/ユーザー名/ディレクトリ名/実行ファイル.py

実行シェルファイルの権限付与しないといけない場合は

chmod 700 /home/ユーザー名/該当ディレクトリ/execute.sh

execute.sh 用のcron 設定ファイルを編集する

crontab をルート権限で開く。

sudo crontab -e

先程作成した execute.sh を定期実行するための内容を入力する。
エラーログを取るための処理も入力。
先頭 「*」は、日時指定のコマンド。
1つめ: 分
2つめ: 時
3つめ: 日
4つめ: 月
5つめ: 曜日(0と7は日曜日)
書き方の例が下記

56 2 * * * /home/ユーザー名/該当ディレクトリ/execute.sh > /home/ユーザー名/該当ディレクトリ/cron-error.log 2>&1

空のエラーログファイルを作成しておく。

vi cron-error.log 
# もしくは 
touch cron-error.log

実際に実行した場合のエラーログを見ると、成功した場合はその内容、失敗した場合はエラー内容が記載されている。
該当ディレクトリにて。確認方法

cat cron-error.log

エラーメッセージ「Permission denied」と出たら

E2インスタンスの設定で、APIごとのアクセス権の設定を変える必要があります。
E2インスタンスを停止したら、デフォルト権限だと下記になっているので、

Cloud SQL(DBインスタンス)とCompute Engine(E2インスタンス)の権限を変更して保存します。

DBインスタンス 起動・停止用の cron 定期実行を設定する

参考記事
https://yuki-toida.hatenablog.com/entry/2017/10/31/164002

実行シェルファイル terminal-cron-start.sh の作成

該当ディレクトリにて

vi terminal-cron-start.sh

ファイルの編集

gcloud sql instances patch DBインスタンス名 --activation-policy ALWAYS

実行シェルファイル terminal-cron-stop.sh の作成

該当ディレクトリにて

vi terminal-cron-stop.sh

ファイルの編集

gcloud sql instances patch DBインスタンス名 --activation-policy NEVER

DBインスタンス起動・Python実行・DBインスタンス停止 cron設定

cron設定をする。

sudo crontab -e

iモードで編集する。

30 0 * * 1-5 sh /home/ユーザー名/該当ディレクトリ/terminal-cron-start.sh > /home/ユーザー名/該当ディレクトリ/cron-error.log 2>&1

40 0 * * 1-5 sh /home/ユーザー名/該当ディレクトリ/execute.sh > /home/ユーザー名/該当ディレクトリ/cron-error.log 2>&1

50 0 * * 1-5 sh /home/ユーザー名/該当ディレクトリ/terminal-cron-stop.sh > /home/ユーザー名/該当ディレクトリ/cron-error.log 2>&1

「コントロールx」で save に 「y」と入力して閉じる。

Discussion