Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

strapiのデータベースにAzureのデータベースを使う

こんにちは。MLBお兄さんこと松村です。
この時期のMLBはシーズンオフながら、Winter Meetingが行われトレード市場が活発になっています。
我がヤンキースも2019シーズンに20勝&300奪三振を記録した、いま一番支配力のある投手のゲリット・コールを獲得しましたので、既に来季が楽しみになってきました。
www.nytimes.com

さて、この記事はオルターブース Advent Calendar 2019の21日目の記事です。
adventar.org

20日目の記事は黄色いテープのうちがわでした。
aadojo.alterbooth.com

前回の私の記事ではNode.js製のヘッドレスCMSの「strapi」をAzureにデプロイする方法についての記事を書きました。
aadojo.alterbooth.com

今回は前回の記事で書ききれなかったデータベースについて書きます。

strapiで利用できるデータベース

公式ドキュメントによると、strapiでは以下のデータベースを利用することができます。

  • PostgreSQL
  • SQLite
  • MySQL
  • MariaDB
  • MongoDB

strapi.io

SQLiteはあくまで開発用として使うので、実運用環境で使うにはPostgreSQL, MySQL, MariaDB, MongoDBのどれかを使うことになります。
Microsoft Azureが提供するデータベースサービスでは、Azure SQL Databaseが最もポピュラーだと思いますが、strapiは今のところ対応していません。

そのため、他のデータベースサービスを使う選択肢になります。

データベース Azureのサービス ドキュメント
PostgreSQL Azure Database for PostgreSQL https://azure.microsoft.com/ja-jp/services/postgresql/
MySQL Azure Database for MySQL https://azure.microsoft.com/ja-jp/services/mysql/
MariaDB Azure Database for MariaDB https://azure.microsoft.com/ja-jp/services/mariadb/
MongoDB Azure Cosmos DB https://azure.microsoft.com/ja-jp/services/cosmos-db/

では早速Azure Database for PostgreSQLを例に、データベースに接続するstrapiのアプリケーションを作ってみましょう。
なお、Azure Database for PostgreSQLのリソースを作成したあと、自身のIPアドレスからの接続を許可する設定を行っておきましょう。

Re:ゼロから始めるDB接続

まずはCLIでstrapiアプリケーションを作る際に、PostgreSQLに接続する設定を入れてみましょう。
ちなみにMySQLもMariaDBも同じです。

$ yarn create strapi-app my-project
yarn create v1.19.2
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...

success Installed "create-strapi-app@3.0.0-beta.18.1" with binaries:
      - create-strapi-app
Creating a new Strapi application at /mnt/d/src/yuta/strapi/sample/my-project.

? Choose your default database client postgres
? Database name: (データベース名を入力します)
? Host: (ホスト名を入力します)
? Port: (ポート番号を入力します)
? Username: (ユーザー名を入力します)
? Password: (パスワードを入力します)
? Enable SSL connection: No

Creating a project with custom database options.
Creating files.
Dependencies installed successfully.

Your application was created at /mnt/d/src/yuta/strapi/sample/my-project.

Available commands in your project:

  yarn develop
  Start Strapi in watch mode.

  yarn start
  Start Strapi without watch mode.

  yarn build
  Build Strapi admin panel.

  yarn strapi
  Display all available commands.

You can start by doing:

  cd /mnt/d/src/yuta/strapi/sample/my-project
  yarn develop

Done in 675.37s.

アプリケーションが出来上がったら package.json を見てみましょう。
PostgreSQLクライアントであるpgが一緒にインストールされていることがわかります。

www.npmjs.com

{
  "name": "my-project",
  "private": true,
  "version": "0.1.0",
  "description": "A Strapi application",
  "scripts": {
    "develop": "strapi develop",
    "start": "strapi start",
    "build": "strapi build",
    "strapi": "strapi"
  },
  "devDependencies": {},
  "dependencies": {
    "strapi": "3.0.0-beta.18.1",
    "strapi-admin": "3.0.0-beta.18.1",
    "strapi-utils": "3.0.0-beta.18.1",
    "strapi-plugin-content-type-builder": "3.0.0-beta.18.1",
    "strapi-plugin-content-manager": "3.0.0-beta.18.1",
    "strapi-plugin-users-permissions": "3.0.0-beta.18.1",
    "strapi-plugin-email": "3.0.0-beta.18.1",
    "strapi-plugin-upload": "3.0.0-beta.18.1",
    "strapi-connector-bookshelf": "3.0.0-beta.18.1",
    "knex": "<0.20.0",
    "pg": "latest"
  },
  "author": {
    "name": "A Strapi developer"
  },
  "strapi": {
    "uuid": "f7c7fda9-1790-448e-a1e0-c857c1d8a001"
  },
  "engines": {
    "node": ">=10.0.0",
    "npm": ">=6.0.0"
  },
  "license": "MIT"
}

また、データベースへの接続情報は /config/environments/development/database.json に記載されています。

{
  "defaultConnection": "default",
  "connections": {
    "default": {
      "connector": "bookshelf",
      "settings": {
        "client": "postgres",
        "database": "入力したデータベース名",
        "host": "入力したホスト名",
        "port": 入力したポート番号,
        "username": "入力したユーザー名",
        "password": "入力したパスワード"
      },
      "options": {}
    }
  }
}

この状態で yarn develop を実行してアプリケーションを開始するとテーブルが自動的に作成されます。
以下はアプリケーション実行後にPostgreSQLにできあがったテーブルです。

strapi=> \d
                             List of relations
 Schema |                Name                 |   Type   |      Owner
--------+-------------------------------------+----------+-----------------
 public | core_store                          | table    | yuta
 public | core_store_id_seq                   | sequence | yuta
 public | pg_buffercache                      | view     | azure_superuser
 public | pg_stat_statements                  | view     | azure_superuser
 public | strapi_administrator                | table    | yuta
 public | strapi_administrator_id_seq         | sequence | yuta
 public | upload_file                         | table    | yuta
 public | upload_file_id_seq                  | sequence | yuta
 public | upload_file_morph                   | table    | yuta
 public | upload_file_morph_id_seq            | sequence | yuta
 public | users-permissions_permission        | table    | yuta
 public | users-permissions_permission_id_seq | sequence | yuta
 public | users-permissions_role              | table    | yuta
 public | users-permissions_role_id_seq       | sequence | yuta
 public | users-permissions_user              | table    | yuta
 public | users-permissions_user_id_seq       | sequence | yuta
(16 rows)

MySQLとMariaDB

MySQLとMariaDBは同じ構成になります。
まず、データベースクライアントはMySQLのものを使います。

www.npmjs.com

/config/environments/development/database.jsonconnections/default/settings/client"mysql" になります。

接続情報をどのように指定するか

database.json にデータベースの接続情報が載っていますが、例えばこのままソースコードをGitHubなどに公開してしまうと、他の人に接続情報を知られてしまいます。
場合によっては悪用の危険もあります。
(Azure Databaseのファイアウォールによってアクセス制限は入れていますが)

そのため database.json に記載する接続情報は、下記のように環境変数で指定することが好ましいでしょう。

{
  "defaultConnection": "default",
  "connections": {
    "default": {
      "connector": "strapi-hook-bookshelf",
      "settings": {
        "client": "mysql",
        "host": "${process.env.DATABASE_HOST}",
        "port": "${process.env.DATABASE_PORT}",
        "database": "${process.env.DATABASE_NAME}",
        "username": "${process.env.DATABASE_USERNAME}",
        "password": "${process.env.DATABASE_PASSWORD}"
      },
      "options": {}
    }
  }
}

ローカルで実行する際はコマンドラインで環境変数を指定します。

NODE_ENV=development \
    DATABASE_HOST=(ホスト名) \
    DATABASE_PORT=(ポート番号) \
    DATABASE_NAME=(データベース名) \
    DATABASE_USERNAME=(ユーザー名) \
    DATABASE_PASSWORD=(パスワード) \
    yarn develop

Azure WebApp for Containerで環境変数を指定する

実際にAzure WebApp for Containerでstrapiを実行する場合、コマンドラインで環境変数を指定することはできません。
そのためポータルから設定情報に環境変数を指定します。


以上でstrapiを色んなRDBに接続する方法をまとめました。お試しあれ。

www.alterbooth.com

www.alterbooth.com

cloudpointer.tech