Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PythonでもPythonじゃなくても使える汎用的なMicroservice実行環境 / nikkei microservice

Yosuke
September 21, 2016

PythonでもPythonじゃなくても使える汎用的なMicroservice実行環境 / nikkei microservice

Yosuke

September 21, 2016
Tweet

More Decks by Yosuke

Other Decks in Technology

Transcript

  1. About me Engineer at Nikkei Inc. 2 Yosuke Suzuki @yosukep

    Python, Golang, JavaScript ウェブの運用とか編集者とか記者の仕事歴も長い
  2. 日経電子版の開発チーム 5 • API開発 • モバイルアプリ • ブラウザー向け • インフラ

    • データ分析 内製での開発体制を強化、エンジニアを絶賛採用中
  3. 日経電子版では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が中央集権的ではある
  4. cookiecutterで対話的に作成 15 pip install cookiecutter cookiecutter gh:Nikkei/django-project-template 対話形式でいくつか値を入力 • repo_name:

    GitHub用のリポジトリ名 • project_name: Djangoプロジェクトの名前 • subdomin: サーバーのサブドメインに使用する文字列 • short_description: リポジトリの一行での説明
  5. 雛形への追随 16 pip install git+https://github.com/hirokiky/cookiepatcher cookiepatcher • レガシー化させない • KYさん作

    • 最新のテンプレートに追随 ◦ Djangoなどのライブラリのアップデート • cookiepatcher.jsonで差分を管理
  6. Private PyPI 17 • 各サービスで使う固有の処理を共通化 ◦ 記事のIDの変換 ◦ CMS独自の専用タグの置き換え処理 requirements.txt:

    --extra-index-url https://xxx.x/xxxxx/packages/simple/ nikkei-utils==0.6 PyPIの自社専用版、各リポジトリでのコードの重複を避ける
  7. Private PyPI (2) 18 1. python setup.py sdist を実行 2.

    dist/ 以下にできた xx.0.1.tar.gz のようなファイルを packages リポジトリの 指定ディレクトリにコピー 3. ファイルを add してpushするとCircleCIから自動でアッ プロードされる 通常のPyPIへの登録とやることはあまり変わらない
  8. 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)
  9. 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サーバーから社内専用の共通ライブラリを取得できる
  10. ローカル開発環境 21 • API開発なら特に問題なし ◦ python manage.py runserver ◦ Dockerも使わなくていい

    ◦ 単独で動作確認しやすい • フロントエンド開発の時はややこしい ◦ ルーティングの際に一部のドメインをロー カルに振り向ける
  11. みんな大好きRest Framework 22 • Django Rest Framework • Django Rest

    Framework Swagger Python/DjangoでAPI作るなら圧倒的な生産性
  12. 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)})
  13. そこで ebi コマンド 27 pip install ebi ebi deploy <app_name>

    <env_name> • KYさん作 • Dockerrun.aws.jsonを環境(本番・開発)に 合わせて分けられる • Blue/Greenデプロイが可能
  14. 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
  15. かなり幅広く適用可能なインフラ 34 • Djangoアプリ • NodeJS(express)アプリ • WordPress • Rundeck

    • Jenkins • Kibana • Nginx+プラグイン 日経電子版でこれまで実績のあるパターン