苫小牧高専 情報処理同好会 JoshoLTの発表資料
環境変数について2018/06/19情処LT(6月)ઐ߈Պ ฏNLUBLVZB
View Slide
向平卓矢 / Takuya Mukohira• @mktakuya• 情報工学科出身 専攻科2年• 高専プロコン2018 課題部門
環境変数について
環境変数とは• OSが提供するデータ共有機能。 プロセスを越えてグローバル変数的な使い方ができる。• システムにより定義されるものと ユーザが定義するものがある。• シェルで echo $OSTYPE すると "linux-gnu" とか "darwin" とか出る。• その他の有名ドコロは $PATH とか $EDITOR とか $HTTP_PROXY とか。
環境変数とは• 環境変数は自分で定義することもできる• export VAR="hogehoge" とか• シェルの設定ファイルに書くとか $HOME/.bashrc とか $HOME/.tcshrc とか $HOME/.profile とか• 定義方法はシェルによって異なる bash: export VAR='hogehoge' # だいたいこっちでOK tcsh: setenv VAR 'hogehoge' # jocalc
自作のプログラムから利用する• 環境変数は自分のプログラムから利用することが出来る。• 【C言語】 getenv("VAR"); // stdlib.h必要 【Ruby】 ENV['VAR'] 【Python】 os.environ['VAR'] # osモジュールのimport必要
環境変数の使いドコロ• 自作のプログラムの設定情報を格納するのにも利用できる• ユーザ名やパスワード、トークンなど外部サービスの 認証情報や、データベースの接続先などを格納し、 コード上から利用するためにも使う。• その他、コードとは分離すべき設定を格納する。
認証情報を 環境変数に格納する
例えばTwitter Bot• Twitter APIと連携して動くプログラム• ユーザのフォローやツイートには認証が必要• ユーザごとに異なる認証情報
MinimalなTwitter Bot
MinimalなTwitter BotˢೝূใΛϋʔυίʔσΟϯά ɹɹɹɹɹɹʢϕλॻ͖ʣ͍ͯ͠Δ˞্هτʔΫϯྨదͳͭͰ͢
認証情報のハードコーディングが良くない理由• 情報漏えいの危険性• 完成したTwitter botをGitHubで公開! → 認証情報の漏えい、アカウント乗っ取り• ソースコードを他人に渡したい時どうする……?• 実装(コード)と設定(認証情報)が密に結合している• 手元のPCではテスト用アカウントを、本番環境では本番用のアカウントを使う、といった事をしたい時どうする……?
ॳ৺ऀ͕"84Ͱϛεͬͯෆਖ਼ར༻͞Εͯ ٻɺٽ͖ͦ͏ʹͳ͓ͬͨɻIUUQTRJJUBDPNNPDIJ[VLJLPUBSPJUFNTBF⒎BFC悲しい実例• ハッカソンでAWSを使った アプリを開発• AWSの認証情報を GitHubに公開してしまう• アクセスキーを抜かれて 不正利用され、$6,000請求 (日本円で66万円くらい?)• AWSの中の人の慈悲で 払わなくて済む
認証情報を環境変数に格納するˢγΣϧͷઃఆϑΝΠϧʹهʢ͜ͷϑΝΠϧެ։͠ͳ͍ʣˢڥม͔ΒೝূใΛऔಘʢίʔυެ։ͯ͠େৎʣ
開発用・本番用で認証情報を分ける• 開発中→テスト用の鍵アカウント 本番環境→本アカウント をコードの変更無しで実現できる
The Twelve Factor App• プログラミング言語やフレームワークに依存しない、 いい感じのSaaSを作るための12の方法論。• Herokuの人が提唱。IUUQTGBDUPSOFUKB
The Twelve Factor App• Ⅲ.設定• Twelve Factor Appは設定を環境変数に格納し、 設定をコードから厳密に分離する。• 設定とは ・データベースサーバやキャッシュサーバ等への接続情報 ・外部サービスの認証情報 ・その他、デプロイごとの値• 判断基準:コードベースを今すぐオープンソースにできるか
複数の環境をひとつのコードベースで• ひとつのコードベースで複数のデプロイを実現可能• 本番とステージングでDBやメールアカウントを分けたり、 ステージングは無料プラン、本番では有料プランを使う等
プロジェクトごとに環境変数を分ける
プロジェクトごとに環境変数を分ける• プロジェクトごとに環境変数を分けたい事がある。• 例えば…… プロジェクトA: TwitterアカウントA用の認証情報 プロジェクトB: TwitterアカウントB用の認証情報• シェルの設定ファイルに書くと、 全プロジェクト共通で環境変数が設定されてしまう。
direnvの導入• https://github.com/direnv/direnv An environment switcher for the shell.• ディレクトリごとに環境変数を切替えられる。• ディレクトリAに移動すると プロジェクトA用の環境変数が設定され、 ディレクトリBに移動すると プロジェクトB用の環境変数が設定される。• macOSやLinuxの各ディストリ、各種BSDに対応。
direnvの導入• インストールや設定、詳しい使い方は公式のREADME参照• ディレクトリ移動すると環境変数がswitchされるデモ
まとめ• 環境変数というモノがある。• 認証情報やコードから分離すべき設定を 環境変数に格納してコード上から参照できる。• direnvを使うとディレクトリごとに 環境変数を切り替えられる。