Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PythonでもPythonじゃなくても使える汎用的なMicroservice実行環境 / n...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yosuke
September 21, 2016
Technology
18k
13
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PythonでもPythonじゃなくても使える汎用的なMicroservice実行環境 / nikkei microservice
Yosuke
September 21, 2016
More Decks by Yosuke
See All by Yosuke
ユニークユーザー数 45万人を超えた Ask! NIKKEIの成功と AIプロダクト開 発の勘所 / Ask! NIKKEI 2026-02
yosukesuzuki
0
140
ONA20 presentation: How Nikkei improves user retention through consultation
yosukesuzuki
1
430
How Nikkei improves user retention with new subscriber consultation
yosukesuzuki
0
480
創業140年の古い会社でデータの民主化を進めた話 / nikkei data driven 20180823
yosukesuzuki
17
25k
Google App Engine の日経での利用事例 / appengine at nikkei
yosukesuzuki
5
2.4k
Development and Infrastructure for Microservice Architecture
yosukesuzuki
0
1.2k
5 years with Google App Engine
yosukesuzuki
2
2k
日経電子版 開発内製化の取り組み / nikkei web development 2015
yosukesuzuki
54
37k
Other Decks in Technology
See All in Technology
beyond jj: config & tools ecosystem
indirect
0
6k
SREの視点で考えるSIEM活用術 〜AWS環境でのセキュリティ強化〜
cscengineer
PRO
0
320
あけおめLINE 傾向とその対策
nasa9084
0
320
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
5
730
手を動かして実感する、Kiro が変える開発体験
inariku
0
270
CI/CDではもう遅い - 人とAIが迂回しないDevSecOps Verify基盤の再設計 -
kintotechdev
0
150
2026-09-08 そのJavaモダナイゼーション、AIに丸投げで大丈夫?IBM Bobで変わる品質と効率
yutanonaka
1
180
Kiro Meetup #8 Kiro アップデート (2026/3/21〜2026/9/24)
katzueno
1
200
データ_AIの事業の勝敗をわけるもの
nek0128
1
480
リアーキテクチャ後の障害ゼロを目指したShadow Testingの取り組み
nihonbuson
PRO
1
180
AIは推し活である。
kurazuuuuuu
1
970
AI感のないAWS構成図をAIエージェントに描かせたい!
sagochiko
1
340
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.6k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
490
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
240
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
550
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Raft: Consensus for Rubyists
vanstee
142
7.7k
What's in a price? How to price your products and services
michaelherold
247
13k
Transcript
1 PythonでもPythonじゃなくても使える汎用 的なMicroservice実行環境 PyConJP2016 Yosuke Suzuki Nikkei Inc. Development and
Infrastructure for Microservice Architecture
About me Engineer at Nikkei Inc. 2 Yosuke Suzuki @yosukep
Python, Golang, JavaScript ウェブの運用とか編集者とか記者の仕事歴も長い
スポンサーしてます! 3
日経電子版について 4 • 2010年3月に創刊 • 有料会員48万人以上 のニュースサービス • 月間アクセス3億件
日経電子版の開発チーム 5 • API開発 • モバイルアプリ • ブラウザー向け • インフラ
• データ分析 内製での開発体制を強化、エンジニアを絶賛採用中
FinancialTimesとの連携 6 • 2015年12月買収 • 開発ノウハウの共有 • 英語力++ 英語をコミュニケーションの主言語として使うチームもある
本題 7
Microservicesとは 8 • サイズが小さい✔ • 自律的に開発が可能✔ • 独立してデプロイが可能✔ • デプロイやビルドプロセスの自動化✔
• 分散化する、中央集権化しない O’Reilly: Microservice Architectureより
日経電子版ではGateway方式を採用 9 Cache/router (Fastly) UI service UI service Internet API
gateway Search Content Auth DNS (Internal / Route53) API service API service Image API gatewayが中央集権的ではある
Gateway方式 10 • 認証、認可も担当 ◦ 認可は結局サービス側のレイヤーでやる ことも多い • 概念上はGateway方式でも画像の配信 サービスなどは直接通信
• 旧APIのラッパー的役割も
サイズが小さい✔ 11 • PythonはDjangoベース ◦ 基本的には2−3個のアプリケーションフォ ルダがあるだけ ◦ Gatewayだけはフォルダ多い •
NodeJSはexpressベース ◦ 数百行レベルのコード
自律的に開発が可能✔ 12 • DBなどリソースのシェアはしない ◦ S3を経由してシェアとかはある • サービス間はAPI経由でのやり取り • 基本的にステートレス
• 自律的にできるが、各自バラバラに作ると 非生産的 • 雛形からベースのサービスを作成
雛形からサービスを作成 13
雛形に含まれているもの 14 • requirements.txt • tox.ini ◦ テスト実行とflake8による静的解析 • Djangoアプリケーション
• Dockerfile • ElasticBeanstalkの設定ファイル • CircleCIの設定ファイル など
cookiecutterで対話的に作成 15 pip install cookiecutter cookiecutter gh:Nikkei/django-project-template 対話形式でいくつか値を入力 • repo_name:
GitHub用のリポジトリ名 • project_name: Djangoプロジェクトの名前 • subdomin: サーバーのサブドメインに使用する文字列 • short_description: リポジトリの一行での説明
雛形への追随 16 pip install git+https://github.com/hirokiky/cookiepatcher cookiepatcher • レガシー化させない • KYさん作
• 最新のテンプレートに追随 ◦ Djangoなどのライブラリのアップデート • cookiepatcher.jsonで差分を管理
Private PyPI 17 • 各サービスで使う固有の処理を共通化 ◦ 記事のIDの変換 ◦ CMS独自の専用タグの置き換え処理 requirements.txt:
--extra-index-url https://xxx.x/xxxxx/packages/simple/ nikkei-utils==0.6 PyPIの自社専用版、各リポジトリでのコードの重複を避ける
Private PyPI (2) 18 1. python setup.py sdist を実行 2.
dist/ 以下にできた xx.0.1.tar.gz のようなファイルを packages リポジトリの 指定ディレクトリにコピー 3. ファイルを add してpushするとCircleCIから自動でアッ プロードされる 通常のPyPIへの登録とやることはあまり変わらない
Private PyPI (3) 19 各アプリで呼び出し from nikkei_utils.kiji import extract_snippet from
nikkei_utils.region import region_info def hoge(): snippet = extract_snippet(article.body)
NodeJSアプリの場合はPrivate npm 20 package.json: "dependencies": { "@nikkei/nikkei-ui": "^6.2.0", "@nikkei/rnikkei-express": "^2.32.2",
"denodeify": "^1.2.1", "dom-delegate": "^2.0.3", "express-validator": "^2.20.8", "open-graph-scraper": "^2.2.2" } privateなnpmサーバーから社内専用の共通ライブラリを取得できる
ローカル開発環境 21 • API開発なら特に問題なし ◦ python manage.py runserver ◦ Dockerも使わなくていい
◦ 単独で動作確認しやすい • フロントエンド開発の時はややこしい ◦ ルーティングの際に一部のドメインをロー カルに振り向ける
みんな大好きRest Framework 22 • Django Rest Framework • Django Rest
Framework Swagger Python/DjangoでAPI作るなら圧倒的な生産性
Rest Framework(2) 23 class FeedAnArticleView(APIView): http_method_names = ['get'] permission_classes =
(IsAuthenticated,) def get(self, request, kiji_id_raw): """ # 検索エンジン用フィード --- parameters: - name: kiji_id paramType: path description: 対象の記事ID """ article = Article.objects.get(kiji_id_raw=kiji_id_raw, status=Article.POST) return Response(data={'article': feed_article_mapper(article)})
独立してデプロイが可能✔ 24 • サービスごとにインフラは 完全分離 • ElasticBeanstalk+Docker のアプリとして稼働 • スケールアウトも容易
デプロイやビルドプロセスの自動化✔ 25 masterブランチが開発系に、deployment/productionブランチが本番系に
ElasticBeanstalk(ebコマンド)の課題 26 • 開発系と本番系の設定ファイル (Dockerrun.aws.json)を分けられない • Blue/Greenデプロイメントできない
そこで ebi コマンド 27 pip install ebi ebi deploy <app_name>
<env_name> • KYさん作 • Dockerrun.aws.jsonを環境(本番・開発)に 合わせて分けられる • Blue/Greenデプロイが可能
CircleCIの設定ファイル 28 - sudo pip install --ignore-installed awsebcli - sudo
pip install -U ebi - aws configure set aws_access_key_id $PROD_AWS_ACCESS_KEY_ID - aws configure set aws_secret_access_key $PROD_AWS_SECRET_ACCESS_KEY - aws configure set default.region ap-northeast-1 - aws configure set default.output json - ebi bgdeploy app-name env-name-blue env-name-green cname_prefix --profile default --noswap --region ap-northeast-1 --dockerrun Dockerrun.aws.prod.json - sleep 10 - sudo pip install -r e2etests/requirements.txt - py.test e2etests/tests.py - eb swap env-name-blue --profile default --destination_name env-name-green
バッチ処理 29 Docker アプリコンテナ Docker アプリコンテナ Rundeckでのバッチ処理は ElasticBeanstalkにデプロイ しているものがそのまま使え る
Spotインスタンス Docker アプリコンテナ
Rundeck 30 Dockerコンテナを定期タスクで実行
監視、エラーログ 31 • アプリとは別コンテナーのfluentdでログを 収集 ◦ github.com/bungoume/log-sender • Sentryでエラーログを収集 •
New Relicでメトリクスデータを収集 • CloudWatch すべて同じパターンに共通化
ログの集約 32 各サービス Docker アプリコンテナ Docker fluentd コンテナ ログ集約サービス
障害対応 33 Slackに通知ししつつ、対応が必要な障害はPagerDuty経由で電話呼び出し
かなり幅広く適用可能なインフラ 34 • Djangoアプリ • NodeJS(express)アプリ • WordPress • Rundeck
• Jenkins • Kibana • Nginx+プラグイン 日経電子版でこれまで実績のあるパターン
クラウドの乗り換えもしやすい(はず 35 FinancialTimes社のNodeJSのアプリはHeroku上で運用 同じものがアプリの変更なく、ElasticBeanstalk環境で動かせた
課題 36 • スケールアウトは起動的ではない ◦ 想定以上のスパイクが来ると間に合わない ◦ 予測可能場合はスケジューリングして増やす • マメにメンテは必要
◦ Djangoは1.7 → 1.10に順次更新 ◦ 定期的にrequirements.txtを更新していく • AWS側のバグと付き合う
Thanks 37 だいたいはこの2人が作ってくれた
Thank you! 38
We're hiring! s.nikkei.com/saiyo Pythonエンジニア (機械学習できるひと歓迎) フロントエンドエンジニア アプリエンジニア デザイナー 39