Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

환경 변수에 대한 Rubyists 가이드

개발 및 프로덕션 환경에서 웹 앱을 효과적으로 관리하려면 환경 변수를 이해해야 합니다.

항상 그런 것은 아니었습니다. 불과 몇 년 전만 해도 Rails 앱을 환경 변수로 구성하는 사람은 거의 없었습니다. 그런데 Heroku가 일어났습니다.

Heroku는 개발자에게 12단계 앱 접근 방식을 소개했습니다. 12단계 앱 매니페스토에서 배포하기 쉬운 앱을 만들기 위한 많은 권장사항을 제시합니다. 환경 변수에 대한 섹션이 특히 영향을 미쳤습니다.

12요소 앱은 환경 변수에 구성을 저장합니다(종종 env vars 또는 env로 축약됨). Env 변수는 코드를 변경하지 않고 배포 간에 쉽게 변경할 수 있습니다. 구성 파일과 달리 실수로 코드 저장소에 체크인될 가능성이 거의 없습니다. 사용자 지정 구성 파일이나 Java 시스템 속성과 같은 기타 구성 메커니즘과 달리 언어 및 OS에 구애받지 않는 표준입니다.

더 많은 Rubyists가 그 어느 때보다 환경 변수를 사용하고 있습니다. 그러나 종종 그것은 화물 운송 방식입니다. 작동 방식을 제대로 이해하지 못한 채 이러한 것들을 사용하고 있습니다.

이 게시물은 환경 변수가 실제로 어떻게 작동하는지, 그리고 아마도 더 중요하게는 작동하지 않는 방식을 보여줄 것입니다. 또한 Rails 앱에서 환경 변수를 관리하는 가장 일반적인 방법을 살펴보겠습니다. 시작하겠습니다!

참고:여기에서 환경 변수 보안에 대해 읽을 수 있습니다.

모든 프로세스에는 고유한 환경 변수 세트가 있습니다.

서버에서 실행하는 모든 프로그램에는 최소한 하나의 프로세스가 있습니다. 해당 프로세스는 자체 환경 변수 세트를 가져옵니다. 일단 그것들을 갖게 되면 그 과정을 벗어나는 어떤 것도 그것들을 바꿀 수 없습니다.

초보자가 저지르는 이해할 수 있는 실수는 환경 변수가 서버 전체에 걸쳐 있다고 생각하는 것입니다. Heroku와 같은 서비스는 환경 변수를 설정하는 것이 디스크의 구성 파일을 수정하는 것과 동일하게 보이게 합니다. 그러나 환경 변수는 구성 파일과 다릅니다.

서버에서 실행하는 모든 프로그램은 실행하는 순간 고유한 환경 변수 세트를 갖습니다.

환경 변수에 대한 Rubyists 가이드 모든 프로세스에는 고유한 환경이 있습니다.

환경 변수는 프로세스와 함께 죽습니다.

환경 변수를 설정하고 재부팅했는데 없어진 것을 발견한 적이 있습니까? 환경 변수는 프로세스에 속하므로 프로세스가 종료될 때마다 환경 변수가 사라집니다.

하나의 IRB 세션에서 환경 변수를 설정하고 닫고 두 번째 irb 세션에서 변수에 액세스하려고 하면 이를 확인할 수 있습니다.

환경 변수에 대한 Rubyists 가이드 프로세스가 종료되면 환경 변수가 손실됩니다.

이것은 서버가 재부팅되거나 셸을 종료할 때 환경 변수를 잃게 하는 동일한 원칙입니다. 세션 간에 유지하려면 .bashrc와 같은 일종의 구성 파일에 저장해야 합니다. .

프로세스는 부모로부터 환경 변수를 가져옵니다.

모든 프로세스에는 부모가 있습니다. 모든 프로그램은 다른 프로그램에서 시작해야 하기 때문입니다.

bash 셸을 사용하여 vim을 시작하면 vim의 부모가 셸입니다. Rails 앱이 imagemagick을 사용하여 이미지를 식별하는 경우 identify 프로그램이 Rails 앱이 됩니다.

환경 변수에 대한 Rubyists 가이드 자식 프로세스는 부모로부터 환경 변수를 상속합니다.

아래 예에서는 IRB 프로세스에서 $MARCO 환경 변수의 값을 설정하고 있습니다. 그런 다음 역따옴표를 사용하여 해당 변수의 값을 출력하고 에코합니다.

IRB는 내가 방금 만든 셸의 부모 프로세스이므로 $MARCO 환경 변수의 복사본을 가져옵니다.

환경 변수에 대한 Rubyists 가이드 Ruby에 설정된 환경 변수는 자식 프로세스에 상속됩니다.

부모는 자녀에게 보내는 환경 변수를 사용자 정의할 수 있습니다.

기본적으로 자식은 부모가 가지고 있는 모든 환경 변수의 복사본을 받습니다. 그러나 부모가 이를 제어할 수 있습니다.

명령줄에서 env 프로그램을 사용할 수 있습니다. 그리고 bash에는 부모 변수를 설정하지 않고 자식 변수에 env 변수를 설정하는 특별한 구문이 있습니다.

환경 변수에 대한 Rubyists 가이드 부모에 환경 변수를 설정하지 않고 자식에 대한 환경 변수를 설정하려면 env 명령을 사용하십시오.

Ruby 내부에서 셸링하는 경우 ENV 해시를 어지럽히지 않고 자식 프로세스에 사용자 지정 환경 변수를 제공할 수도 있습니다. system과 함께 다음 구문을 사용하기만 하면 됩니다. 방법:

환경 변수에 대한 Rubyists 가이드 사용자 지정 환경 변수를 Ruby의 시스템 메서드에 전달하는 방법

자식은 부모의 환경 변수를 설정할 수 없습니다.

어린이는 사본만 받기 때문에 부모의 환경 변수 중 자식이 변경한 사항은 부모에게 영향을 미치지 않습니다.

환경 변수에 대한 Rubyists 가이드 환경 변수는 "참조에 의한"이 아닌 "값에 의해 전달"됨

여기에서 백틱 구문을 사용하여 환경 변수를 설정하고 설정하려고 합니다. 변수가 자식에 대해 설정되는 동안 새 값은 부모에게 버블링되지 않습니다.

환경 변수에 대한 Rubyists 가이드 자식 프로세스는 부모 환경 변수를 변경할 수 없습니다.

실행 중인 프로세스 간에 환경 변경 사항이 동기화되지 않음

아래 예에서는 두 개의 IRB 복사본을 나란히 실행하고 있습니다. 한 IRB 세션의 환경에 변수를 추가해도 다른 IRB 세션에는 영향을 미치지 않습니다.

환경 변수에 대한 Rubyists 가이드 한 프로세스에 환경 변수를 추가해도 다른 프로세스에서는 변경되지 않습니다.

귀하의 셸은 환경 변수 시스템의 UI일 뿐입니다.

시스템 자체는 OS 커널의 일부입니다. 즉, 셸에는 환경 변수에 대한 마법의 힘이 없습니다. 실행하는 다른 모든 프로그램과 동일한 규칙을 따라야 합니다.

환경 변수는 쉘 변수와 동일하지 않습니다.

가장 큰 오해 중 하나는 쉘이 자체 "로컬" 쉘 변수 시스템을 제공하기 때문에 발생합니다. 지역 변수를 사용하는 구문은 종종 환경 변수와 동일합니다. 그리고 초보자는 종종 이 둘을 혼동합니다.

그러나 지역 변수는 자식에게 복사되지 않습니다.

환경 변수에 대한 Rubyists 가이드 환경 변수는 셸 변수와 다릅니다.

예제를 살펴보겠습니다. 먼저 MARCO라는 로컬 쉘 변수를 설정했습니다. 이것은 지역 변수이기 때문에 어떤 자식 프로세스에도 복사되지 않습니다. 따라서 Ruby를 통해 인쇄하려고 하면 작동하지 않습니다.

다음으로 export 명령을 사용하여 지역 변수를 환경 변수로 변환합니다. 이제 이 쉘이 생성하는 모든 새 프로세스에 복사됩니다. 이제 Ruby에서 환경 변수를 사용할 수 있습니다.

환경 변수에 대한 Rubyists 가이드 하위 프로세스에서 로컬 변수를 사용할 수 없습니다. 내보내기는 지역 변수를 환경 변수로 변환합니다.

실제 환경 변수 관리

이 모든 것이 현실 세계에서 어떻게 작동합니까? 예를 들어 보겠습니다.

단일 컴퓨터에서 실행 중인 두 개의 Rails 앱이 있다고 가정합니다. Honeybadger를 사용하여 이러한 앱에서 예외를 모니터링하고 있습니다. 하지만 문제가 발생했습니다.

$HONEYBADGER_API_KEY 환경 변수에 Honeybadger API 키를 저장하려고 합니다. 하지만 두 앱에는 두 개의 개별 API 키가 있습니다.

하나의 환경 변수가 어떻게 두 개의 다른 값을 가질 수 있습니까?

지금쯤이면 답을 알고 있기를 바랍니다. env 변수는 프로세스별이고 두 개의 레일 앱이 서로 다른 프로세스에서 실행되기 때문에 각각 $HONEYBADGER_API_KEY에 대해 고유한 값을 가질 수 없는 이유가 없습니다.

이제 유일한 문제는 설정 방법입니다. 다행히도 이 작업을 정말 쉽게 해주는 몇 가지 보석이 있습니다.

피가로

Rails 앱에 Figaro gem을 설치하면 config/application.yml에 입력하는 모든 값이 시작 시 ruby ​​ENV 해시에 로드됩니다.

보석을 설치하기만 하면 됩니다.

# Gemfile
gem "figaro"

그리고 application.yml에 항목을 추가하기 시작합니다. 실수로 비밀을 커밋하지 않도록 이 파일을 .gitignore에 추가하는 것이 매우 중요합니다.

# config/application.yml

HONEYBADGER_API_KEY: 12345

도텐브

dotenv gem은 .env에서 환경 변수를 로드하고 YAML을 사용하지 않는다는 점을 제외하면 Figaro와 매우 유사합니다.

보석을 설치하기만 하면 됩니다.

# Gemfile

gem 'dotenv-rails'

그리고 .env에 구성 값을 추가하고 실수로 파일을 github에 게시하지 않도록 git이 파일을 무시하는지 확인하십시오.

HONEYBADGER_API_KEY=12345

그런 다음 Ruby ENV 해시의 값에 액세스할 수 있습니다.

ENV["HONEYBADGER_API_KEY"]

다음과 같이 미리 정의된 환경 변수 집합을 사용하여 셸에서 명령을 실행할 수도 있습니다.

dotenv ./my_script.sh

비밀.yml?

죄송합니다. Secrets.yml은 멋지지만 환경 변수를 설정하지 않습니다. 따라서 실제로 Figaro 및 dotenv와 같은 보석을 대체하는 것은 아닙니다.

일반 Linux

기본 Linux 명령을 사용하여 앱별로 고유한 환경 변수 세트를 유지 관리하는 것도 가능합니다. 한 가지 접근 방식은 서버에서 실행 중인 각 앱을 다른 사용자가 소유하도록 하는 것입니다. 그런 다음 사용자의 .bashrc를 사용하여 애플리케이션별 값을 저장할 수 있습니다.