App Engine 가변형 환경에서 실행되는 Ruby on Rails 앱 개발을 시작합니다. 개발한 앱은 모든 Google 제품과 동일한 인프라에서 실행되므로 사용자 수에 관계없이 모든 사용자에게 서비스를 제공하도록 확장할 수 있습니다.
이 가이드는 Rails 웹 개발에 익숙한 개발자를 대상으로 하며, 새로운 Rails 앱으로 PostgreSQL용 Cloud SQL을 설정하는 방법을 안내합니다. 이 가이드를 PostgreSQL용 Cloud SQL을 사용하도록 기존 Rails 앱을 구성하기 위한 참조로 사용할 수도 있습니다.
이 튜토리얼에는 Ruby 2.6 또는 2.7이 필요합니다.
시작하기 전에
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
PostgreSQL용 Cloud SQL 인스턴스 준비
이 가이드를 위한 PostgreSQL용 Cloud SQL 인스턴스를 설정합니다.
PostgreSQL 인스턴스를 만듭니다. 이 가이드에서 인스턴스 이름은
rails-cloudsql-instance
입니다.인스턴스에 데이터베이스를 만듭니다. 이 가이드에서 프로덕션 데이터베이스 이름은
cat_list_production
입니다.인스턴스의 postgres 사용자 비밀번호를 설정합니다.
Rails용 로컬 환경 설정
이 가이드를 위한 로컬 환경을 설정합니다.
Rails와 해당 종속 항목 설치에 대한 자세한 내용은 공식 Rails 시작하기 가이드를 참조하세요.
기본 요건을 완료한 후에는 PostgreSQL용 Cloud SQL을 사용하여 Rails 앱을 만들고 배포할 수 있습니다. 다음 섹션에서는 PostgreSQL용 Cloud SQL을 구성 및 연결하고 앱을 배포하는 방법을 설명합니다.
고양이를 나열하는 새로운 앱 만들기
rails new
명령어를 실행하여 새로운 Rails 앱을 만듭니다. 이 앱은 PostgreSQL용 Cloud SQL에 고양이 목록을 저장합니다.rails new cat_sample_app
생성된 Rails 앱이 있는 디렉토리로 이동합니다.
cd cat_sample_app
로컬에서 앱 실행
로컬 컴퓨터에서 새로운 Rails 앱을 실행하려면 다음 단계를 따르세요.
Bundler를 사용하여 종속 항목을 설치합니다.
bundle install
로컬 웹 서버를 시작합니다.
bundle exec bin/rails server
브라우저에서 http://localhost:3000/으로 이동합니다.
앱의 Yay! You're on Rails! 메시지가 페이지에 표시됩니다.
고양이 목록을 위한 스캐폴딩 생성
이름과 나이가 포함된 고양이 목록을 만드는 데 사용되는 Cat
라는 리소스에 대한 스캐폴딩을 생성합니다.
스캐폴딩을 생성합니다.
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
config/routes.rb
파일을 열어 다음과 같이 생성된 콘텐츠를 확인합니다.root 'cats#index'
를 파일에 추가합니다.파일을 저장하고 닫습니다.
이전 안내를 따라 Rails 앱을 테스트합니다.
App Engine에서 PostgreSQL용 Cloud SQL 사용
PostgreSQL용 Cloud SQL은 Google Cloud에서 관계형 PostgreSQL 데이터베이스를 설정, 유지, 관리하는 완전 관리형 데이터베이스 서비스입니다. 즉, Cloud SQL을 다른 관계형 데이터베이스처럼 Rails 앱에서 사용할 수 있습니다.
PostgreSQL용 Cloud SQL 설정
프로덕션의 Rails 앱으로 Cloud SQL을 사용하려면 다음 단계를 따르세요.
Gemfile
파일에pg
및appengine
gem을 추가합니다.bundle add pg bundle add appengine
Rails
Gemfile
에는 다음과 같은gem
항목이 추가로 포함되어 있습니다.Cloud SQL에 연결하도록 Rails 앱을 구성하기 위해
config/database.yml
파일을 엽니다. 그러면 SQLite의 상용구 데이터베이스 설정이 다음과 같이 표시됩니다.Cloud SQL 인스턴스 연결 이름을 App Engine 프로덕션 환경에 맞게 구성합니다.
인스턴스 연결 이름을 검색합니다.
gcloud sql instances describe rails-cloudsql-instance
connectionName
옆의 값을 복사합니다.
database.yml
프로덕션 데이터베이스 구성을 다음과 같이 수정합니다.각 항목의 의미는 다음과 같습니다.
[YOUR_POSTGRES_USERNAME]
: PostgreSQL용 Cloud SQL 인스턴스 사용자 이름을 나타냅니다.[YOUR_POSTGRES_PASSWORD]
: PostgreSQL용 Cloud SQL 인스턴스 비밀번호를 나타냅니다.[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
이라는 새 파일을 만들고 다음을 추가합니다.
app.yaml
파일에서 Rails 비밀번호 키를 구성합니다.
Rails 앱이 production
환경에 배포되면 보안 비밀 키로 환경 변수 SECRET_KEY_BASE
를 설정하여 사용자 세션 데이터를 보호합니다. Rails 앱의 config/secrets.yml
파일에서 이 환경 변수를 읽습니다.
새 비밀번호 키를 생성합니다.
bundle exec bin/rails secret
생성된 비밀번호 키를 복사합니다.
앞에서 만든
app.yaml
파일을 열고env_variables
섹션을 추가합니다.env_variables
은 App Engine 가변형 환경에 환경 변수를 정의합니다.app.yaml
파일은 다음 예시와 비슷하게 표시되며,[SECRET_KEY]
는 해당 보안 비밀 키로 바뀝니다.
app.yaml
파일에서 Cloud SQL 인스턴스 구성
다음으로 App Engine 가변형 환경을 구성하여 app.yaml
구성 파일에서 Cloud SQL 인스턴스 연결 이름을 제공하여 지정된 Cloud SQL 인스턴스를 사용합니다.
app.yaml
파일을 열고 이름이beta_settings
인 새 섹션을 추가합니다.인스턴스 연결 이름을 값으로 사용하여 중첩 매개변수
cloud_sql_instances
를 정의합니다.app.yaml
은 다음과 비슷하게 표시됩니다.
App Engine 가변형 환경 앱 만들기
앱을 처음 배포하는 경우, App Engine 가변형 환경 앱을 만들고 Rails 앱을 실행할 리전을 선택해야 합니다.
App Engine 앱을 만듭니다.
gcloud app create
Ruby 앱용 App Engine 가변형 환경을 지원하는 리전을 선택합니다. 리전 및 영역에 대해 자세히 알아보세요.
새 버전 배포
그런 후 다음 명령어를 실행하여 현재 기본 제공 버전의 트래픽을 리디렉션하지 않고 app.yaml
파일에 설명된 Rails 앱의 새 버전을 배포합니다.
gcloud app deploy --no-promote
배포가 완료되는 데는 몇 분이 걸릴 수 있습니다. 성공 메시지가 표시될 때까지 기다리세요. 배포된 버전은 App Engine 버전 목록에서 확인이 가능합니다.
데이터베이스를 이전하지 않았으므로, 새 버전을 배포한 후 이 새 버전에 액세스를 시도하면 다음과 같은 오류 메시지가 표시됩니다.
appengine
gem에 필요한 권한 부여
다음으로 appengine
gem을 사용하여 프로덕션 데이터베이스 이전을 실행하기 위해 cloudbuild 서비스 계정에 액세스를 부여합니다.
사용 가능한 프로젝트를 나열합니다.
gcloud projects list
목록이 표시되면 앱을 배포하는 데 사용할 프로젝트를 찾아 프로젝트 번호를 복사합니다.
데이터베이스 이전을 실행할 역할
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 가변형 환경에서 앱의 가장 최근에 배포된 버전에 대해 명령어를 실행합니다.
프로덕션에서 PostgreSQL용 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 ----------
데이터베이스 마이그레이션을 확인하기 위해 브라우저에 다음 URL을 입력합니다.
https://VERSION_ID-dot-PROJECT_ID.REGION_ID.r.appspot.com
다음을 바꿉니다.
VERSION_ID
: 이전에 배포한 앱의 새 버전입니다. 버전 목록을 가져오려면gcloud app versions list
를 사용합니다. 마지막 기본 서비스 버전 항목이 최신 배포 항목입니다.PROJECT_ID
: Google Cloud 프로젝트 IDREGION_ID
: App Engine이 앱에 할당하는 코드
배포가 성공적으로 완료되면 다음과 같이 표시됩니다.
트래픽을 새 버전으로 이전
마지막으로, 다음 명령어를 사용하여 새로 배포된 버전으로 트래픽을 전달합니다.
gcloud app services set-traffic default --splits [YOUR-VERSION]=1
이제 다음 URL에서 앱의 새 버전에 액세스할 수 있습니다.
https://PROJECT_ID.REGION_ID.r.appspot.com
App Engine 로그 읽기
이제 Rails 앱이 배포되었으므로 로그를 읽을 수 있습니다. Google Cloud Console에 있는 로그 탐색기를 사용하여 앱 로그를 읽을 수도 있습니다.
gcloud CLI를 사용하여 로그 읽기에 대해 자세히 알아보세요.
리소스 삭제
튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하는 방법은 다음과 같습니다.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
App Engine 버전 삭제
앱 버전을 삭제하려면 다음 안내를 따르세요.
- In the Google Cloud console, go to the Versions page for App Engine.
- Select the checkbox for the non-default app version that you want to delete.
- 앱 버전을 삭제하려면 삭제를 클릭합니다.
Cloud SQL 인스턴스 삭제
Cloud SQL 인스턴스를 삭제하려면 다음 안내를 따르세요.
- In the Google Cloud console, go to the Instances page.
- Click the name of the SQL instance you that want to delete.
- To delete the instance, click Delete, and then follow the instructions.