データベースについて

このドキュメントでは、Worker からデータベースを利用する方法について説明しています。

MAGELLAN では、Worker から簡単に利用できるデータベースとして、Cloud SQL を用意しています。これは、データベースに必ず Cloud SQL を使わなければならないということではありません。MAGELLAN 提供外のデータベースも利用できます。

MAGELLAN 提供の Cloud SQL 以外のデータベースを Worker から利用する場合には、接続情報を指定する手順が必要になります。

Worker からデータベースを利用するためには、データベース接続に関する様々な情報が必要になります。例えば、次のような情報です。

  • データベースが動作しているサーバーの IP アドレス
  • データベースが動作しているサーバーのポート番号
  • データベース名
  • データベースにアクセスのためのユーザ名
  • データベースにアクセスのためのパスワード

MAGELLAN では、環境変数を使って、これらの情報を Worker に与える手段を提供しています。この手段を利用するには、次の 2 つのステップを踏みます。

  1. Worker に渡すための環境変数を定義 (MAGELLAN 提供の Cloud SQL を利用する場合はこの環境変数は自動的に渡されます)
  2. Worker から環境変数を取得

以下、それぞれのステップについて説明します。

Worker に渡すための環境変数を定義

YAML 形式のテキストファイルで、環境変数を定義します。たとえば、worker.yml というファイル名称で次のように定義します。

migration_command_1: "bundle exec rake db:migrate:reset db:seed"
migration_command_2: "bundle exec rake db:migrate"
environment_vars_yaml: |
  ---
  SECRET_KEY_BASE: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  RAILS_ENV: production
  MYSQL_HOST: 123.123.123.123
  MYSQL_PORT: 3306
  MYSQL_DATABASE: MyOrg_MyProject_MyStage_MyDB
  MYSQL_USERNAME: xxxxxxxxxxxxxxx
  MYSQL_PASSWORD: xxxxxxxxxxxxxxxx

1 行目と 2 行目は、Worker 起動時に実行するコマンドの指定です。今回説明する環境変数とは関係ありません。

3 行目の environment_vars_yaml が環境変数を定義する指定となります。3 行目と 4 行目は、このままとしてください。

5 行目以降が、環境変数の定義になります。定義する「環境変数名」とその「値」を「環境変数名: 値」という書式で行単位で定義します。

この例だと、MYSQL_ で始まる環境変数名がデータベース接続に関する情報となっています。ここでは、MySQLと接続するため、MYSQL_ としていますが、名前は自由に決めて構いません。ただし MAGELLAN が提供する Cloud SQL を利用する場合は MYSQL_ から始まる環境変数が定義されます。

magellan-cli worker create コマンドを使って、Worker を MAGELLAN に登録しますが、この時に -A オプションを使って、先ほど定義した YAML 形式のテキストファイルを指定します。こうすることで、この Worker 起動時に、指定の環境変数が設定され、Worker 内ではこの環境変数にアクセスできるようになります。

$ magellan-cli worker create MyWorker yourname/rails-worker-example:0.0.1 -A worker.yml

Worker から環境変数を取得

Worker では、環境変数を読み取るコードを記述します。Rails アプリケーションの場合は、database.yml ファイルにデータベースへの接続情報を記載しますので、ここで記述します。<%= ENV['...'] %> 部分が、該当するコードです。

production:
  <<: *default
  pool: 1
  host: <%= ENV['MYSQL_HOST'] %>
  port: <%= ENV['MYSQL_PORT'] %>
  database: <%= ENV['MYSQL_DATABASE'] %>
  username: <%= ENV['MYSQL_USERNAME'] %>
  password: <%= ENV['MYSQL_PASSWORD'] %>