web app for containers + mysqlでコンテナ対応したrailsアプリを作ろう!

46
Web App for Containers + MySQLで コンテナ対応したRailsアプリを作ろう! Yoichi Kawasaki Azure Technology Solution Professional Asia Intelligent Cloud Global Black Belt Microsoft Corporation Slides for Azure Webinar: Azure PaaS App + DevOps

Upload: yoichi-kawasaki

Post on 21-Jan-2018

536 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Yoichi KawasakiAzure Technology Solution Professional

Asia Intelligent Cloud Global Black Belt

Microsoft Corporation

Slides for Azure Webinar: Azure PaaS App + DevOps

Page 2: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

アジェンダ• サンプルアプリとその実行環境の紹介

• Web App for ContainersとApp Service on Linux

• Azure Database for MySQL/PostgreSQL

• アプリをDockerコンテナ化してフルマネージドサービスに移行

• 継続的デリバリー(CD)

Page 3: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

今日お話しするRailsアプリと最終的な実行環境について簡易ブログ、フレームワークはRuby on Rails、データベースはMySQL

Container

Web App for Containers

Rails + Nginx + Puma

Page 4: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Web App for Containers と

App Service on Linux

Page 5: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

コンテナを使う理由?

• アプリケーションのポータビリティ• 必要なものは全てイメージ化してクラウド、オンプレをまたがってコンテナを

移動できる

• 起動時間の短縮• 仮想マシンよりもオーバーヘッドが少なく起動が高速

• 高密度なリソース利用が可能• 構成が仮想化よりも単純であるため高密度なリソース利用が可能

Page 6: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Azureのコンテナ関連サービス

Azure

Container Service Service Fabric App ServiceAzure Container

Instance

IaaS Low Level PaaS High Level PaaS

• Azure Container Service• IaaSベースのサービス、複数のVMを使ってクラスタを構成。Kubernetes, DCOS Docker, Swarmを

使ってコンテナのスケールとオーケストレーションが簡単できるサービス

• Azure Container Instance• VMいらずで、シングルコマンドで簡単かつ高速に実行可能なコンテナインスタンス。秒単位課金

• Azure Service Fabric• マイクロサービス向けのオーケストレーターとランタイム。大規模サービス向け

• App Service (Web App for Containers + App Service on Linux)• アプリ実行に必要なさまざま機能が用意されたPaaS環境

Page 7: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Azure App Service - アプリ実行PaaS環境群

• 用途に応じたアプリケーション実行のPaaS環境を提供• 負荷分散、オートスケール、継続的インテグレーション(CI)、

災害対策(DR)などさまざまな機能を提供

Page 8: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

App Serviceを使う理由?• フルマネージドなアプリ実行環境

• これまではWindows + IISのマネージド環境• パッチあてなどUpdate とランタイムの更新は Azureが行う

• 高速なプロビジョニング• 数秒でアプリ実行環境が完成

• 柔軟なスケーリング• スケールアップ・スケールアウトも数クリック、オートスケールも可能

• 簡単なデプロイメント• 既存のコードレポジトリ(Git/Github)やCIツール・サービス(Jenkins, VSTS,

TravisCI/CircleCIなど) と連携した CI/CD が容易に実現可能

Page 9: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

お客様からの強いリクエスト

https://feedback.azure.com/forums/169385-web-apps/suggestions/8362119-support-linux-for-paas

Page 10: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Web App for Containers

App Service on Linux

• フルマネージドサービス、Platform-as-a-Service (PaaS)

• 柔軟なスケールアップ・ダウン + オートスケール

• お客様からの強い要望により実現

• Linux VMで動いているコンテナベースのアプリをターゲット

• オンプレからのLift and Shiftがとても容易

2017年9月正式リリース

Page 11: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Azure App Services on Linux• Web App with built-in images

• Node.js, PHP, .NET Core, Rubyなどランタイムスタックを選択してアプリケーションをデプロイ

• Windows Web App と同じ方法で利用可能

https://github.com/azure-app-service

Page 12: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Web App for Containers• Bring Your Own Container

• アプリケーション入りの皆さんのカスタムイメージをデプロイして実行する

イメージのソース Azure Container Registry

Docker Hub

プライベートレジストリ

Page 13: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Azure Container RegistryAzure上のファーストクラスDockerプライベートレジストリ

https://azure.microsoft.com/en-us/services/container-registry/

Page 14: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Azure Database for

MySQL/PostgreSQL

Page 15: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Azure Database for PostgreSQL

Azure Database for MySQL

• フルマネージドサービス, PaaS

• 可用性担保のためのレプリカ、ストレージ費用は追加不要

• インスタンス チューニングではなく必要なスループット プランを必要なときに選択

• ダウンタイム無しでスケールアップ、スケールダウンも自在

• 自動バックアップ、 ポイントインタイムリカバリ(PITR)可能( 35日間)

• 常時暗号化でバックアップも運用 DB も保護

• 既存のドライバ、ライブラリ、ツールと完全互換使い慣れたツール、アプリケーションでからすぐに利用可能(マイクロソフト製のツールやドライバなどは不要)

MySQL

PostgreSQL

New!Public Preview

MySQL 5.6/5.7(Community Version)

PostgreSQL 9.5/9.6(Community Version)

Page 16: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

AZURE DATABASE FOR POSTGRESQL AND MYSQL

REGION AVAILABILITY TODAY

West US, North Central US, East US, East US2, South Central US, West Europe, North Europe, Japan West, Japan East, East Asia, SE Asia, West India, Central India

More coming soon!

13Azure regions available today

Page 17: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

MySQL / PostrgreSQL サービスの構成基盤• Azure SQL Database と共通基盤• これまでの運用実績、ノウハウをフィードバック「枯れた」基盤で運用• Virtual Machine 上ではなく、”Service Fabric” 上に実装

https://azure.microsoft.com/ja-jp/services/service-fabric/

Po

wer

BI, A

pp

Serv

ices,

Data

Facto

ry,

An

aly

tics,

ML, C

og

nit

ive, B

ot…

Global Azure with 38 Regions

Azure Compute

SQL Data

Warehouse

Azure Storage

SQL Database MySQLPREVIEW PostgreSQLPREVIEW

Flexible: On-demand scaling, Resource governance

Trusted: HA/DR, Backup/Restore, Security, Audit, Isolation

Intelligent: Advisors, Tuning, MonitoringDatabase

Services

Platform

Service Fabric

Page 18: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

サービスの概念と接続イメージ

Azure リージョン

Azure Resource Manager

Application

Postgres

Client

Database Tools(Pgadmin, psql)

Postgres

Client

Database Tools(MySQL Workbench,

mysql Client)

MySQL

Client

Azure Database

Mgmt Service

Application

MySQL Client

REST API

Azureポータル

カスタム管理アプリAzure CLI

• 論理 DB : “インスタンス” ではない• 1 対多のデータベースを作成可能• リソースはすべて同じ論理サーバ内の

DB 間で共有• Database の “エンドポイント”• 接続制御はファイアウォールの

ルールベースで実施

Page 19: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

ダウンタイム無しでスケーリング可能

Azure リージョン

Database Server

サーバーマネジメントAzure Database

Mgmt Service

Azure Resource

Manager

REST API

Azureポータル

Custom Mgt. Applications

Azure CLI

server=myserver.<mysql/postgres>.database.azure.com

IP1:5432 or 3306retry

• いったん接続が切れても内部ゲートウェイでリトライしてくれるのでアプリケーションは切断の影響を受けにくい

• さらに慎重を期すならば、長時間トランザクションを避ける実装にすることがおすすめ(トランザクションは接続オブジェクトに紐づくため)

Gateway

Page 20: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

セキュリティの仕組み

データ保護

• 標準でデータベースとバックアップ データを暗号化 (AES 256)

アクセス管理

• 規定SSL 接続

• サーバー ファイアウォール

• (IPホワイトリスト方式)

ID 管理

• PostgreSQL / MySQL ネイティブ認証

Page 21: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

その他運用面でのメリット

• 自動的にパッチ適用で運用の心配を減らす

• メトリック監視とアラート機能を提供

• サーバーログは最大7日分まで保存(ポータル、Rest API, Azure CLIで確認可能)

• 最大35日分のバックアップを保持でポイントインタイムリカバリ可能

• サーバーパラメータの設定も可能

Page 22: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

サービス帯とパフォーマンス

22

Service Tier

想定ユースケース低めのワークロード

IOPSが可変でも問題ないケース

全体のスループットを重視しIOとCPUバランスを取りたい

ケース

高いスループット、IOPSを実現したいケース

Compute Units(CU) 50, 100 100, 200,400,800 ??

Storage (included)50GB

Magnetic Media125GB

Remote SSD??

IOPS (included) Variable375

??

追加オプション

99.99% SLA (今後) | フルマネージド| 高可用性 | オンラインパフォーマンス変更

Storage Scale up to 1 TB Scale up to 1 TB ??

IOPS NA Scales 3:1 (IOPS:GB) ??

Public Preview

※ これらは Public Preview 版の情報であり、今後変更になる可能性があります

Page 23: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

アプリをDockerコンテナ化して

フルマネージドサービスに移行

Page 24: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

サンプルアプリとその移行イメージサンプルアプリ• Rails Scaffoldingで生成された簡易ブログアプリでデータベースにMySQLを使用• フレームワークはRuby on Rails、WebサーバにNginx、RackサーバにPumaで構成

Container

Web App for Containers

Rails + Nginx + Puma

VM

Rails + Nginx + Puma

MySQL on VM

サンプルコード: https://github.com/yokawasa/ci-demo-rails-app

Page 25: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

フルマネージド化対応までの流れ1. MySQL接続部をAzure DB for MySQLに対応

2. アプリをDockerコンテナイメージにパッケージ化

3. コンテナレジストリに作成したコンテナイメージをpush(Docker Hub / Azure Container Registry)

4. Web App for Container の プロビジョニング +コンテナイメージのデプロイメント

Page 26: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Azure DB for MySQLの作成Azureポータル、Azure CLI、REST API経由で作成可能ここではAzure CLIでの作成方法をご紹介

DBアカウントの作成 yoichikamysql(サービス帯: Basic, リージョン: 西日本, adminユーザ: yoichika)

az mysql server create --name yoichikamysql \--resource-group myrgroup \--location japanwest \--admin-user yoichika --admin-password *** \--performance-tier Basic --compute-units 50

→ サーバ名: yoichikamysql.mysql.database.azure.com

Page 27: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Azure DB for MySQLの設定ファイアウォールの設定(ここでは全てのIPレンジを許可)

az mysql server firewall-rule create --resource-group myrgroup \--server yoichikamysql --name AllowFullRangeIP \--start-ip-address 0.0.0.0 --end-ip-address 255.255.255.255

mysqlコマンドでテストアクセス

mysql -u yoichika@yoichikamysql -p -h yoichikamysql.mysql.database.azure.com

ssl-enforcement パラメーターを無効化(以降のアプリテスト簡略化のため・・・)

az mysql server update --resource-group mygroup \--name yoichikamysql --ssl-enforcement Disabled

https://docs.microsoft.com/en-us/cli/azure/mysql

Page 28: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

アプリのDB接続設定を修正してRailsコマンドでDBテーブル新規作成

Rails設定ファイルのMySQL接続情報をAzure DB for MySQLに変更 → config/database.yml

Railsコマンドでアプリ用データベースとテーブル作成

Page 29: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

MySQL接続情報を環境設定読み込み方式に変更

ソースやアプリ設定ファイルに埋め込むのではなくWeb Appから変更可能にするためにMySQL接続部分を環境変数からの読み取り方式に変更

RailsのMySQL接続情報設定ファイル( config/database.yml ) の変更

Page 30: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

アプリのパッケージ化 - 1/2

Dockerfileの作成(これに尽きる)• Dockerコンテナーの構成内容をまとめて記述するファイル

https://blogs.msdn.microsoft.com/waws/2017/09/08/things-you-should-know-web-apps-and-linux/

Web App用カスタムコンテナのための設定ポイント外部公開用ポートの自動バインド

外部公開可能なポートは1つのみ。ポートは自動で検知されコンテナにバインドされる。WEBSITES_PORT環境変数で明示的に指定可

SSHの設定Azureポータル内のクライアントからのみコンテナイメージにSSHログインが可能。rootユーザーパスワードは“Docker!”, ポートは2222https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-ssh-support

永続化データと/homeディレクトリWEBSITES_ENABLE_APP_SERVICE_STORAGEをtrueで/homeディレクトリはストレージにマウントされるこの場合、ビルド段階で/homeディレクトリにコピーされたデータは削除され、ストレージマウントが行われる

Page 31: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

FROM ruby:2.4.1 MAINTAINER Yoichi Kawasaki [email protected]

RUN apt-get update -qq && apt-get install -y --no-install-recommends vim openssh-server && apt-get install -y build-essential libmysqlclient-dev nodejs && apt-get install -y nginx

WORKDIR /myapp## Setup all the configfilesCOPY rails-app/bin/init_container.sh /bin/init_container.sh

RUN chmod 777 /bin/init_container.sh \&& echo "root:Docker!" | chpasswd \&& rm -f /etc/nginx/conf.d/*

COPY railsapp/config/nginx.conf /etc/nginx/conf.d/myapp.confCOPY railsapp/config/sshd_config /etc/ssh/sshd_configCOPY railsapp /myapp

## Install for Rails app RUN gem install bundler –pre \&& bundle install --path /myapp/vendor/bundle

EXPOSE 8080 2222 ENV PORT 8080 ENV WEBSITE_ROLE_INSTANCE_ID localRoleInstanceENV WEBSITE_INSTANCE_ID localInstance

#Start Server ENTRYPOINT ["/bin/init_container.sh"]

Dockerfile init_contailer.sh

Web AppへのSSHログインのための設定

永続化ディレクトリ(/home)にログ出力

Page 32: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

アプリのパッケージ化 - 2/2

コンテナをビルドする (image-name:tag=railsapp:0.0.1)

コンテナをローカルで走らせてテスト

[注意] 環境変数でMySQL接続情報をセットが必要

Page 33: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

DockerHubにイメージをPUSH

Docker HubにPUSH (image-name:tag=railsapp:0.0.1)

Docker HubにイメージがPUSHされていることを確認

<docker-id>/<imagename>:<tag> = yoichikawasaki/railsapp:0.0.1

Page 34: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Page 35: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Web App for ContainerプロビジョニングAzure CLIによる設定

https://docs.microsoft.com/en-us/azure/app-service/containers/tutorial-custom-docker-image

Web App for Containerの作成(プロビジョニング時にコンテナを指定)

# App Settingsに環境変数をセット (--settingsのパラメータにスペース区切りで複数設定可)

Page 36: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

継続的デリバリー(CD)

Page 37: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

AzureでのCDオプションWeb AppのWebhookとコンテナレジストリ連携• Docker Hub/Azure Container RegistryにイメージPUSHでWebhookキックされてWeb

Appのコンテナ入れ替える、お手軽な手法• https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-ci-cd

自動化を支えるCI/CDツール群• Visual Studio Team Services

• Jenkins

• TravisCI / CircleCI

Page 38: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Page 39: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

CircleCI – パイプライン設定内容パイプライン処理で必要なパッケージをインストール

コンテナイメージのビルド

イメージのテスト

Docker Hubにイメージプッシュ

Web Appのベースコンテナを新しいイメージに設定変更

設定ファイル: https://github.com/yokawasa/ci-demo-rails-app/blob/master/.circleci/config.yml

Page 40: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Thank you

Page 41: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Page 42: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

APPENDIX

Page 43: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Rails Scaffoldでアプリ雛形作成 - 1/2Scaffoldアプリ雛形作成

config/database.ymlの編集

Page 44: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Rails Scaffoldでアプリ雛形作成 - 2/2

Scaffoldアプリに必要なテーブルの作成

rails serverを起動してテスト実行し、http://localhost:3000/articlesにアクセス

bundle exec rails server

curl http://localhost:3000/articles

Page 45: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

App Service Jenkins Plugins

https://azure.microsoft.com/en-us/blog/annoucing-jenkins-deploy-to-azure-app-service-plugin-and-new-managed-disk-support-for-azure-storage-plugin/

Page 46: Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!

Jenkinsを使ったCI

https://docs.microsoft.com/en-us/azure/jenkins/deploy-jenkins-app-service-plugin