Ruby 런타임

Ruby 런타임은 애플리케이션 코드 및 종속 항목을 설치한 후 가변형 환경에서 해당 애플리케이션을 실행하는 소프트웨어 스택입니다.

  • 3.2 이상 버전은 빌드팩을 사용하여 빌드되므로 app.yaml 파일에서 운영체제를 선택해야 합니다. 예를 들어 Ruby 3.3(미리보기)을 사용하려면 Ubuntu 22를 운영체제로 지정해야 합니다.

  • 3.1 버전 이하는 Docker를 사용하여 빌드됩니다.

지원되는 Ruby 버전의 전체 목록과 해당 Ubuntu 버전은 런타임 지원 일정을 참조하세요.

Ruby 버전

Ruby 버전 3.2 이상의 경우 운영체제를 지정하려면 app.yaml 파일에 runtime_configoperating_system 설정을 포함해야 합니다.

Ruby 3.3(미리보기)을 사용하려면 다음을 수행해야 합니다.

  • Gemfile에 Ruby 버전을 지정합니다.

    RUBY VERSION
      ruby 3.3.x
    
  • gcloud CLI 버전 420.0.0 이상을 설치합니다. gcloud components update 명령어를 실행하여 CLI 도구를 업데이트할 수 있습니다. 설치된 버전을 보려면 gcloud version 명령어를 실행하면 됩니다.

  • app.yaml 파일에서 operating_system 설정을 지정합니다.

      runtime: ruby
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
    
  • 선택 사항으로 애플리케이션 디렉터리에 있는 .ruby-version 파일을 사용하여 Ruby 인터프리터의 버전을 지정할 수 있습니다. 예를 들면 3.3.x입니다.

이전 버전

Ruby 런타임 버전 3.1 이하의 경우 애플리케이션 디렉터리의 .ruby-version 파일을 사용하여 Ruby 인터프리터 버전을 지정합니다.

이 파일이 있으면 애플리케이션을 배포할 때 런타임에서 rbenv를 사용하여 요청되는 Ruby 버전을 설치합니다. 요청되는 버전을 설치할 수 없을 경우 App Engine은 배포 중에 오류 메시지를 표시합니다.

.ruby-version 파일을 제공하지 않으면 Ruby 런타임은 기본적으로 버전 2.7로 설정됩니다. 기본값은 언제든지 변경될 수 있으므로 앱에서 Ruby 버전을 지정하는 것이 좋습니다.

다른 Ruby 런타임 지원

커스텀 런타임을 사용하여 App Engine 가변형 환경에서 실행되는 Ruby 앱에 기능을 추가할 수 있습니다. 커스텀 런타임을 구성하려면 app.yaml 파일에서 다음 줄을 바꿉니다.

runtime: ruby

아래의 줄과 같이 바꿉니다.

runtime: custom

또한 app.yaml 파일을 포함하는 동일 디렉터리에 Dockerfile.dockerignore 파일을 추가해야 합니다. 자세한 내용은 커스텀 런타임을 참조하세요.

종속 항목

런타임에서는 애플리케이션 소스 디렉터리에서 Gemfile 파일을 찾고 Bundler를 사용하여 애플리케이션을 시작하기 전에 종속 항목을 설치합니다. 패키지를 선언하고 관리하는 방법에 대한 자세한 내용은 Ruby 라이브러리 사용을 참조하세요.

Ruby를 통한 C 라이브러리 사용

C 확장을 요구하는 Ruby 라이브러리의 경우 현재 Ruby 버전의 헤더와 다음 Ubuntu 패키지가 시스템에 사전 설치됩니다.

  • autoconf
  • build-essential
  • ca-certificates
  • cmake
  • curl
  • file
  • git
  • imagemagick
  • libcurl3
  • libcurl3-gnutls
  • libcurl4-openssl-dev
  • libffi-dev
  • libgdbm-dev
  • libgit2-dev
  • libgmp-dev
  • libicu-dev
  • libjemalloc-dev
  • libjemalloc1
  • libmagickwand-dev
  • libmysqlclient-dev
  • libncurses5-dev
  • libpq-dev
  • libqdbm-dev
  • libreadline6-dev
  • libsqlite3-dev
  • libssl-dev
  • libxml2-dev
  • libxslt-dev
  • libyaml-dev
  • libz-dev
  • systemtap
  • tzdata

이 패키지가 있어야 주로 많이 사용되는 Ruby 라이브러리의 설치가 가능합니다. 추가로 운영체제 수준의 종속 항목이 필요한 애플리케이션인 경우 이 런타임을 기반으로 커스텀 런타임을 사용해 적절한 패키지를 설치해야 합니다.

애플리케이션 시작

런타임은 app.yaml에서 정의된 entrypoint를 사용하여 애플리케이션을 시작합니다. 이 진입점에서 환경 변수 PORT로 정의된 포트에서 HTTP 요청에 응답하는 프로세스를 시작할 것입니다. 예를 들면 다음과 같습니다.

entrypoint: bundle exec rails server -p $PORT

대부분의 웹 애플리케이션에서는 Puma, Unicorn, Thin과 같은 Rack 지원 웹 서버를 사용합니다.

서버를 애플리케이션의 Gemfile 구성 파일에 종속 항목으로 추가해야 합니다. 런타임은 진입점을 호출하기 전에 모든 종속 항목을 설치합니다.

source "https://rubygems.org"

gem "rack"
gem "puma"

Rails 애플리케이션에 puma를 사용하는 진입점의 예:

entrypoint: bundle exec rails server Puma -p $PORT

Rack 애플리케이션에 puma를 사용하는 진입점의 예:

entrypoint: bundle exec rackup -s Puma -p $PORT

Rack 서버 없이 요청을 처리할 수 있는 애플리케이션에서는 ruby 스크립트만 실행하면 됩니다.

entrypoint: bundle exec ruby app.rb

환경 변수

런타임 환경에서 설정되는 환경 변수는 다음과 같습니다.

환경 변수 설명
GAE_INSTANCE 현재 인스턴스의 이름입니다.
GAE_MEMORY_MB 애플리케이션 프로세스에서 사용할 수 있는 메모리 양입니다.
GAE_SERVICE 애플리케이션의 app.yaml 파일에 지정된 서비스 이름이거나 서비스 이름이 지정되지 않은 경우 default로 설정됩니다.
GAE_VERSION 현재 애플리케이션의 버전 라벨입니다.
GOOGLE_CLOUD_PROJECT 애플리케이션과 연결된 프로젝트 ID로, Google Cloud 콘솔에 표시됩니다.
PORT HTTP 요청을 수신할 포트
RACK_ENV production로 설정합니다.
RAILS_ENV production로 설정합니다.
RAILS_SERVE_STATIC_FILES true로 설정합니다.

app.yaml로 추가 환경 변수를 설정할 수 있습니다.

메타데이터 서버

애플리케이션의 각 인스턴스에서 Compute Engine 메타데이터 서버를 사용하여 호스트 이름, 외부 IP 주소, 인스턴스 ID, 커스텀 메타데이터, 서비스 계정 정보를 포함한 인스턴스 관련 정보를 쿼리할 수 있습니다. App Engine에서는 인스턴스마다 커스텀 메타데이터를 설정할 수 없지만 프로젝트 전체의 커스텀 메타데이터를 설정한 후 App Engine 및 Compute Engine 인스턴스에서 읽을 수 있습니다.

이 예시 함수는 메타데이터 서버를 사용하여 Ruby 런타임 버전 3.1 이하가 실행되는 인스턴스와 3.3 이상이 실행되는 인스턴스의 외부 IP 주소를 가져옵니다. 참고로 새 버전을 사용하려면 app.yaml 파일을 업데이트해야 합니다. 새 런타임 사용에 대한 자세한 내용은 Ruby 런타임을 참조하세요.

require "sinatra"
require "net/http"

get "/" do
  uri = URI.parse(
    "http://metadata.google.internal/computeMetadata/v1" +
    "/instance/network-interfaces/0/access-configs/0/external-ip"
  )

  request = Net::HTTP::Get.new uri.path
  request.add_field "Metadata-Flavor", "Google"

  http = Net::HTTP.new uri.host, uri.port

  response = http.request request

  "External IP: #{response.body}"
end