Rails 5로 MySQL용 Cloud SQL 사용

App Engine 가변형 환경에서 실행되는 Ruby on Rails 앱 개발을 시작합니다. 개발한 앱은 모든 Google 제품과 동일한 인프라에서 실행되므로 사용자 수에 관계없이 모든 사용자에게 서비스를 제공하도록 확장할 수 있습니다.

이 가이드는 Rails 웹 개발에 익숙한 개발자를 대상으로 하며, 새로운 Rails 앱으로 MySQL용 Cloud SQL을 설정하는 과정을 설명합니다. 이 가이드를 참조하여 MySQL용 Cloud SQL을 사용하도록 기존 Rails 앱을 구성할 수 있습니다.

이 가이드에서는 Ruby 2.3.4 이상이 필요합니다.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Enable the Cloud SQL Admin API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  9. Enable the Cloud SQL Admin API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

MySQL용 Cloud SQL 인스턴스 준비

이 가이드를 위한 MySQL용 Cloud SQL 인스턴스를 설정합니다.

  1. 2세대 인스턴스를 만듭니다. 이 가이드에서 인스턴스 이름은 rails-cloudsql-instance입니다.

  2. 인스턴스에 데이터베이스를 만듭니다. 이 가이드에서 프로덕션 데이터베이스 이름은 cat_list_production입니다.

  3. 인스턴스의 루트 사용자 비밀번호를 설정합니다.

Rails용 로컬 환경 설정

이 가이드를 위한 로컬 환경을 설정합니다.

  1. Ruby 버전 2.3.4 이상을 설치합니다.

  2. Rails 5 gem을 설치합니다.

  3. Bundler gem을 설치합니다.

Rails와 해당 종속 항목 설치에 대한 자세한 내용은 공식 Rails 시작하기 가이드를 참조하세요.

기본 요건을 완료한 후에는 MySQL용 Cloud SQL을 사용하여 Rails 앱을 만들고 배포할 수 있습니다. 다음 섹션에서는 MySQL용 Cloud SQL을 구성 및 연결하고 앱을 배포하는 방법을 설명합니다.

고양이를 나열하는 새로운 앱 만들기

  1. rails new 명령어를 실행하여 새로운 Rails 앱을 만듭니다. 이 앱은 MySQL용 Cloud SQL에 고양이 목록을 저장합니다.

    rails new cat_sample_app
    
  2. 생성된 Rails 앱이 있는 디렉토리로 이동합니다.

    cd cat_sample_app
    

애플리케이션을 로컬로 실행

로컬 컴퓨터에서 새로운 Rails 애플리케이션을 실행하려면 다음 단계를 따르세요.

  1. Bundler를 사용하여 종속 항목을 설치합니다.

    bundle install
    
  2. 로컬 웹 서버를 시작합니다.

    bundle exec bin/rails server
    
  3. 웹브라우저에서 http://localhost:3000/으로 이동합니다.

앱의 Yay! You're on Rails! 메시지가 페이지에 표시됩니다.

실행 중인 새로운 Rails 앱의 스크린샷

고양이 목록을 위한 스캐폴딩 생성

이름과 나이가 포함된 고양이 목록을 만드는 데 사용되는 Cat라는 리소스에 대한 스캐폴딩을 생성합니다.

  1. 스캐폴딩을 생성합니다.

    bundle exec rails generate scaffold Cat name:string age:integer
    

    위의 명령어를 실행하면 Cat 리소스의 모델, 컨트롤러, 뷰가 생성됩니다.

    invoke  active_record
    create    db/migrate/20170804210744_create_cats.rb
    create    app/models/cat.rb
    invoke    rspec
    create      spec/models/cat_spec.rb
    invoke  resource_route
    route    resources :cats
    invoke  scaffold_controller
    create    app/controllers/cats_controller.rb
    invoke    erb
    create      app/views/cats
    create      app/views/cats/index.html.erb
    create      app/views/cats/edit.html.erb
    create      app/views/cats/show.html.erb
    create      app/views/cats/new.html.erb
    create      app/views/cats/_form.html.erb
    invoke    jbuilder
    create      app/views/cats/index.json.jbuilder
    create      app/views/cats/show.json.jbuilder
    create      app/views/cats/_cat.json.jbuilder
    invoke  assets
    invoke    js
    create      app/assets/javascripts/cats.js
    invoke    scss
    create      app/assets/stylesheets/cats.scss
    invoke  scss
    create    app/assets/stylesheets/scaffolds.scss
    
  2. config/routes.rb 파일을 열어 다음과 같이 생성된 콘텐츠를 확인합니다.

    Rails.application.routes.draw do
      resources :cats
      get 'cats/index'
      # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
    
    end
  3. root 'cats#index'를 파일에 추가합니다.

    Rails.application.routes.draw do
      resources :cats
      get 'cats/index'
    
      # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
      root 'cats#index'
    end
  4. 파일을 저장하고 닫습니다.

  5. 이전 안내를 따라 Rails 앱을 테스트합니다.

App Engine에서 MySQL용 Cloud SQL 사용

MySQL용 Cloud SQL은 Google Cloud에서 관계형 MySQL 데이터베이스를 설정, 유지, 관리하는 완전 관리형 데이터베이스 서비스입니다. 즉, Cloud SQL을 다른 관계형 데이터베이스처럼 Rails 앱에서 사용할 수 있습니다.

MySQL용 Cloud SQL 설정

프로덕션의 Rails 앱으로 Cloud SQL을 사용하려면 다음 단계를 따르세요.

  1. Gemfile 파일에 mysql2appengine gem을 추가합니다.

    bundle add mysql2
    bundle add appengine
    

    Rails Gemfile에는 다음과 같은 gem 항목이 추가로 포함되어 있습니다.

    # Added at 2017-08-07 11:54:06 -0700 by USER:
    gem "mysql2", "~> 0.4.8"
    
    # Added at 2017-08-07 11:54:12 -0700 by USER:
    gem "appengine", "~> 0.4.1"
  2. Cloud SQL에 연결하도록 Rails 앱을 구성하기 위해 config/database.yml 파일을 엽니다. 그러면 SQLite의 상용구 데이터베이스 설정이 다음과 같이 표시됩니다.

    # SQLite version 3.x
    #   gem install sqlite3
    #
    #   Ensure the SQLite 3 gem is defined in your Gemfile
    #   gem 'sqlite3'
    #
    default: &default
      adapter: sqlite3
      pool: 5
      timeout: 5000
    
    development:
      <<: *default
      database: db/development.sqlite3
    
    # Warning: The database defined as "test" will be erased and
    # re-generated from your development database when you run "rake".
    # Do not set this db to the same as development or production.
    test:
      <<: *default
      database: db/test.sqlite3
    
    production:
      <<: *default
      database: db/production.sqlite3
  3. Cloud SQL 인스턴스 연결 이름을 App Engine 프로덕션 환경에 맞게 구성합니다.

    1. 인스턴스 연결 이름을 검색합니다.

      gcloud sql instances describe rails-cloudsql-instance
      
    2. connectionName 옆의 값을 복사합니다.

  4. database.yml 프로덕션 데이터베이스 구성을 다음과 같이 수정합니다.

    production:
      adapter: mysql2
      pool: 5
      timeout: 5000
      username: "[YOUR_MYSQL_USERNAME]"
      password: "[YOUR_MYSQL_PASSWORD]"
      database: "cat_list_production"
      socket:   "/cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]"

    여기에서

    • [YOUR_MYSQL_USERNAME]: MySQL 사용자 이름을 나타냅니다
    • [YOUR_MYSQL_PASSWORD]: MySQL 비밀번호를 나타냅니다.
    • [YOUR_INSTANCE_CONNECTION_NAME]: 이전 단계에서 복사한 인스턴스 연결 이름을 나타냅니다.

이제 Rails 앱을 App Engine 가변형 환경에 배포하면 앱에서 Cloud SQL을 사용할 수 있습니다.

App Engine 가변형 환경에 앱 배포

App Engine 가변형 환경은 app.yaml이라는 파일을 사용하여 앱의 배포 구성을 설명합니다. 이 파일이 없으면 gcloud CLI에서 배포 구성을 추측합니다. 하지만 개발자는 Rails 비밀번호 키와 Cloud SQL에 필요한 구성 설정을 제공하는 파일을 정의해야 합니다.

App Engine에 배포할 샘플 앱을 구성하려면 Rails 애플리케이션 디렉터리의 루트에 app.yaml라는 새 파일을 만들고 다음을 추가합니다.

entrypoint: bundle exec rackup --port $PORT
env: flex
runtime: ruby

app.yaml 파일에서 Rails 비밀번호 키를 구성합니다.

Rails 앱이 production 환경에 배포되면 보안 비밀 키로 환경 변수 SECRET_KEY_BASE를 설정하여 사용자 세션 데이터를 보호합니다. Rails 앱의 config/secrets.yml 파일에서 이 환경 변수를 읽습니다.

  1. 새 비밀번호 키를 생성합니다.

    bundle exec bin/rails secret
    
  2. 생성된 비밀번호 키를 복사합니다.

  3. 앞에서 만든 app.yaml 파일을 열고 env_variables 섹션을 추가합니다. env_variables은 App Engine 가변형 환경에 환경 변수를 정의합니다. app.yaml 파일은 다음 예시와 비슷하게 표시되며, [SECRET_KEY]는 해당 보안 비밀 키로 바뀝니다.

    entrypoint: bundle exec rackup --port $PORT
    env: flex
    runtime: ruby
    
    env_variables:
      SECRET_KEY_BASE: [SECRET_KEY]

app.yaml 파일에서 Cloud SQL 인스턴스 구성

다음으로 App Engine 가변형 환경을 구성하여 app.yaml 구성 파일에서 Cloud SQL 인스턴스 연결 이름을 제공하여 지정된 Cloud SQL 인스턴스를 사용합니다.

  1. app.yaml 파일을 열고 이름이 beta_settings인 새 섹션을 추가합니다.

  2. 인스턴스 연결 이름을 값으로 사용하여 중첩 매개변수 cloud_sql_instances를 정의합니다.

    app.yaml은 다음과 비슷하게 표시됩니다.

    entrypoint: bundle exec rackup --port $PORT
    env: flex
    runtime: ruby
    
    env_variables:
      SECRET_KEY_BASE: [SECRET_KEY]
    
    beta_settings:
      cloud_sql_instances: [YOUR_INSTANCE_CONNECTION_NAME]

App Engine 가변형 환경 앱 만들기

앱을 처음 배포하는 경우, App Engine 가변형 환경 앱을 만들고 Rails 앱을 실행할 리전을 선택해야 합니다.

  1. App Engine 앱을 만듭니다.

    gcloud app create
    
  2. Ruby 앱용 App Engine 가변형 환경을 지원하는 리전을 선택합니다. 리전 및 영역에 대해 자세히 알아보세요.

새 버전 배포

그런 후 현재 기본 제공 버전에서 트래픽을 리디렉션하지 않고 app.yaml 파일에 설명된 Rails 앱의 새 버전을 배포합니다.

  1. Rails 애셋을 사전 컴파일합니다.

    bundle exec bin/rails assets:precompile
    
  2. 애셋의 컴파일이 완료되면 새 버전의 앱을 배포합니다.

    gcloud app deploy --no-promote
    

    배포가 완료되는 데는 몇 분이 걸릴 수 있습니다. 성공 메시지가 표시될 때까지 기다리세요. 배포된 버전은 App Engine 버전 목록에서 확인이 가능합니다.

데이터베이스를 이전하지 않았으므로, 새 버전을 배포한 후 이 새 버전에 액세스를 시도하면 다음과 같은 오류 메시지가 표시됩니다.

새로운 Rails 앱 오류 메시지의 스크린샷

appengine gem에 필요한 권한 부여

다음으로 appengine gem을 사용하여 프로덕션 데이터베이스 이전을 실행하기 위해 cloudbuild 서비스 계정에 액세스를 부여합니다.

  1. 사용 가능한 프로젝트를 나열합니다.

    gcloud projects list
    
  2. 목록이 표시되면 앱을 배포하는 데 사용할 프로젝트를 찾아 프로젝트 번호를 복사합니다.

  3. 데이터베이스 이전을 실행할 역할 roles/editor에 대해 프로젝트 IAM 정책에 새 구성원을 추가합니다. [YOUR-PROJECT-ID]를 Google Cloud 프로젝트 ID로 교체하고 [PROJECT_NUMBER]를 이전 단계에서 복사한 프로젝트 번호로 교체합니다.

    gcloud projects add-iam-policy-binding [YOUR-PROJECT-ID] \
      --member=serviceAccount:[PROJECT_NUMBER]@cloudbuild.gserviceaccount.com \
      --role=roles/editor
    

Rails 데이터베이스 이전

SQL 구문을 직접 사용하지 않고 데이터베이스의 스키마를 업데이트하기 위해 Rails 데이터베이스 이전을 사용합니다. 그런 후 cat_list_production 데이터베이스를 마이그레이션합니다.

appengine gem은 Rake 태스크 appengine:exec를 제공하여 프로덕션 App Engine 가변형 환경에서 앱의 가장 최근에 배포된 버전에 대해 명령어를 실행합니다.

  1. 프로덕션에서 MySQL용 Cloud SQL cat_list_production 데이터베이스를 이전합니다.

    bundle exec rake appengine:exec -- bundle exec rake db:migrate
    

    다음과 비슷한 출력이 표시됩니다.

    ---------- EXECUTE COMMAND ----------
    bundle exec rake db:migrate
    Debuggee gcp:787021104993:8dae9032f8b02004 successfully registered
    == 20170804210744 CreateCats: migrating =======================================
    -- create_table(:cats)
       -> 0.0219s
    == 20170804210744 CreateCats: migrated (0.0220s) ==============================
    
    ---------- CLEANUP ----------
    
  2. 다음으로 이동하여 데이터베이스 이전을 확인합니다.

    [YOUR-VERSION]-dot-[YOUR-PROJECT-ID].appspot.com
    

배포가 성공적으로 완료되면 다음과 같이 표시됩니다.

실행 중인 새로운 Rails 앱의 스크린샷

트래픽을 새 버전으로 이전

마지막으로, 다음 명령어를 사용하여 새로 배포된 버전으로 트래픽을 전달합니다.

gcloud app services set-traffic default --splits [YOUR-VERSION]=1

이제 다음 위치에서 새 버전의 앱에 액세스할 수 있습니다.

https://[YOUR-PROJECT-ID].appspot.com

App Engine 로그 읽기

이제 Rails 앱이 배포되었으므로 로그를 읽을 수 있습니다. Google Cloud Console에 있는 로그 탐색기를 사용하여 앱 로그를 읽을 수도 있습니다.

gcloud CLI를 사용하여 로그 읽기에 대해 자세히 알아보세요.

리소스 삭제

튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

App Engine 버전 삭제

앱 버전을 삭제하려면 다음 안내를 따르세요.

  1. In the Google Cloud console, go to the Versions page for App Engine.

    Go to Versions

  2. Select the checkbox for the non-default app version that you want to delete.
  3. 앱 버전을 삭제하려면 삭제를 클릭합니다.

Cloud SQL 인스턴스 삭제

Cloud SQL 인스턴스를 삭제하려면 다음 안내를 따르세요.

  1. In the Google Cloud console, go to the Instances page.

    Go to Instances

  2. Click the name of the SQL instance you that want to delete.
  3. To delete the instance, click Delete, and then follow the instructions.

다음 단계