환경 변수를 어떻게 저장해야합니까?


11

이것은 환경 변수 / 구조에 관한 방법과 조언에 대한 매우 광범위한 질문입니다. 그러나 궁극적으로 '환경 변수를 어떻게 저장해야합니까?'라는 매우 구체적인 질문에 대한 답을 찾고 있습니다.

먼저 몇 가지 설명이 있습니다.

  • 제 환경은 서버가 3 대에서 10 대 사이 일 수 있으며 특정 고객의 인프라를 포함하는 방법입니다.
  • 각 환경에는 몇 가지 주요 입력 (이름, 크기 등)에서 자동으로 생성되는 몇 가지 변수가 있습니다.

지금 우리는 모든 환경 변수를 다음과 같은 구조로 저장합니다.

<playbook>.yml                   # Various playbooks for deployment
roles/windows                    # Ansible role for Ubuntu
roles/ubuntu                     # Ansible role for Ubuntu
config/hosts/<name>.yml          # Ansible inventory
config/hosts/vars/<name>.json    # Environment specific variables 

현재 설정은 위의 git 저장소에서 하위 모듈로 초기화되었습니다. 변수 파일이 다소 자주 변경되면 커밋 사이에서 데이터 변경 문제가 발생하여 변경 사항을 추적하기가 점점 더 어려워집니다.

개인적으로 살펴보면 모든 고객 변수를 중앙 집중식 / 확장 가능한 방식으로 저장 한 다음 동적 인벤토리를 사용하여 연결 합니다.

Consul과 같이 필요한 것의 일부를 수행하는 것처럼 보이는 몇 가지 기술이 있다는 것을 알고 있지만 약간 다른 작은 응용 프로그램이 아닌 하나의 큰 응용 프로그램을 제공하는 환경에서 가장 잘 작동하는 것으로 보입니다.

본질적으로 인벤토리 스크립트를 작성하고 모든 데이터를 의도하지 않은 내장 데이터베이스에 넣은 다음 아무것도 바뀌지 않는 것처럼 계속 진행해야합니다. 나는 이것이 현재 저장하고있는 많은 데이터를 잠재적으로 정리하고 데이터를 다시 제공하는 것을 확장하는 대신 데이터를 저장하는 다른 방법을 조사 할 수있는 방법으로 생각합니다.

하나, 둘 또는 세 개의 거대한 환경이 아닌 많은 소규모 환경을 처리해야 할 때 누군가가 코드로 인프라를 구현 한 경험이 있기를 바랍니다.

어떤 제안?

답변:


13

확장 가능한 방식으로 환경 변수를 수행하는 데 두 번의 실행이 있었으며, 내가 발견 한 것처럼 올바르게 달성하기가 매우 까다로워서 완벽한 결과를 얻지 못했습니다. 아래 두 가지 경험을 요약 해 드리겠습니다.

공통 요소

  • 환경 변수는 원래 소스 코드와 별도의 저장소에 저장됩니다 (함께 서브 모듈화되어 있지만 여전히 별도의 저장소를 기반으로 함)
  • 아티팩트에 대한 별도의 "빌드"프로세스가 있으며 변수입니다.
  • 환경 변수에 대한 별도의 릴리스 프로세스 가 없습니다 . 환경 변수를 변경하려면 동일한 변경 검토 보드를 거쳐야합니다.

영사 KV 쌍 사용

환경 변수는 아티팩트 저장소 (원래 git repo가 ​​아님)에서로드되고 네임 스페이스가 지정된 KV 쌍 트리에로드됩니다 (예 :

/env/dev1/my/application/v1.1.1

위의 dev1이 환경의 이름 인 경우 my / application은 응용 프로그램 네임 스페이스이고 v1.1.1은 사용할 환경 변수의 버전입니다.

개발자에게는 이러한 모든 것이 보이지 않습니다. 런타임시 플랫폼은 환경이 현재 영사 클러스터에 존재하는지 확인하고 (문제가없고 오류가있는 경우) 응용 프로그램 네임 스페이스에 대한 하위 트리를 확인합니다 (이 방법으로 하나의 앱에서 교차 오염이 발생하지 않음) 다른 앱을 vars 참조) 구성의 버전 번호는 배포 가능한 아티팩트에 연결된 레이블에서 가져옵니다. 이 레이블을 업데이트하는 것이 중요합니다. 두 프로덕션 데이터 센터를 모두 잃어버린 경우 배포 가능한 아티팩트에서 메타 데이터를 읽고 KV 스토어에 모든 환경 변수 를 로드하여 환경을 다시 견딜 수 있다는 의미이기 때문 입니다.

이 접근 방식의 문제점 개발자는 항상, 그리고 매번, 구성 변경을 환경에 적용하여 애플리케이션 실행 방법에 중대한 영향을 미치는 방법을 찾았습니다. 코드 변경보다 구성 변경 승인을받는 것이 더 쉬워졌습니다.

변수가 포함 된 "배포"아티팩트 저장

이는 정확한 버전의 아티팩트를 구성 버전에 밀접하게 연결합니다. 구성을 변경 한 경우이 배치 아티팩트를 다시 빌드해야합니다.

배치 아티팩트 자체는 기본적으로 릴리스 가능한 바이너리의 URL과 여기에 첨부 된 모든 구성을 포함하는 yaml 파일이었습니다.

플랫폼에는 변수를 읽은 다음 시작될 때 애플리케이션의 프로세스 트리로 변수를 읽어들이는 컴포넌트가 포함되어 있습니다.

이것은 우리가 역사를 추적 할 수있는 인공물이 있고 리뷰 보드를 유지할 수있는 인공물이 있기 때문에 지금까지 훨씬 더 성공적이었습니다. "이것은 우리가 신경 쓰는 유일한 인공물이며, 볼 필요가 없습니다. 다른 변경 사항,이 사항 만 변경 "(예 : 배포 할 응용 프로그램 버전, 환경 변수 포함 등)

따라서 개발자가 응용 프로그램에 논리를 작성하여 변수에 따라 동작을 변경하는 논리를 작성하는 것이 조금 더 어려워 지므로 적절한 테스트주기를 거치지 않고도 변경 사항을 적용 할 수 있습니다.

보너스 포인트

응용 프로그램 비밀을 고려하십시오. 이에 대한 우리의 솔루션은 개발 팀이 확장 Java 키 저장소 (대부분의 모든 언어에 Java 키 저장소를 읽을 수있는 라이브러리가 있음)를 암호화하는 데 사용하는 공개 RSA 키를 제공하는 것입니다. 서버로 가져와 플랫폼 개인 키로 해독하여 런타임에 응용 프로그램에 제공합니다.

분명히 비밀 관리는 자체 웜 캔입니다. 그러나 아마도 고려해 볼 가치가 있습니다.


2
Re : 응용 프로그램의 비밀, Vault ( vaultproject.io )는 Hashicorp의 툴체인의 일부이므로 Consul (및 해당 상자의 다른 도구)과 다소 깔끔하게 통합되므로 Vault ( vaultproject.io )를 살펴 보는 것이 좋습니다.
Michael Bravo

나는 실제로 큰 hashicorp 물건이 얼마나 좋은지 볼 때 금고에 매우 당황했습니다. 본질적으로 그들의 제품과 다른 시장의 세 가지 격차-1. '비밀을위한 비밀'은 본질적으로 모델이 요약 한 것입니다. 샤딩 또는 HSM을 사용하고 있습니다. 그러나 본질적으로 그것은 비밀 거래입니다. 2. 도구 호환성 다른 도구와 달리 플러그인을 지원하지 않습니다. 3. 가격. 나는 금고가 비싸다고 생각한다고 회사에 말했을 때 그것을 믿지 않았다. 그들은 너무 싸다는 이유로 제품을 거부했습니다. 그러나 금고는 너무 커서 고려조차하지 않았습니다.
hvindin

유료 버전을 사용하는 경우 비용이 많이 든다는 점은 주목할 가치가 있습니다 . Vault의 핵심 제품은 오픈 소스입니다. 물론 그들은 그들의 사이트에 pro / enterprise 버전에 대한 가격을 표시하지 않기 때문에, 나는 그 판에 대해 그것이 얼마나 비합리적인지 전혀 모른다.
Adrian

흠, 나는 금고에서 처음 두 가지 문제가 공정 하기는하지만 내 의견에서 누락 된 것을 알지 못했습니다. 자격을 갖추려면 다른 hashicorp 제품과 비교할 때 Vault에 대한 나의 생각은 매우 훌륭하다고 생각합니다. 시장에 나와있는 다른 제품과 비교할 때 비슷한 기능을 수행하는 것은 아마도 어떤 이유로 예상보다 훨씬 비쌉니다.
hvindin

"적절한 테스트주기를 거치지 않고 변경 사항을 적용 할 수 있도록 변수에 따라 동작을 변경하는 응용 프로그램에 논리를 빌드하는 예를 들어 줄 수 있습니까?" 정말 흔한 것 같지만 구체적인 예를 상상할 수는 없습니다.
kenchew

3

귀하의 환경이 고객 당인 경우 특정 사례 에서 고객 당 저장소 를 갖는 것이 좋습니다 . (일반적으로 환경 당 저장소입니다.)이 저장소에는 환경 변수, 사용 가능한 변수 및 인벤토리, 강력하게 암호화 된 비밀 (계정 액세스 토큰, 개인 키 등)에 대한 표준 디렉토리 구조가 있습니다. 하위 저장소에 코드를 해당 리포지토리에 넣습니다. 아마 여러 저장소에서 할 것입니다. 하나는 역할 및 모듈, 하나는 유지 관리 및 배포 스크립트, 하나는 환경에서 실행되는 각 주요 응용 프로그램에 대한 것입니다.

이제 실제로 선택적으로 코드를 분기하거나 릴리스를 위해 특정 태그에 서브 모듈을 고정 할 수 있습니다 . 테스트하여 릴리스하지 않으면 고객 환경을 관리하는 코드가 변경되지 않습니다.

이슈 저장소를 사용하는 경우 이슈의 버전이 올바르게 지정되고 해당 버전이 환경 변수에 올바르게 지정되어 있는지 확인하십시오.

환경 변수는 가능한 경우 사람이 업데이트하지 말고 스크립트로 생성해야하므로 자동화 가 중요합니다. 고객 당 인벤토리에 수동 업데이트가 거의없고 개발자가 코드 리포지토리 만 업데이트해야합니다. 구성을 변경하려면 생성 스크립트 중 하나를 수행해야합니다. 그런 다음 스크립트를 실행하여 변수를 생성하고 diff는 고객 저장소에 커밋됩니다. 이 프로세스에 대한 지속적인 통합을 설정하는 데 비용이 듭니다. 이것이 없으면 어느 정도 유지 하기에는 너무 많은 저장소가있을 것 입니다.


단 하나의 이의 제기 : 비밀은 엄격한 액세스 제어 지원이없는 한 버전 제어 저장소로 들어가면 안됩니다. Git은 저장소를 가져 오는 사람이 비밀을 볼 수 없으며 문제가 될 수 있습니다. 더 이상 비밀이 아닙니다.
Dan Cornilescu

잘 잡았습니다. 암호화 된 비밀입니다. 암호 해독 키가 손상되었습니다.
Jiri Klouda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.