LoginSignup
2
0

More than 3 years have passed since last update.

【GKE×CloudSQL】ExpressとPostgreSQLのローカル環境のAPIサーバーをGKEとCloudSQLに移植する

Last updated at Posted at 2019-12-12

やること

【Node.js×PostgreSQL】ExpressとPostgreSQLでローカル環境のAPIサーバーを構築する
https://qiita.com/Yoshimizu-Yuuki/private/77d16390b3ea1bac63e1

前回の記事で作った開発環境を、
今回はGKEとCloudSQLに載せて、APIを作成する。

手順確認

1.CloudSQLを登録する
2.GKEにクラスタを作成しコンテナをデプロイする
3.接続出来るかどうかを確認する

1.CloudSQLを登録する

GCPからCloudSQLのPostgresのインスタンスを生成します。
この時、プライベートIP接続にもチェックをいれておきます。(後から接続の箇所から変更することもできます。)
インスタンスをPostgreSQLで作成します。

作成後は、インスタンスに接続して前回作ったSQL文を流し込みます。
接続する際には、接続元のグローバルIPアドレスを許可するように設定しておきましょう。

2.GKEにクラスタを作成しコンテナをデプロイする

まず、API用のDockerFileを作成します。
apiフォルダに関しては、前述のやりたいことに貼ってある前回の記事を参照してください。

Dockerfile
FROM node:12-alpine

WORKDIR /api

COPY ./ /api

RUN npm install

CMD npm run start

このDockerfileの入っているAPIフォルダをgitのリポジトリに上げます!
そして、GCPのShellでgit cloneをして拾ってきます。

あとは以下の公式に書いてある通りにコマンドを進めていくと、コンテナをデプロイすることができます。途中のクラスタ作成は、公式に書いてあるコマンドではうまくいかなかったので、GCPのコンソールからクラスタを作成しました。
ポート番号は適宜必要に応じて設定しましょう。

3接続できるかどうかを確認する

接続するために、まず、index.jsのconnectionStringの接続詞のアドレスをプライベートIPアドレスに書き換えます。

index.js
const express = require('express')
const app = express()

const { Pool, Client } = require('pg')

//ここのXX.XX.XX.XXにプライベートIPアドレスを設定します
const connectionString = 'postgres://postgres:postgres@XX.XX.XX.XX:5432/postgres'

const pool = new Pool({
  connectionString: connectionString,
})
pool.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  pool.end()
})


/*
URL設計
/company⇒Companyの全件取得
/company/:id⇒Companyテーブルのidに応じたレコードの取得
*/

app.get('/company',(req, res) => 
{
    const client = new Client({
        connectionString: connectionString,
      })
      client.connect()
      client.query('SELECT * FROM Company', (err, result) => {
        res.send(result.rows);
        client.end()
    })
});


app.get('/company/:id',(req, res) => 
{
    const client = new Client({
        connectionString: connectionString,
      })
      client.connect()

      //idを使ってクエリ
      client.query({
        name: 'fetch-user',
        text: 'SELECT * FROM Company WHERE id = $1',
        values: [req.param('id')]
      }, (err, result) => {
        res.send(result.rows);
        client.end()
    })
});

app.listen(3000, () => console.log('Example app listening on port 3000!'))

GKEクラスタのグローバルIPアドレス(XX.XX.XX.XX)にアクセスして、XX.XX.XX.XX:3000/Companyでアクセスしてみましょう。

そこで、Companyテーブルのレコードが取得できていれば、GKEとCloudSQLの接続完了です!!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0