Slide 1

Slide 1 text

複雑なサービスの 複雑なサービスの 開発環境 開発環境 メドピア株式会社 侘美 怜

Slide 2

Slide 2 text

自己紹介 自己紹介 侘美 怜 (たくみ さとし) Twitter: GitHub: Qiita: 2019年2月にメドピアへ入社 SRE 兼 サーバーサイドエンジニア 趣味は猫を愛でること reirei_As reireias reireias

Slide 3

Slide 3 text

本日の話 本日の話 ローカルの開発環境について ローカルの開発環境について

Slide 4

Slide 4 text

サービスが成長する過程でアーキテクチャは サービスが成長する過程でアーキテクチャは どんどん複雑になっていく どんどん複雑になっていく PaaS/SaaSの活用 例:Elasticsearch、S3、Lambda 歴史的経緯による複雑化 技術的負債 マイクロサービス化等のアーキテクチャ変更

Slide 5

Slide 5 text

メドピアも年々複雑なアーキテクチャに... メドピアも年々複雑なアーキテクチャに... ここでやばいアーキテクチャを見せる

Slide 6

Slide 6 text

複雑化していく過程でローカルの開発環境も複雑に 複雑化していく過程でローカルの開発環境も複雑に README.mdがツギハギだらけに 全体を知る人が少なくなる そして、次第にメンテされなくなっていく... 開発効率が下がっていく... という光景を幾度となく目にしてきた

Slide 7

Slide 7 text

開発環境は大事 開発環境は大事 日々利用するので生産性に直結 CIにも共通する

Slide 8

Slide 8 text

これまで培ってきた これまで培ってきた ノウハウや課題を共有します ノウハウや課題を共有します

Slide 9

Slide 9 text

3つの課題 3つの課題 1. PaaS/SaaSをどうする問題 2. コンテナとローカルの連携どうする問題 3. Docker for Mac遅い問題

Slide 10

Slide 10 text

1. PaaS/SaaSをどうする問題 1. PaaS/SaaSをどうする問題 スピーディーな開発にはPaaS/SaaSの利用は不可欠 例: S3、Lambda、Elasticsearch 課題: これらを開発環境ではどうする?

Slide 11

Slide 11 text

対策1: 同じものをローカルで動かす 対策1: 同じものをローカルで動かす ローカルでも動作可能なOSSの場合はこれ 例:MySQL、Elasticsearch、Redis 公式のコンテナイメージを利用するのが良い

Slide 12

Slide 12 text

対策2: 代替OSSをローカルで動かす 対策2: 代替OSSをローカルで動かす AWS固有のものとかは代替となるOSSがあったりする 例:S3 -> minio、Lambda/SQS/SNS等 -> LocalStack Mailはmailcatcherが最近は人気

Slide 13

Slide 13 text

対策3: 直接PaaS/SaaSに接続 対策3: 直接PaaS/SaaSに接続 本番と同一のサービスを利用できるという点では良い 開発者が多いと辛くなってくる コストもかかる   対策4: 実装で切り替える 対策4: 実装で切り替える できる限り採用したくない 例:本番やテスト環境ではS3に接続するが、ローカル ではファイルシステムを使う ローカルやCIでは実施されないコードが出てくる

Slide 14

Slide 14 text

2. コンテナとローカルの連携どうする問題 2. コンテナとローカルの連携どうする問題 コンテナ内で動作させながら開発するケース 依存が複雑で構築が手間 開発環境の統一 課題:どうやってコーディングするか?

Slide 15

Slide 15 text

対策1. Docker Volumeを使う 対策1. Docker Volumeを使う DockerのVolumeでローカルのコードをマウント 好きなエディタで編集 lintやテストのエディタ連携は少し工夫する必要あり 同一バージョンをローカルにも入れる 実行パスを修正してコンテナ内のものを実行する

Slide 16

Slide 16 text

対策2. VS Code Remote Development機能を使う 対策2. VS Code Remote Development機能を使う コンテナ内でVS Code Serverが起動する仕組み 既存のdocker-compose.ymlを流用して設定が可能 まだ試せていないが、かなり良さそう

Slide 17

Slide 17 text

対策2. VS Code Remote Development機能を使う 対策2. VS Code Remote Development機能を使う デメリット:私はVimmerである

Slide 18

Slide 18 text

3. Docker for Mac遅い問題 3. Docker for Mac遅い問題 課題:Docker for Macとホスト間のファイル同期が遅い 理由:MacのDockerはネイティブでない(間にxhyve) マウントなので、ファイルへのアクセス全般が遅い デバッグやテストのパフォーマンスが低下

Slide 19

Slide 19 text

対策1. Docker Volumeのオプションを利用する 対策1. Docker Volumeのオプションを利用する 以下のオプションを利用する consistent デフォルト cached ホストからコンテナへの更新の遅延を許可する コンテナ内のreadの高速化 delegated コンテナからホストへの更新の遅延を許可する コンテナ内のread/writeの高速化 例: が 486s -> 49s まで高速化 https://docs.docker.com/docker-for-mac/osxfs-caching/

Slide 20

Slide 20 text

対策1. Docker Volumeのオプションを利用する 対策1. Docker Volumeのオプションを利用する での設定例 version: '3' services: app: image: alpine:latest volumes: # :: 形式 指定 - /path/to/app:/app:delegated

Slide 21

Slide 21 text

対策2. docker-syncによる同期の高速化 対策2. docker-syncによる同期の高速化 を利用する オプションよりも約2倍程度速い 例:メドピアのとあるページの表示速度 オプション => 2.4秒 => 1.0秒 docker-sync

Slide 22

Slide 22 text

before after 対策2. docker-syncによる同期の高速化 対策2. docker-syncによる同期の高速化 # docker-compose.yml services: app: volumes: - /path/to/app:/app # docker-compose.yml services: app: volumes: - sync-volume:/app volumes: sync-volume: external: true # docker-sync.yml version: '2' syncs: sync-volume: src: '/path/to/app'

Slide 23

Slide 23 text

参考:docker-syncの仕組み 参考:docker-syncの仕組み https://docker-sync.readthedocs.io/en/latest/advanced/sync-strategies.html

Slide 24

Slide 24 text

対策3. 開発マシンをLinuxにする 対策3. 開発マシンをLinuxにする プロダクトはAmazon LinuxやAlpineで動いている プロダクトへのコンテナの導入も活発になってきている Linuxが最も開発機に適しているのは自明で Linuxが最も開発機に適しているのは自明で ある! ある! まあ、現実的には情シスとか社内ルールによって無理だっ たり...

Slide 25

Slide 25 text

まとめ まとめ 開発環境は大事、メンテしよう Linuxで開発したい Dockerを上手く活用しよう docker-composeによる構築の簡易化 CI環境への流用/共通化が簡単 Linuxで開発したい

Slide 26

Slide 26 text

ご清聴ありがとうございました ご清聴ありがとうございました