ローカルのデータベースをAWS EC2インスタンス内にインポートする(Capistranoによる自動デプロイで)

  • 0
    いいね
  • 2
    コメント

    ローカルのデータベースをAWSにインポートしたい!

    ローカルで作ったアプリをAWSのEC2インスタンス内へデプロイ。その際、ローカルで使っていたデータベースとデプロイ時のデータベースの内容を同じにしたい。つまり、○○_developmentの内容を○○_productionに反映させたい。

    あ、ちなみにアプリはRuby on Rails使用で、デプロイはgem Capistranoで自動デプロイしてます。

    EC2インスタンスにMySQLをインストールする

    MySQLのインストールと起動

    以下のコマンドでEC2インスタンスへMySQLをインストール。Amazon Linuxを利用している場合、yumというコマンドでMySQLをインストールできる。

    [ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo yum install mysql56-server mysql56-devel mysql56
    

    これでMySQLのバージョン5.6がインストールされます。

    MySQLを起動するためにserviceコマンドを叩く。これは、Amazon LinuxやCentOSに含まれているもので、インストールしたソフトウェアの起動を一括して行えるツール。

    [ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo service mysqld start
    

    mysql ではなく mysqld であることに注意。「d」はLinuxの用語で「サーバ」を意味する「デーモン(daemon)」の頭文字。
    起動確認のために以下のコマンド。

    [ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo service mysqld status
    mysqld (pid  15692) is running...
    

    runningと表示されれば、MySQLの起動は成功している。

    パスワードの設定

    yum でインストールしたMySQLには、デフォルトで root というユーザーでアクセス出来るようになっているが、パスワードが設定されていない。

    以下のコマンドでパスワードを設定

    [ec2-user@ip-xxx-xx-xx-xxx ~]$ sudo /usr/libexec/mysql56/mysqladmin -u root password '<設定したいパスワード>'
    

    MySQLへの接続確認

    先ほど入力したパスワードが使えるか、以下のコマンドで確認。

    [ec2-user@ip-xxx-xx-xx-xxx ~]$ mysql -u root -p
    

    Enter password: とパスワードを入力するように表示されるので、先ほど登録したパスワードを入力。以下のように表示されれば、MySQLの設定は終了。

    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4
    Server version: 5.6.33 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    

    ローカルのデータベースをAWS EC2インスタンス内にインポートする

    ローカルのデータベースをCSV形式でエクスポートする

    まずはローカルのデータベースをCSV形式でエクスポートする。テーブル名.csvの形式でデスクトップへ出力される。

    参考
    MySQLのデータインポート・エクスポート
    MySQLのデータベースをまるっとお引越し。 (エクスポート/インポート)

    csvファイルをdbフォルダに入れる

    先ほどデスクトップに出力されたcsvファイルを、(アプリ名)/dbの中に入れる。orders, users,productsのテーブルデータをエクスポートしたのなら、こんな具合になる。
    image

    seeds.rbを編集する

    dbフォルダ下にあるseeds.rbファイル(ちょうど上の画像で選択されてるやつ)を以下のように書き変える。

    seeds.rb
    require "csv"
    # 1番上に1度だけ記述 
    
    # 以下は各テーブルごとに名前を変えて記述。例えばこれはordersテーブル。
    orders_csv = CSV.readlines("db/orders.csv")
    orders_csv.shift
    orders_csv.each do |row|
      Order.create(user_id: row[1], created_at: row[2], updated_at: row[3], product_count: row[4], product_id: row[5])
      # idを除くカラム名を記述する
    end
    
    # productsテーブル
    products_csv = CSV.readlines("db/products.csv")
    products_csv.shift
    # 以下略
    

    deploy.rbを編集する

    次に、deploy.rbを編集する。

    config/deploy.rb
    # 前略
    set :log_level, :debug
    
    after 'deploy:publishing', 'deploy:restart'
    namespace :deploy do
    # 以下を追加
      desc 'db_seed'
      task :db_seed do
        on roles(:db) do |host|
          with rails_env: fetch(:rails_env) do
            within current_path do
              execute :bundle, :exec, :rake, 'db:seed'
            end
          end
        end
      end
    # ここまでが追加分
      task :restart do
        invoke 'unicorn:restart'
      end
    end
    

    リモートリポジトリへプッシュ

    いつものように、git add, commit, push。

    Cap deploy

    capistranoを使った自動デプロイ。
    まずはいつもの。

    ローカル
    $ bundle exec cap production deploy
    

    これで一旦デプロイしたあと、改めてデータベース読み込み。

    ローカル
    $ bundle exec cap production deploy:db_seed
    

    これで○○_development○○_productionの内容を同じものにできました!わーい!!

    ちゃんとデータ入ってるのか確認

    EC2インスタンスのMySQLへログイン

    [ec2-user@ip-xxx-xx-xx-xxx ~]$ mysql -u root -p
    

    パスワードを求められるので入力。

    データベース一覧を確認するにはこのコマンド。

    mysql> show databases
    

    データベースを選択

    mysql> use amazon_production;
    

    各テーブルの中身を見る

    # ordersテーブルなら
    mysql> select * from orders