Dopplerを用いてオープンEDX環境変数を管理する方法と展開の自動化


秘密は管理するための痛みです、そして、あなたがあなたのアプリケーションとその構成要素を維持するために使用可能であるならば、より良い方法がそれをするためにあります.この記事ではDoppler は、オープンEDXと呼ばれる複雑なシステムの環境変数を簡単かつ迅速に管理するのに役立ちます.
デフォルトでは、開いているEDXをインストールして、維持するために、我々はansibleを使います.たとえば、SMTP資格情報を変更するには、使用可能な変数ファイルを変更する必要があります.その後、ターゲットマシンに配備し、手動で変更を適用するサービスをサーバーで再起動する必要があります.
このプロセスの自動化は、私たちが退屈な仕事を高速化し、時間を節約することができます.Dopplerで我々の変数をホスティングすることによって、我々のコードベースでAPIを通して彼らを読んで、Doppler Webhookを使っている配備を自動化してください.

導入

オープンEDXとは何か
Open edX オンラインコースを作成し、ホストするために使用できるオープンソースプラットフォームです.もともとは、MITとハーバード大学で2012年に開発されて以来、すべての形とサイズの組織によって採用されているオンライン学習ユースケースの広い範囲に電力を供給する.
これは、マイクロソフト、IBM、MIT、およびASASのような組織や大学で使用されている.

どのように、我々はデフォルトEDXで環境変数を扱いますか?
我々は、プラットフォームを提供し、維持するためにansibleを使用します.あなたがansibleに慣れていないならば、それはソフトウェア供給と構成を自動化するオープンソースdevopsツールです.ブロックは以下の通りです:
  • 1または複数の役割を持っている-わかりやすい脚本.あなたのソフトウェアをインストールする方法についての完全な指示としてPlaybookをイメージングしてください、そして、それは構成要素です、そして、どのように彼らはきちんと動くようにセットしましたか.
  • 不可解な役割.スタック内の各コンポーネントには独自のロールがあります.たとえば、あなたのアプリケーションでdjango、nginxとmysqlを使用している場合、それらのそれぞれが独自の役割を持っています.
  • 変数はそれぞれのロールに固有の変数です.たとえば、MySQLロールのルートユーザー名とパスワードを定義する変数を提供する必要があります.

  • 環境変数を変更するワークフローは何ですか?
    我々は、Githubレポで私たちの脚本、役割とその変数を持っており、我々はgithubで私たちの資格情報を公開することを防ぐために変数を暗号化するために可用性のVaultを使用しました.
    Vaultを使って暗号化した後、次のようになります.
    $ANSIBLE_VAULT;1.1;AES256
    61353035366436396262643237303063643839653630393261663234666461653566626130613562
    .
    .
    .
    
    オープンedxの後、それはすべての環境変数のプロビジョニングされたubuntuサーバー上のファイルシステム内のプレーンテキストとして住んでいます.ファイル名lms.yml そして、それは我々の学習管理システムのためにすべての環境変数を含みます.
    EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend
    EMAIL_HOST: smtp.elasticemail.com
    EMAIL_HOST_PASSWORD: ********
    EMAIL_HOST_USER: ******
    EMAIL_PORT: 2525
    EMAIL_USE_TLS: true
    

    サーバーへの変更を配置する
    変数を変更するには、repoの変数ファイルを復号化し、変数を変更してファイルを再び暗号化し、それを使用して展開します.lms.yml を返します.この変更を適用するための1つの追加ステップは、サーバーにsshにし、手動ですべてのサービスを再起動します.

    envファイルの問題
    この実装には複数の問題があります.
  • 無許可の人が我々のサーバーにアクセスするならば、彼らは我々のプラットホームのすべての重要な資格証明書を見ることができます.
  • 展開プロセスは、開発者が簡単にファイルを暗号化してGithubにプッシュすることを忘れることができる変数ファイルを特別に復号化して暗号化することができます.
  • サーバーへの配備に成功したら、手動でサービスを再起動する必要があります.

  • どのようにドップラーヘルプ?
    ドップラーは、これらの3つの問題に対処するために私たちを助けることができます.
  • 我々は、サーバー内のローカルプレーンテキスト変数ファイルを作成する代わりに、ドップラーを使用して直接コードベースの秘密を注入する
  • 復号化し、各展開の変数ファイルを暗号化する必要はありません
  • Doppler WebHoopを使用することができますので、変数の変更がすぐにサーバーにCircleCi展開をトリガーします.

  • 新しい秘密管理設計とアーキテクチャ
    Dopplerを使用する前に、これは環境管理がどのように見えるかです

    我々のプラットホームでドップラーを統合した後に、これは秘密管理がどのように見えるかです.


    ドップラーで環境変数を作成する
    この記事ではドップラーで1つの環境変数を作成しますが、プロセスはドップラーから管理したい環境変数の全てについて同じです.
    私のアカウントでは、プロジェクトを作成しましたopenedx 3環境

    環境変数EMAIL_HOST_PASSWORD SMPTパスワードを管理する.値はaohRj****** これは私の本当のSMTPパスワードではありません


    Dopplerのコードベースへの統合
    私たちのアプリケーションは、Python/djangoので、私は使用されて書かれてDoppler API この統合のために.
    私たちのコードベースをドップラーで統合したので、代わりにEMAIL_HOST_PASSWORD ローカル環境変数ファイルからDoppler APIへの呼び出しを行い、EMAIL_HOST_PASSWORD . 私は、以下で我々のコードベースに以下を加えましたedx-platform/lms/envs/production.py ファイル
    ################################### Getting Environment Variables From Doppler ###################################
    
    
    url = "https://api.doppler.com/v3/configs/config/secrets"
    
    querystring = {"project": "openedx", "config": "dev"}
    DOPPLER_TOKEN = AUTH_TOKENS.get('DOPPLER_TOKEN', '')
    Authorization = "Basic {DOPPLER_TOKEN}".format(DOPPLER_TOKEN=DOPPLER_TOKEN)
    headers = {
        "Accept": "application/json",
        "accepts": "application/json",
        "Authorization": Authorization
    }
    doppler_response = requests.request("GET", url, headers=headers, params=querystring)
    EMAIL_HOST_PASSWORD = doppler_response.json()['secrets']['EMAIL_HOST_PASSWORD']['raw']
    
    削除EMAIL_HOST_PASSWORD = AUTH_TOKENS.get('EMAIL_HOST_PASSWORD', '') ローカル環境変数から値を読み取るのを防ぐために、我々のコードから.
    あなたはgitのdiffを見ることができますhere

    テストしましょう
    >>> from django.conf import settings
    >>> settings.EMAIL_HOST_PASSWORD
    'aohRj******'
    
    あなたが見ることができるように、DjangoセッティングはDopplerEMAIL_HOST_PASSWORD
    Doppler WebhooksとCircleCiを用いた自動展開
    Dopplerで我々のコードベースを統合した後に、我々は安全な方法で我々の変数を主催することによって我々のプラットホームのセキュリティを改善しました、しかし、ドップラーで変数を変えるとき、我々はまだ我々のサーバーにsshを必要として、手動でコマンドを実行しなければなりませんsudo /edx/bin/supervisorctl restart all すべてのサービスを再起動するにはドップラーから私たちの秘密の日付の値を取得します.このマニュアルステップを削除するにはDoppler Webhooksを使用することができます.そのため、変数の一つに変更があるとすぐに、CircleCiを呼び出してサーバー内のすべてのサービスを再起動します.

    循環式設定
    CircleCiでは、プロジェクトを作成しましたdoppler-openedx-deployer . このプロジェクトはconfig.yml 次のようにします.
    version: 2
    jobs:
      build: 
        working_directory: ~/doppler-openedx-deployer
        docker: 
          - image: circleci/python:3.6.4
        steps: 
          - checkout
          - run: 
              name: Deploy to Open edX
              command:  ~/doppler-openedx-deployer/scripts/deploy.sh
              no_output_timeout: 30m
    
    走ることでdeploy.sh 我々は、我々のanplayplaybooksの最新版をダウンロードして、構成を更新して、すべてのサービスを再開するために、EDXサーバーを開けるために、コマンドを配備します.


    ドップラー形状
    Dopplerでは、我々はプロジェクトと我々の終点でWebhooks部に行くことができます.

    ここでのエンドポイントは、Clacleci APIを使用してビルドをトリガーするラムダ関数です.

    どのように動作するか見てみましょう