Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PythonでもPythonじゃなくても使える汎用的なMicroservice実行環境 / n...
Search
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
110
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
AI時代に、プロダクトの数だけ積み上がる所有コストをどうエンジニアリングするか / Engineering the Cost of Ownership
kzkmaeda
0
990
20260903 Tokyo Jazug Night #62 | Azure エンジニアよ、 その環境は本当にセキュアか?
olivia_0707
1
610
【試作】IoT x AIエージェント
happysamurai294
0
100
AI活用の現在地、 ちゃんと見えてますか?/XPfest-2026
visional_engineering_and_design
0
140
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
270
作り直せるコードは迅速に 作り直せないDBは慎重に - AI時代のプロダクトエンジニアが「判断の不可逆性」で開発速度を変える話
kinosuke01
0
230
KPIだけでは評価できないプロダクトが考えるべき Evalsという第二の評価系 / Beyond KPIs: Evals as a Second Evaluation Framework for Products #PdEConf
aki_iinuma
4
3.5k
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
110
When Does a Local Qwen Start to Break
morshoto
0
170
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
0
170
スクラムで身についていた動き方を、XPで捉え直してみた
codmoninc
PRO
1
200
いま、生成AIにKaggleをどこまで 任せられるか — ROGIIコンペでの進め方とTips
k951286
3
1.4k
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Into the Great Unknown - MozCon
thekraken
41
2.7k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Site-Speed That Sticks
csswizardry
13
1.5k
New Earth Scene 8
popppiees
3
2.5k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
990
Bash Introduction
62gerente
615
220k
Product Roadmaps are Hard
iamctodd
55
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