Google Cloud Platform の GCE で DBインスタンスと接続し、Python定期実行・インスタンスの稼働時間を管理する
仮想サーバー用E2インスタンス
サーバーサービス Compute Engine を使う流れ
プロジェクトを作成し、IAMを付与されたら、インスタンスを作成します。
Google Cloud の VM(compute engine) の中で総所有コストが最も安価という「E2」を選択。サイズも小さいものでお試し。添付画像以外のところはデフォルト値のままにしておく。
E2の説明はこちら
VPC
デフォルトサブネットがすでに用意されているということなので、検索窓から「default」と入力して念のため確認。東京リージョン(asia-east1)があることを確認しておく。
GCP なら SSH接続も簡単
参考記事
公式ドキュメント ブラウザからのSSH
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 の初期化が必要なので、下記を参考に設定する。
以下の表示が出たら完了で「finish」
gcloud の CLI が出てきたら表示に従って進む。
「Y」と入力すると、Google アカウント選択画面が出てくるので該当アカウントを選択し、Google Cloud SDK のアクセスを許可する。
Google Cloud のドキュメントに遷移し、Cloud SDK 認証の完了画面が表示される。
完了した状態だと下記にアクセスできる。
チュートリアルも充実。
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)と紐づける方法
この場合の参考記事がこちら
compute engine に MySQLクライアントを入れる
下記記事を参考に設定する。
Cloud Shell で Python 環境構築する
ブラウザを使い、インフラストラクチャ管理とアプリケーション開発できる「Cloud Shell」を使う。「クイックスタートを見る」でエディタが立ち上がる。
Cloud Shell エディタの起動方法
※Cloud Shell エディタは各インスタンスのコンソール画面の「SSH」横のプルダウンから「gcloud」選択ができるので、そちらを選択すると分かりやすいです。
プロジェクト設定をするために、
gcloud config set project [PROJECT_ID]
Cloud Shell の承認をする
gitHub の該当リポジトリを clone する
git clone [リポジトリのURL等]
Cloud Shell エディタのターミナル上に、clone したリポジトリができていればOK。
Python3用の gcloud コンポーネントをインストールする
※コンポーネントインストールせずにpython3をインストールすることも出来るので、こちらは参考程度に。
参考: App Engine スタンダード環境での Python 3 のクイックスタート
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 定期実行を設定する
参考記事
実行シェルファイル 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