🐘

【Google Cloud】無料でできる!Compute EngineにPostgreSQLを導入する方法

に公開

「Google Cloudでデータベースを動かしたいけど、Cloud SQL は料金がかかるからヤダ」と考えている方に向けて、Compute Engine を使って PostgreSQL をインストールする手順を紹介します。
Compute Engine の無料枠を利用することで、タダでデータベースを使わせてもらおうという方法です。
無料枠の概要は以下の通りです。詳細はこちらを参照してください。

項目 無料枠の対象
マシンタイプ e2-micro × 1
リージョン us-west1, us-central1, us-east1
ディスク 月30GB(標準永続ディスク)
外部通信 月1GB

今回は、以下の記事を参考にしつつ、実際にセットアップを行ってみました。

https://qiita.com/ynack/items/03c6af3bb5c04e6ffb56
https://blog.g-gen.co.jp/entry/postgresql-on-compute-engine

Google Cloud のアカウント作成

Google Cloud のページでアカウント作成をしましょう。
案内にしたがって入力していけば、特に難しい操作は不要です。

ここでアカウントを作成した時点で無料トライアルが始まります。(現在は90日間)
もし無料トライアルを活用する予定がある人は注意してください。

Compute Engine インスタンス作成

1. 任意のプロジェクトを選択する

Google Cloud のプロジェクトとはリソース、設定、課金等をまとめて管理する単位です。

2. Compute Engine インスタンスの画面を表示する

Google Cloud のページの左上のメニューから 「Compute Engine」→「VMインスタンス」を選択してください。

3. Compute Engine API を有効化する(すでに有効になっていればこの手順はスキップ)

Compute Engine API は Compute Engine インスタンスを作成するために必要なものです。
有効化自体には料金はかかりません。有効化したAPIを使って、実際にリソースを作成・利用する&そのリソースが有料だった場合のみ料金がかかります。
まだ有効化されていない場合は画像のような表示が出るので、有効化をしましょう。

4. 画面上部の「インスタンスを作成」を選択する

5. マシンの構成を入力する

月間予測の金額が$0ではありませんが、これは無料枠を考慮していない金額なので気にしないでください。(プロジェクトの課金情報等では無料枠を考慮した金額が確認できます)

名前:任意のもので大丈夫です。
リージョン:無料枠の対象リージョンを選択してください。
ゾーン:任意のもので大丈夫です。
Series:無料枠の E2 を選択してください。
マシンタイプ:無料枠の e2-micro を選択してください。

6. OSとストレージを入力する

デフォルトの設定では無料枠に収まるようになっているはずですが、永続ディスクを無料枠MAXまで使いたい等あれば変更してください。
「変更」ボタンを押すことで各項目の変更が可能になります。

7. データ保護を入力する

料金の発生しない「バックアップなし」を選択します。
低コストではありますがスナップショットも料金が発生します。

8. ネットワーキングを入力する

ネットワークインターフェースを選択すると編集ができます。
外部IPアドレスから「静的外部IPアドレスを予約」を選択します。
名前、説明は任意の値で大丈夫です。

9. オブザーバビリティを入力する

料金が発生する可能性のある「モニタリングとロギング用のOpsエージェントをインストールする」のチェックを外します。
Opsエージェント自体は料金が発生しませんが、内部で行っているログの収集等で通信量やログのサイズによっては料金が発生する可能性があるようです。
あとからOpsエージェントを使うように設定を変えることも可能です。

10. セキュリティを入力する

デフォルトの設定のままで問題ありません。

11. 詳細を入力する

デフォルトの設定のままで問題ありません。

12. 作成する

画面下部の「作成」ボタンを押してしばらくすると Compute Engine のインスタンスが作成されます。

PostgreSQL のインストール

1. ブラウザでの SSH を開く

Compute Engine のインスタンスの右側にある「SSH」ボタンを押します。
インスタンス一覧画面ではなくインスタンスの詳細画面にも「SSH」ボタンがあるのでそこからでも大丈夫です。

こんな感じの画面が開きます。

2. PostgreSQL をインストールする

以下のコマンドを入力します。

# パッケージ情報を最新化
sudo apt update -y

# PostgreSQL本体と追加機能群を一括でインストール(-y で確認省略)
sudo apt install -y postgresql postgresql-contrib

3. PostgreSQL がインストールされているか確認する

以下のコマンドを入力します。
バージョン情報が表示されれば無事インストールは完了しています。

psql --version

リモートから接続するための設定

Compute Engine 側の設定

  1. Google Cloud 画面の左上のメニューから「VPC ネットワーク」→「ファイアウォール」を選択する

  2. 「ファイアウォールルールを作成」を選択する

  3. 設定を入力する
    以下のように入力してください。
    なお名前は任意のもので大丈夫です。

  1. 作成されたか確認する
    以下のように一覧に作成したファイアウォールルールが確認できれば大丈夫です。

PostgreSQL 側の設定

設定ファイルの編集

  1. 設定ファイルを開く
    以下のコマンドを入力します。
# PostgreSQL の設定ファイルを nano エディタで開く
sudo nano /etc/postgresql/*/main/postgresql.conf
  1. listen_addresses の箇所を探す
    ブラウザSSHのキーボードアイコンを押し、「Ctrl+W」を選択した後に検索ワードに「listen」と入力して検索を実行します。
    キーボードアイコンから検索コマンドを入力せずに、キーボードから直接「Ctrl+W」を押してしまうとブラウザの現在のタブを閉じるショートカットが優先して実行されてしまうので注意してください。(3敗)

  2. listen_addresses の設定を変更する
    変更前

    変更後

  3. 変更を保存する
    キーボードで「Ctrl+O」を入力し、ファイル名はそのままでEnterを押すと変更が保存されます。

  4. エディタを閉じる
    キーボードで「Ctrl+X」を入力する。

接続元の設定ファイルの編集

  1. 設定ファイルを開く
    以下のコマンドを入力します。
# PostgreSQL の接続元の設定ファイルを nano エディタで開く
sudo nano /etc/postgresql/*/main/pg_hba.conf
  1. ファイルの一番下に設定を追加する
    以下のように設定を追加してください。

  2. 変更を保存する
    キーボードで「Ctrl+O」を入力し、ファイル名は変えずにそのまま Enter を押すと変更が保存されます。

  3. エディタを閉じる
    キーボードで「Ctrl+X」を入力する。

設定反映とユーザー作成

  1. PostgreSQL を再起動する
    以下のコマンドを入力して PostgreSQL を再起動させて設定変更を反映します。
    特にエラー表示等がなければ成功です。
# 設定ファイル(postgresql.conf / pg_hba.conf)の変更を反映
sudo systemctl restart postgresql
  1. PostgreSQL にログインする
    以下のコマンドを入力します。
# PostgreSQLのデフォルトユーザー(postgres)に切り替え
sudo -u postgres psql
  1. ユーザーを作成する
    以下のコマンドを入力します。
    名前とパスワードは任意のもので大丈夫です。
-- 任意のユーザーを作成(パスワードも設定)
CREATE USER myuser WITH PASSWORD 'mypassword';
  1. 作成したユーザーに権限を付与する
    以下のコマンドを入力します。
-- myuser に public スキーマへの権限を与える
GRANT CREATE ON SCHEMA public TO myuser;
  1. PostgreSQL から抜ける
    以下のコマンドを入力します。
-- psql セッションから抜ける
\q
  1. 作成したユーザーで PostgreSQL にログインする
    以下のコマンドを入力します。
    パスワードを聞かれるので先ほど設定したパスワードを入力してください。
# PostgreSQLに、接続先="localhost"、ユーザー="myuser"、データベース="postgres"でログイン
psql -h localhost -U myuser -d postgres
\q
  1. 確認用のテーブルとデータを作成する
    以下のコマンドを入力します。
    確認用のデータなので内容は自由に変更して大丈夫です。
-- サンプルテーブルを作成
CREATE TABLE sample_users (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  age INTEGER
);

-- サンプルデータを挿入
INSERT INTO sample_users (name, age) VALUES
  ('Alice', 30),
  ('Bob', 25),
  ('Charlie', 40);
  1. PostgreSQL から抜ける
    以下のコマンドを入力します。
-- psql セッションから抜ける
\q

接続確認

  1. ローカル環境で PostgreSQL を使えるようにする
    今回は以下の記事を参考に、ローカルのPC(Windows11)に PostgreSQL をインストールしてみました。

https://qiita.com/tom-sato/items/037b8f8cb4b326710f71

  1. Compute Engine のインスタンスに接続する
    IPアドレス、ユーザー名、パスワードを入力します。それ以外の項目は今回の手順通りに進めていればデフォルトのままで問題ないので何も入力せずに Enter を押してください。
    Google Cloud のページの左上のメニューから 「Compute Engine」→「VMインスタンス」等で確認可能です。

  2. 作成したデータを確認する
    SELECTコマンド等を入力して、先ほど作成したデータが表示されることを確認します。

補足. 謎の少額の料金が発生している場合

Google Cloud のページの左上のメニューから「課金」を選択すると以下のように謎の少額の料金が発生してしまう場合があります。

どこにも割り当てられていない静的外部IPアドレスがあった

静的外部IPアドレスを作成してから実際に Compute Engine のインスタンスに割り当てるまでの時間によっては料金が発生するようです。
僕の場合は、Compute Engine のインスタンス作成時に一緒に静的外部IPアドレスを作成していたのですが、それでも少しラグがあったらしく料金が発生していました。

こちらは一時的に発生するものなので、せいぜい数円程度の料金に収まっていると思います。

ローカルPC等の外部の環境から Compute Engine に接続確認した

公式のドキュメントによると毎月1GB以下のデータ通信量であれば無料枠に収まるはずなのですが、無料枠に収まっているかどうかに関わらずデータ通信量に応じた料金は表示されるようです。

実際に無料枠に収まっているかどうかは、課金画面の左にある「レポート」を選択して表示される「割引」の項目を見れば確認できます。
「割引」の値が「費用」の値と同じであれば無料枠に収まっていることになります。
公式ドキュメントの割引の説明によると、無料枠は「割引」に含まれているとのことです。
ちなみに公式ドキュメントのプロモーションの説明によると、無料トライアル中のクレジットは「プロモーションなど」に含まれているとのことです。

おわりに

Google Cloud に触るのは初めてだったのでだいぶ苦戦しました。
もし間違っている箇所などございましたらご指摘いただけると幸いです。

無料でできるかどうかはしっかり調べたつもりですが、「実は○○の処理で料金が発生していた」なんてことになったら大変ですので課金情報はまめに確認してください。

引き続き Google Cloud は触っていく予定なので、新たに試してみたことは記事にしていこうと思います。

Discussion