我々のサービスは日々複雑になっていき、それと連動して開発環境もやはり複雑になっていきます。今回はそんな開発環境でよくある課題とその対策を紹介します。
複雑なサービスの複雑なサービスの開発環境開発環境メドピア株式会社侘美 怜
View Slide
自己紹介自己紹介侘美 怜 (たくみ さとし)Twitter:GitHub:Qiita:2019年2月にメドピアへ入社SRE 兼 サーバーサイドエンジニア趣味は猫を愛でることreirei_Asreireiasreireias
本日の話本日の話ローカルの開発環境についてローカルの開発環境について
サービスが成長する過程でアーキテクチャはサービスが成長する過程でアーキテクチャはどんどん複雑になっていくどんどん複雑になっていくPaaS/SaaSの活用例:Elasticsearch、S3、Lambda歴史的経緯による複雑化技術的負債マイクロサービス化等のアーキテクチャ変更
メドピアも年々複雑なアーキテクチャに...メドピアも年々複雑なアーキテクチャに...ここでやばいアーキテクチャを見せる
複雑化していく過程でローカルの開発環境も複雑に複雑化していく過程でローカルの開発環境も複雑にREADME.mdがツギハギだらけに全体を知る人が少なくなるそして、次第にメンテされなくなっていく...開発効率が下がっていく...という光景を幾度となく目にしてきた
開発環境は大事開発環境は大事日々利用するので生産性に直結CIにも共通する
これまで培ってきたこれまで培ってきたノウハウや課題を共有しますノウハウや課題を共有します
3つの課題3つの課題1. PaaS/SaaSをどうする問題2. コンテナとローカルの連携どうする問題3. Docker for Mac遅い問題
1. PaaS/SaaSをどうする問題1. PaaS/SaaSをどうする問題スピーディーな開発にはPaaS/SaaSの利用は不可欠例: S3、Lambda、Elasticsearch課題: これらを開発環境ではどうする?
対策1: 同じものをローカルで動かす対策1: 同じものをローカルで動かすローカルでも動作可能なOSSの場合はこれ例:MySQL、Elasticsearch、Redis公式のコンテナイメージを利用するのが良い
対策2: 代替OSSをローカルで動かす対策2: 代替OSSをローカルで動かすAWS固有のものとかは代替となるOSSがあったりする例:S3 -> minio、Lambda/SQS/SNS等 -> LocalStackMailはmailcatcherが最近は人気
対策3: 直接PaaS/SaaSに接続対策3: 直接PaaS/SaaSに接続本番と同一のサービスを利用できるという点では良い開発者が多いと辛くなってくるコストもかかる 対策4: 実装で切り替える対策4: 実装で切り替えるできる限り採用したくない例:本番やテスト環境ではS3に接続するが、ローカルではファイルシステムを使うローカルやCIでは実施されないコードが出てくる
2. コンテナとローカルの連携どうする問題2. コンテナとローカルの連携どうする問題コンテナ内で動作させながら開発するケース依存が複雑で構築が手間開発環境の統一課題:どうやってコーディングするか?
対策1. Docker Volumeを使う対策1. Docker Volumeを使うDockerのVolumeでローカルのコードをマウント好きなエディタで編集lintやテストのエディタ連携は少し工夫する必要あり同一バージョンをローカルにも入れる実行パスを修正してコンテナ内のものを実行する
対策2. VS Code Remote Development機能を使う対策2. VS Code Remote Development機能を使うコンテナ内でVS Code Serverが起動する仕組み既存のdocker-compose.ymlを流用して設定が可能まだ試せていないが、かなり良さそう
対策2. VS Code Remote Development機能を使う対策2. VS Code Remote Development機能を使うデメリット:私はVimmerである
3. Docker for Mac遅い問題3. Docker for Mac遅い問題課題:Docker for Macとホスト間のファイル同期が遅い理由:MacのDockerはネイティブでない(間にxhyve)マウントなので、ファイルへのアクセス全般が遅いデバッグやテストのパフォーマンスが低下
対策1. Docker Volumeのオプションを利用する対策1. Docker Volumeのオプションを利用する以下のオプションを利用するconsistentデフォルトcachedホストからコンテナへの更新の遅延を許可するコンテナ内のreadの高速化delegatedコンテナからホストへの更新の遅延を許可するコンテナ内のread/writeの高速化例: が 486s -> 49s まで高速化https://docs.docker.com/docker-for-mac/osxfs-caching/
対策1. Docker Volumeのオプションを利用する対策1. Docker Volumeのオプションを利用するでの設定例version: '3'services:app:image: alpine:latestvolumes:# :: 形式 指定- /path/to/app:/app:delegated
対策2. docker-syncによる同期の高速化対策2. docker-syncによる同期の高速化を利用するオプションよりも約2倍程度速い例:メドピアのとあるページの表示速度オプション => 2.4秒=> 1.0秒docker-sync
before after対策2. docker-syncによる同期の高速化対策2. docker-syncによる同期の高速化# docker-compose.ymlservices:app:volumes:- /path/to/app:/app# docker-compose.ymlservices:app:volumes:- sync-volume:/appvolumes:sync-volume:external: true# docker-sync.ymlversion: '2'syncs:sync-volume:src: '/path/to/app'
参考:docker-syncの仕組み参考:docker-syncの仕組みhttps://docker-sync.readthedocs.io/en/latest/advanced/sync-strategies.html
対策3. 開発マシンをLinuxにする対策3. 開発マシンをLinuxにするプロダクトはAmazon LinuxやAlpineで動いているプロダクトへのコンテナの導入も活発になってきているLinuxが最も開発機に適しているのは自明でLinuxが最も開発機に適しているのは自明である!ある!まあ、現実的には情シスとか社内ルールによって無理だったり...
まとめまとめ開発環境は大事、メンテしようLinuxで開発したいDockerを上手く活用しようdocker-composeによる構築の簡易化CI環境への流用/共通化が簡単Linuxで開発したい
ご清聴ありがとうございましたご清聴ありがとうございました