첫 번째 프로덕션 앱을 시작할 준비가 되었습니다. 이제 일부 외부 서비스와 통신할 시간입니다. 여전히 모든 것을 연결해야 합니다. 개발 시스템에서 작업을 더 복잡하게 만들지 않고 프로덕션 환경에서 서비스를 구성하는 가장 좋은 방법은 무엇입니까?
환경 설정
프로덕션 앱을 구성하기 위해 오늘날의 모범 사례는 환경 변수(ENV["REDIS_HOST"]
-보고있는 것들).
그런데 왜요?
-
실수로 프로덕션 키를 커밋하기가 더 어렵습니다.
주의를 기울이지 않으면
git push
중요한 비밀 키가 있는 파일. 그리고 그것은 값비싼 실수가 될 수 있습니다. -
구성은 환경 변수를 위한 것입니다.
환경 변수는 거의 모든 종류의 시스템에서 앱을 구성하는 일반적인 방법입니다. Ruby와 같은 다른 많은 프로그램은 환경 변수를 구성에 사용하므로 자신의 앱에서만 시도하는 것이 좋습니다.
-
환경 변수는 프로덕션 환경에서 쉽게 설정할 수 있습니다.
Heroku에는 환경 변수를 쉽게 설정할 수 있는 웹 UI와 명령줄 도구가 있습니다. 또한 자체 서버를 구축하는 경우 Chef 및 Docker와 같은 서버 관리 도구를 사용하면 환경 변수를 쉽게 설정할 수 있습니다.
Rails 측면에서 어떻게 보입니까?
환경 변수에 의존하는 앱이 스스로를 구성하는 방법은 다음과 같습니다.
production:
host: <%= ENV["MY_SERVICE_HOST"] %>
port: <%= ENV["MY_SERVICE_PORT"] %>
my_service_config = Rails.application.config_for(:my_service)
my_service = MyService.new(my_service_config["host"], my_service_config["port"])
이니셜라이저는 Rails 4.2의 config_for
를 사용합니다. 올바른 .yml
을 찾는 방법 파일을 만들고 올바른 환경을 선택하십시오.
그런 다음 config_for
ERB
실행 my_service.yml
내부의 코드 , 그리고 MY_SERVICE_HOST
를 가져옵니다. 및 MY_SERVICE_PORT
환경에서. 이러한 값을 MyService
에 전달합니다. .
ENV["MY_SERVICE_HOST"]
에서 초기화 프로그램을 읽도록 할 수도 있습니다. 곧장. 하지만 .yml
에 보관하는 것을 선호합니다. 몇 분 안에 볼 수 있는 이유입니다.
개발 중인 앱 구성
환경 변수는 프로덕션에 적합합니다. 하지만 프로덕션 구성을 설정한 후에는 개발 및 테스트 모드를 어떻게 처리합니까?
몇 가지 옵션이 있습니다. 하지만 저는 보통 Rails의 config/secrets.yml
규칙을 따릅니다. :프로덕션에서는 환경 변수를 사용하고 개발 및 테스트에서는 비밀이 아닌 값을 하드코딩합니다.
개발 및 테스트 환경에서 config/my_service.yml
다음과 같이 보일 수 있습니다.
production:
host: <%= ENV["MY_SERVICE_HOST"] %>
port: <%= ENV["MY_SERVICE_PORT"] %>
development:
host: localhost
port: 8081
test:
host: localhost
port: 8081
훌륭하게도 초기화 프로그램은 정확히 동일하게 유지될 수 있습니다. 이 파일의 값은 개발 및 테스트 환경에서 사용되며 프로덕션 환경은 환경 변수에서 값을 가져옵니다.
그런데 왜 이러한 값을 하드코딩할까요?
-
구성 값을 보고 변경하기가 더 쉽습니다.
새로운 기능을 실험하면서 구성을 조정할 수 있습니다. 이는 개발 단계에서는 원하지만 프로덕션 단계에서는 그리 많지 않은 것입니다.
-
초보자가 시작하기가 더 쉽습니다.
필요한 모든 샘플 구성이 git 리포지토리에 체크인되면 새 개발자는 앱을 복제하고 실행하기만 하면 됩니다. 앱이 작동하도록 하기 위해 올바른 값을 설정하는 데 애쓸 필요가 없습니다.
-
충돌하는 환경 변수에 대해 걱정할 필요가 없습니다.
단일 프로덕션 머신에 배포하는 것보다 더 많은 앱을 개발 머신에서 작업하게 될 것입니다. 시스템 전체 환경 변수를 사용하여 이러한 모든 앱을 구성했다면 두 앱이 서로를 밟을 가능성이 큽니다.
따라서 프로덕션 환경 변수를 사용하고 하드코딩된 .yml
구성 중입니다. 쉽고 가독성이 높으며 Rails에는 이러한 종류의 구성 파일을 정확히 처리할 수 있도록 지원 기능이 내장되어 있습니다.
개발을 위한 또 다른 옵션
개발 모드에서 구성을 처리하는 또 다른 방법은 dotenv입니다. 깔끔해보이지만 아직 제 앱에서는 해보지 못했습니다.
dotenv를 사용하면 .env
라는 파일에 환경 변수를 넣을 수 있습니다. Rails 앱의 루트 디렉토리에 있고 해당 값은 앱에서 선택합니다. 개발 환경이 프로덕션 환경처럼 작동하기 때문에 이것은 좋습니다. 이는 프로덕션에서만 발생하는 버그를 방지하는 좋은 방법입니다.
언젠가 시도해 볼 일입니다. 하지만 현재로서는 .yml
보다 더 편리한 것을 찾지 못했습니다. 및 config_for
.
대부분의 프로덕션 앱에는 일종의 구성이 필요합니다. 따라서 다음 앱을 배포할 때 .yml
을 사용해 보세요. 프로덕션 환경 변수로 채워진 파일을 구성합니다. 원하는 유연성, 단순성 및 안정성을 얻을 수 있습니다.
프로덕션 앱을 구성하는 다른 방법이 있습니까? 의견을 남겨주세요. 듣고 싶습니다!