샘플 Rails 애플리케이션을 Cloud Run에 배포하는 방법과 관리형 데이터베이스, 객체 스토리지, 암호화된 보안 비밀을 통합하고 서버리스 컴퓨팅으로 파이프라인을 구축하는 방법을 알아보세요.
Rails 애플리케이션 배포 작업에는 여러 서비스를 통합하여 통합 프로젝트를 만드는 방법이 포함됩니다. 이 튜토리얼에서는 사용자가 Rails 웹 개발에 익숙하다고 가정합니다.
이 튜토리얼에는 Ruby 3.0 이상(Ruby 2.7도 지원됨. 코드 이해 섹션 참조) 및 Rails 6 이상이 필요합니다.
목표
- Cloud SQL 데이터베이스를 만들어 Active Record에 연결
- Secret Manager를 만들고 이를 사용하여 Rails 마스터 키를 안전하게 저장 및 액세스
- 활성 스토리지에서 Cloud Storage에 사용자 업로드 미디어 및 파일 호스팅
- Cloud Build를 사용하여 빌드 및 데이터베이스 마이그레이션 자동화
- Cloud Run에 Rails 앱 배포
비용
시작하기 전에
- 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.
-
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
- 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.
-
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 이 가이드에 사용된 계정에 충분한 권한이 있는지 확인합니다.
환경 준비
기본 프로젝트 설정
다음 명령어를 실행하여 gcloud CLI의 기본 프로젝트 구성을 설정합니다.
gcloud config set project PROJECT_ID
PROJECT_ID
를 새로 만든 Google Cloud 프로젝트 ID로 대체합니다.
Rails 앱 클론
Rails 샘플 앱용 코드는 GitHub의 GoogleCloudPlatform/ruby-docs-samples
저장소에 있습니다.
저장소를 복제합니다.
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
샘플 코드가 있는 디렉터리로 이동한 후 다음 명령어를 실행하여 애플리케이션이 필요한 gem 및 종속 항목으로 올바르게 설정되었는지 확인합니다.
Linux/macOS
cd ruby-docs-samples/run/rails bundle install
Windows
cd ruby-docs-samples\run\rails bundle install
지원 서비스 준비
이 튜토리얼에서는 여러 Google Cloud 서비스를 사용하여 배포된 Rails 프로젝트를 지원하는 데이터베이스, 미디어 스토리지, 보안 비밀 스토리지를 제공합니다. 이러한 서비스는 특정 리전에 배포됩니다. 서비스 간 효율성을 위해 모든 서비스가 같은 리전에 배포되는 것이 가장 좋습니다. 가장 가까운 리전에 대한 자세한 내용은 리전별 제공 제품을 참조하세요.
PostgreSQL용 Cloud SQL 인스턴스 설정
Rails는 Cloud SQL에서 제공하는 여러 데이터베이스를 비롯한 여러 관계형 데이터베이스를 지원합니다. 이 튜토리얼에서는 Rails 앱에서 일반적으로 사용하는 오픈소스 데이터베이스인 PostgreSQL을 사용합니다.
다음 섹션에서는 Rails 앱의 PostgreSQL 인스턴스, 데이터베이스, 데이터베이스 사용자를 만드는 방법을 설명합니다.
PostgreSQL 인스턴스 만들기
Console
콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.
인스턴스 만들기를 클릭합니다.
PostgreSQL 선택을 클릭합니다.
인스턴스 ID 필드에 인스턴스 이름(
INSTANCE_NAME
)을 입력합니다.비밀번호 필드에 postgres 사용자의 비밀번호를 입력합니다.
다른 필드에는 기본값을 사용합니다.
인스턴스 만들기를 클릭합니다.
gcloud
PostgreSQL 인스턴스를 만듭니다.
gcloud sql instances create INSTANCE_NAME \ --database-version POSTGRES_12 \ --tier db-f1-micro \ --region REGION
다음을 바꿉니다.
INSTANCE_NAME
: 새 Cloud SQL 인스턴스 이름REGION
: Google Cloud 리전
인스턴스를 만들고 사용할 수 있도록 준비하는 데 몇 분 정도 소요됩니다.
데이터베이스 만들기
Console
콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.
INSTANCE_NAME 인스턴스를 선택합니다.
데이터베이스 탭으로 이동합니다.
데이터베이스 만들기를 클릭합니다.
데이터베이스 이름 대화상자에
DATABASE_NAME
을 입력합니다.만들기를 클릭합니다.
gcloud
최근에 만든 인스턴스 내에 데이터베이스를 만듭니다.
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAME
DATABASE_NAME
을 인스턴스 내부의 데이터베이스 이름으로 바꿉니다.
사용자 생성
데이터베이스 사용자를 위해 임의의 비밀번호를 생성하고 dbpassword
파일에 씁니다.
cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1 > dbpassword
Console
콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.
INSTANCE_NAME 인스턴스를 선택합니다.
사용자 탭으로 이동합니다.
사용자 계정 추가를 클릭합니다.
기본 제공되는 인증 대화상자에서 다음을 수행합니다.
- 사용자 이름
DATABASE_USERNAME
을 입력합니다. dbpassword
파일의 콘텐츠를 비밀번호PASSWORD
로 입력합니다.
- 사용자 이름
추가를 클릭합니다.
gcloud
최근에 만든 인스턴스 내에 사용자를 만들고 비밀번호를 dbpassword의 콘텐츠로 설정합니다.
gcloud sql users create DATABASE_USERNAME \ --instance=INSTANCE_NAME --password=$(cat dbpassword)
DATABASE_USERNAME
을 인스턴스 내부의 사용자 이름으로 바꿉니다.
Cloud Storage 버킷 설정
Cloud Storage를 사용하여 가용성이 높은 객체 스토리지에서 Rails 정적 애셋과 사용자 업로드 미디어를 호스팅할 수 있습니다.
Console
- In the Google Cloud console, go to the Cloud Storage Buckets page.
- Click Create bucket.
- On the Create a bucket page, enter your bucket information. To go to the next
step, click Continue.
- For Name your bucket, enter a name that meets the bucket naming requirements.
- For Location, select the following: us-central1
- For Choose a default storage class for your data, select the following: Standard.
- For Choose how to control access to objects, select an Access control option.
- For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
- Click Create.
gcloud
gsutil
명령줄 도구는 gcloud CLI 설치의 일부로 설치되었습니다.
Cloud Storage 버킷 만들기 고유한 Cloud Storage 버킷 이름을 만들려면 PROJECT_ID와 원하는 서픽스
MEDIA_BUCKET_SUFFIX
를 사용합니다. Cloud Storage에서 버킷 이름은 전역에서 고유해야 합니다.gsutil mb -l REGION gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX
버킷을 만든 후 업로드된 이미지를 공개로 설정하려면 이미지 객체의 권한을 모든 사용자가 읽을 수 있게 변경합니다.
Console
- Google Cloud 콘솔에서 Cloud Storage 버킷 페이지로 이동합니다.
버킷 목록에서 공개하려는 버킷의 이름을 클릭합니다.
페이지 상단의 권한 탭을 선택합니다.
구성원 추가 버튼을 클릭합니다.
구성원 추가 대화상자가 나타납니다.
새 구성원 필드에
allUsers
를 입력합니다.역할 선택 드롭다운에서 Cloud Storage 하위 메뉴를 선택하고 Storage Object Viewer 옵션을 클릭합니다.
저장을 클릭합니다.
버킷이 공개적으로 공유되면 공개 액세스 열에 각 객체의 링크 아이콘이 나타납니다. 이 아이콘을 클릭하여 객체의 URL을 가져올 수 있습니다.
콘솔에서 실패한 Ruby 작업에 대한 자세한 오류 정보를 가져오는 방법은 문제 해결을 참조하세요.
gcloud
gsutil iam ch
명령어를 사용하여 모든 객체를 공개로 설정합니다. 버킷을 만들 때 사용한MEDIA_BUCKET_SUFFIX
값을 사용합니다.gsutil iam ch allUsers:objectViewer gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX
Secret Manager에 보안 비밀 값 저장
이제 지원 서비스가 구성되었으므로 Rails가 이러한 서비스에 액세스하려면 비밀번호와 같은 보안 정보가 필요합니다. 이 튜토리얼에서는 이러한 값을 Rails 소스 코드에 직접 입력하는 대신 Rails 사용자 인증 정보 및 Secret Manager를 사용하여 이 정보를 안전하게 저장합니다.
암호화된 사용자 인증 정보 파일을 만들고 키를 Secret Manager 보안 비밀로 저장합니다.
Rails는 'config/credentials.yml.enc'라는 암호화된 파일에 보안 비밀을 저장합니다.
로컬 config/master.key
또는 환경 변수 ENV[“RAILS_MASTER_KEY”]
로 파일을 복호화할 수 있습니다. 사용자 인증 정보 파일에서 Cloud SQL 인스턴스 데이터베이스 비밀번호와 외부 API의 기타 액세스 키를 저장할 수 있습니다.
이 키를 Secret Manager에 안전하게 저장할 수 있습니다. 그런 다음 해당 서비스 계정에 액세스 권한을 부여하여 Cloud Run 및 Cloud Build에 키에 대한 액세스 권한을 부여할 수 있습니다. 서비스 계정은 프로젝트 번호를 포함하는 이메일 주소로 식별됩니다.
다음 명령어를 사용하여
config/credentials.yml.enc
파일을 생성합니다.bin/rails credentials:edit
이 명령어는 마스터 키가 정의되지 않은 경우
config/master.key
를 만들고 파일이 존재하지 않으면config/credentials.yml.enc
파일을 만듭니다. 이렇게 하면 보안 비밀을 추가할 복호화된 콘텐츠가 포함된 기본$EDITOR
에서 임시 파일이 열립니다.dbpassword
파일에서 새로 만든 PostgreSQL 인스턴스 데이터베이스 비밀번호를 복사하여 사용자 인증 정보 파일에 붙여넣습니다.secret_key_base: GENERATED_VALUE gcp: db_password: PASSWORD
Rails.application.credentials
로 보안 비밀에 액세스할 수 있습니다. 예를 들어Rails.application.credentials.secret_key_base
는 애플리케이션의 보안 비밀 키 베이스를 반환해야 하고Rails.application.credentials.gcp[:db_passsword]
는 데이터베이스 비밀번호를 반환해야 합니다.config/credentials/yml.enc
는 암호화되어 저장되지만config/master.key
는 Secret Manager에 저장될 수 있습니다.Console
콘솔에서 Secret Manager 페이지로 이동합니다.
보안 비밀 만들기를 클릭합니다.
이름 필드에 보안 비밀
RAILS_SECRET_NAME
이름을 입력합니다.보안 비밀 값 대화상자에서 mater.key 값을 입력란에 붙여넣습니다.
보안 비밀 만들기를 클릭합니다.
보안 비밀의 보안 비밀 세부정보 페이지에서 프로젝트 번호를 기록합니다.
projects/PROJECTNUM/secrets/RAILS_SECRET_NAME
권한 탭에서 구성원 추가를 클릭합니다.
새 구성원 필드에
PROJECTNUM-compute@developer.gserviceaccount.com
을 입력하고Enter
를 누릅니다.새 구성원 필드에
PROJECTNUM@cloudbuild.gserviceaccount.com
을 입력하고Enter
를 누릅니다.역할 드롭다운 메뉴에서 Secret Manager 보안 비밀 접근자를 선택합니다.
저장을 클릭합니다.
gcloud
config/master.key 값으로 새 보안 비밀을 만듭니다.
gcloud secrets create RAILS_SECRET_NAME --data-file config/master.key
RAILS_SECRET_NAME
을 새 보안 비밀 이름으로 바꿉니다.보안 비밀 생성을 확인하려면 다음을 확인합니다.
gcloud secrets describe RAILS_SECRET_NAME gcloud secrets versions access latest --secret RAILS_SECRET_NAME
프로젝트 번호 값을 가져옵니다.
gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Cloud Run 서비스 계정에 보안 비밀에 대한 액세스 권한을 부여합니다.
gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \ --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
위의 프로젝트 번호 값인
PROJECTNUM
을 바꿉니다.Cloud Build 서비스 계정에 보안 비밀에 대한 액세스 권한을 부여합니다.
gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
출력에서
bindings
가 두 서비스 계정을 구성원으로 나열하는지 확인합니다.
프로덕션 데이터베이스 및 스토리지에 Rails 앱 연결
이 튜토리얼에서는 PostgreSQL 인스턴스를 프로덕션 데이터베이스로, Cloud Storage를 스토리지 백엔드로 사용합니다. Rails에서 새로 생성된 데이터베이스 및 스토리지 버킷에 연결하려면 .env
파일에 액세스하는 데 필요한 모든 정보를 지정해야 합니다. .env
파일에는 애플리케이션 환경 변수의 구성이 포함되어 있습니다. 애플리케이션은 dotenv gem을 사용하여 이 파일을 읽습니다. 보안 비밀은 credentials.yml.enc
및 Secret Manager에 저장되므로 민감한 사용자 인증 정보가 없는 .env
는 암호화할 필요가 없습니다.
- 데이터베이스 및 스토리지 버킷과 연결되도록 Rails 앱을 구성하려면
.env
파일을 엽니다. .env
파일 구성을 다음과 같이 수정합니다. 버킷을 만들 때 사용한MEDIA_BUCKET_SUFFIX
값을 사용합니다.PRODUCTION_DB_NAME: DATABASE_NAME PRODUCTION_DB_USERNAME: DATABASE_USERNAME CLOUD_SQL_CONNECTION_NAME: PROJECT_ID:REGION:INSTANCE_NAME GOOGLE_PROJECT_ID: PROJECT_ID STORAGE_BUCKET_NAME: PROJECT_ID-MEDIA_BUCKET_SUFFIX
이제 Rails 앱을 Cloud Run에 배포하면 Cloud SQL 및 Cloud Storage를 사용하도록 설정되었습니다.
Cloud Build에 Cloud SQL 액세스 권한 부여
Cloud Build에서 데이터베이스 마이그레이션을 적용하려면 Cloud Build에 Cloud SQL 액세스 권한을 부여해야 합니다.
Console
콘솔에서 Identity and Access Management 페이지로 이동합니다.
PROJECTNUM@cloudbuild.gserviceaccount.com
구성원에 대한 항목을 수정하려면 구성원 수정을 클릭합니다.다른 역할 추가를 클릭합니다.
역할 선택 대화상자에서 Cloud SQL 클라이언트를 선택합니다.
저장을 클릭합니다.
gcloud
Cloud Build에 Cloud SQL 액세스 권한을 부여합니다.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/cloudsql.client
Cloud Run에 앱 배포
지원 서비스가 설정되면 이제 Cloud Run 서비스로 앱을 배포할 수 있습니다.
제공된
cloudbuild.yaml
을 사용해 Cloud Build를 사용하여 이미지를 빌드하고, 데이터베이스 마이그레이션을 실행하고, 정적 애셋을 채웁니다.gcloud builds submit --config cloudbuild.yaml \ --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAME
SERVICE_NAME
을 서비스 이름으로 바꿉니다. 이 첫 번째 빌드를 완료하는 데 몇 분 정도 걸립니다. 빌드가 시간 초과된 경우 --build=2000s를 위의 빌드 명령어에 삽입하여 제한 시간을 늘립니다.빌드가 성공하면 Cloud Run 서비스를 처음 배포할 때 서비스 리전, 기본 이미지, 연결된 Cloud SQL 인스턴스를 설정합니다.
gcloud run deploy SERVICE_NAME \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/SERVICE_NAME \ --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \ --allow-unauthenticated
서비스 URL과 함께 배포가 성공한 것을 보여주는 출력이 표시됩니다.
Service [SERVICE_NAME] revision [SERVICE_NAME-00001-tug] has been deployed and is serving 100 percent of traffic at https://SERVICE_NAME-
HASH
-uc.a.run.app배포된 서비스를 확인하려면 서비스 URL로 이동합니다.
새 사진을 업로드해 보세요. 사진이 성공적으로 업로드되면 Rails 애플리케이션이 배포된 것입니다.
애플리케이션 업데이트
초기 프로비저닝 및 배포 단계는 복잡했지만 업데이트는 더 간단한 프로세스입니다.
Cloud Build 빌드 및 마이그레이션 스크립트를 실행합니다.
gcloud builds submit --config cloudbuild.yaml \ --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAME
리전과 이미지만 지정하여 서비스를 배포합니다.
gcloud run deploy SERVICE_NAME \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/SERVICE_NAME
코드 이해하기
Rails 샘플 앱은 표준 Rails 명령어를 사용하여 생성되었습니다. 다음 명령어는 cat_album 앱을 만들고 scaffold 명령어를 사용하여 사진 리소스의 모델, 컨트롤러, 뷰를 생성합니다.
rails new cat_album
rails generate scaffold Photo caption:text
데이터베이스 연결
config/database.yml
파일에는 개발, 테스트, 프로덕션 등 다양한 환경에서 데이터베이스에 액세스하는 데 필요한 구성이 포함되어 있습니다. 예를 들어 프로덕션 데이터베이스는 PostgreSQL용 Cloud SQL에서 실행되도록 구성됩니다. 데이터베이스 이름과 사용자 이름은 .env
파일의 환경 변수를 통해 설정되는 반면, 데이터베이스 비밀번호는 config/credentials.yml.enc
파일 내에 저장되며, 이 경우 RAILS_MASTER_KEY
를 복호화해야 합니다.
앱이 Cloud Run(완전 관리형)에서 실행되면 Cloud Run 환경에서 제공하는 소켓을 사용하여 PostgreSQL 인스턴스에 연결됩니다. 앱이 로컬 머신에서 실행되면 Cloud SQL 인증 프록시를 사용하여 PostgreSQL 인스턴스에 연결됩니다.
클라우드 저장 사용자 업로드 미디어
Rails는 활성 스토리지를 사용하여 Cloud Storage 제공업체에 파일을 업로드합니다.config/storage.yml
및 config/environments/production.rb
파일은 Cloud Storage를 프로덕션 환경의 서비스 제공업체로 지정합니다.
Cloud Build로 자동화
cloudbuild.yaml 파일은 일반적인 이미지 빌드 단계(컨테이너 이미지 생성 후 컨테이너 레지스트리에 푸시)뿐만 아니라 Rails 데이터베이스 마이그레이션도 수행합니다. 이렇게 하려면 Cloud SQL 인증 프록시 도우미인 app-engine-exec-wrapper를 사용하여 데이터베이스에 액세스해야 합니다.
이 구성에는 대체 변수가 사용됩니다. 파일의 값을 직접 변경하면 마이그레이션 시 --substitutions
플래그가 삭제될 수 있습니다.
이 구성에서는 db/migrate
디렉터리의 기존 마이그레이션만 적용됩니다. 마이그레이션 파일을 만들려면 Active Record Migrations를 참조하세요.
이미지를 빌드하고 마이그레이션을 적용하려면 Cloud Build 구성에서 Secret Manager의 RAILS_MASTER_KEY
보안 비밀에 액세스해야 합니다. availableSecrets
필드는 보안 비밀에 사용할 보안 비밀 버전 및 환경 변수를 설정합니다. 마스터 키 보안 비밀은 빌드 이미지 단계의 인수로 전달되며 이미지를 빌드할 때 Dockerfile에서 RAILS_MASTER_KEY
로 설정됩니다.
두 개의 명령어를 실행하지 않고 단일 구성에 배포를 포함하도록 Cloud Build 구성을 확장하려면 Cloud Build를 사용하여 git에서 지속적 배포를 참조하세요. 이렇게 하려면 설명된 대로 IAM을 변경해야 합니다.
Ruby 2.7 지원
이 튜토리얼에서는 Ruby 3.0을 사용하지만 Ruby 2.7도 지원할 수 있습니다. Ruby 2.7을 사용하려면 Dockerfile에서 Ruby 기본 이미지를 2.7로 변경합니다.
삭제
- 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.