Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Web App for Containers + MySQLで
コンテナ対応したRailsアプリを作ろう!
Yoichi Kawasaki
Azure Technology Solution Professional
Asia Intellig...
アジェンダ
• サンプルアプリとその実行環境の紹介
• Web App for ContainersとApp Service on Linux
• Azure Database for MySQL/PostgreSQL
• アプリをDocker...
今日お話しするRailsアプリ
と最終的な実行環境について
簡易ブログ、フレームワークはRuby on Rails、データベースはMySQL
Container
Web App for Containers
Rails + Nginx + Pu...
Web App for Containers と
App Service on Linux
コンテナを使う理由?
• アプリケーションのポータビリティ
• 必要なものは全てイメージ化してクラウド、オンプレをまたがってコンテナを
移動できる
• 起動時間の短縮
• 仮想マシンよりもオーバーヘッドが少なく起動が高速
• 高密度なリソース利...
Azureのコンテナ関連サービス
Azure
Container Service Service Fabric App ServiceAzure Container
Instance
IaaS Low Level PaaS High Level...
Azure App Service - アプリ実行PaaS環境群
• 用途に応じたアプリケーション実行のPaaS環境を提供
• 負荷分散、オートスケール、継続的インテグレーション(CI)、
災害対策(DR)などさまざまな機能を提供
App Serviceを使う理由?
• フルマネージドなアプリ実行環境
• これまではWindows + IISのマネージド環境
• パッチあてなどUpdate とランタイムの更新は Azureが行う
• 高速なプロビジョニング
• 数秒でアプ...
お客様からの強いリクエスト
https://feedback.azure.com/forums/169385-web-apps/suggestions/8362119-support-linux-for-paas
Web App for Containers
App Service on Linux
• フルマネージドサービス、Platform-as-a-Service (PaaS)
• 柔軟なスケールアップ・ダウン + オートスケール
• お客様からの...
Azure App Services on Linux
• Web App with built-in images
• Node.js, PHP, .NET Core, Rubyなどランタイムス
タックを選択してアプリケーションをデプロイ
•...
Web App for Containers
• Bring Your Own Container
• アプリケーション入りの皆さんのカスタムイメージを
デプロイして実行する
イメージのソース
 Azure Container Registr...
Azure Container Registry
Azure上のファーストクラスDockerプライベートレジストリ
https://azure.microsoft.com/en-us/services/container-registry/
Azure Database for
MySQL/PostgreSQL
Azure Database for PostgreSQL
Azure Database for MySQL
• フルマネージドサービス, PaaS
• 可用性担保のためのレプリカ、ストレージ費用は追加不要
• インスタンス チューニングではな...
AZURE DATABASE FOR POSTGRESQL AND MYSQL
REGION AVAILABILITY TODAY
West US, North Central US, East
US, East US2, South Cent...
MySQL / PostrgreSQL サービスの構成基盤
• Azure SQL Database と共通基盤
• これまでの運用実績、ノウハウをフィードバック「枯れた」基盤で運用
• Virtual Machine 上ではなく、”Servi...
サービスの概念と接続イメージ
Azure リージョン
Azure Resource Manager
Application
Postgres
Client
Database Tools
(Pgadmin, psql)
Postgres
Clie...
ダウンタイム無しでスケーリング可能
Azure リージョン
Database Server
サーバーマネジメント
Azure Database
Mgmt Service
Azure Resource
Manager
REST API
Azure...
セキュリティの仕組み
データ保護
• 標準でデータベースと
バックアップ データを
暗号化 (AES 256)
アクセス管理
• 規定SSL 接続
• サーバー ファイアウォール
• (IPホワイトリスト方式)
ID 管理
• PostgreS...
その他運用面でのメリット
• 自動的にパッチ適用で運用の心配を減らす
• メトリック監視とアラート機能を提供
• サーバーログは最大7日分まで保存(ポータル、Rest
API, Azure CLIで確認可能)
• 最大35日分のバックアップを保...
サービス帯とパフォーマンス
22
Service Tier
想定ユースケース
低めのワークロード
IOPSが可変でも問題ないケース
全体のスループットを重視し
IOとCPUバランスを取りたい
ケース
高いスループット、
IOPSを実現したいケー...
アプリをDockerコンテナ化して
フルマネージドサービスに移行
サンプルアプリとその移行イメージ
サンプルアプリ
• Rails Scaffoldingで生成された簡易ブログアプリでデータベースにMySQLを使用
• フレームワークはRuby on Rails、WebサーバにNginx、RackサーバにPu...
フルマネージド化対応までの流れ
1. MySQL接続部をAzure DB for MySQLに対応
2. アプリをDockerコンテナイメージにパッケージ化
3. コンテナレジストリに作成したコンテナイメージを
push(Docker Hub ...
Azure DB for MySQLの作成
Azureポータル、Azure CLI、REST API経由で作成可能
ここではAzure CLIでの作成方法をご紹介
DBアカウントの作成 yoichikamysql
(サービス帯: Basic, ...
Azure DB for MySQLの設定
ファイアウォールの設定(ここでは全てのIPレンジを許可)
az mysql server firewall-rule create --resource-group myrgroup 
--serve...
アプリのDB接続設定を修正して
RailsコマンドでDBテーブル新規作成
Rails設定ファイルのMySQL接続情報をAzure DB for MySQLに変更 → config/database.yml
Railsコマンドでアプリ用データベー...
MySQL接続情報を環境設定読み込み方式に変更
ソースやアプリ設定ファイルに埋め込むのではなくWeb Appから変更可能にする
ためにMySQL接続部分を環境変数からの読み取り方式に変更
RailsのMySQL接続情報設定ファイル( confi...
アプリのパッケージ化 - 1/2
Dockerfileの作成(これに尽きる)
• Dockerコンテナーの構成内容をまとめて記述するファイル
https://blogs.msdn.microsoft.com/waws/2017/09/08/th...
FROM ruby:2.4.1
MAINTAINER Yoichi Kawasaki yoichi.kawasaki@microsoft.com
RUN apt-get update -qq && apt-get install -y --no...
アプリのパッケージ化 - 2/2
コンテナをビルドする (image-name:tag=railsapp:0.0.1)
コンテナをローカルで走らせてテスト
[注意] 環境変数でMySQL接続情報をセットが必要
DockerHubにイメージをPUSH
Docker HubにPUSH (image-name:tag=railsapp:0.0.1)
Docker Hubにイメージが
PUSHされていることを確認
<docker-id>/<imagename...
Web App for Containerプロビジョニング
Azure CLIによる設定
https://docs.microsoft.com/en-us/azure/app-service/containers/tutorial-custom...
継続的デリバリー(CD)
AzureでのCDオプション
Web AppのWebhookとコンテナレジストリ連携
• Docker Hub/Azure Container RegistryにイメージPUSHでWebhookキックされてWeb
Appのコンテナ入れ替える、お...
CircleCI – パイプライン設定内容
パイプライン処理で必要な
パッケージをインストール
コンテナイメージのビルド
イメージのテスト
Docker Hubにイメージ
プッシュ
Web Appのベースコンテナ
を新しいイメージに設定変更
設...
Thank you
APPENDIX
Rails Scaffoldでアプリ雛形作成 - 1/2
Scaffoldアプリ雛形作成
config/database.ymlの編集
Rails Scaffoldでアプリ雛形作成 - 2/2
Scaffoldアプリに必要なテーブルの作成
rails serverを起動してテスト実行し、http://localhost:3000/articlesにアクセス
bundle exe...
App Service Jenkins Plugins
https://azure.microsoft.com/en-us/blog/annoucing-jenkins-deploy-to-azure-app-
service-plugin-a...
Jenkinsを使ったCI
https://docs.microsoft.com/en-us/azure/jenkins/deploy-jenkins-app-service-plugin
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Upcoming SlideShare
Loading in …5
×

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

1,617 views

Published on

Web App for Containers は、アプリスタックのホストに Docker コンテナーを使用するため皆さんが今Linux上で利用しているOSSベースのアプリもアプリスタックごとDockerコンテナ化することでそのまま Web App for Containersで利用することができます。本ウェビナーでは簡単なMySQL + Ruby on Rails アプリ を題材に、アプリをコンテナ化し Web App for Containersにデプロイするまでの一連の流れを解説し、CIツールを使った継続的なデプロイ方法についてご紹介します。今回、AzureのフルマネージドMySQLサービスであるAzure DB for MySQLを利用して完全マネージドな環境でのアプリ実行を実現します。

Published in: Technology
  • Be the first to comment

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

  1. 1. 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
  2. 2. アジェンダ • サンプルアプリとその実行環境の紹介 • Web App for ContainersとApp Service on Linux • Azure Database for MySQL/PostgreSQL • アプリをDockerコンテナ化してフルマネージドサービスに移行 • 継続的デリバリー(CD)
  3. 3. 今日お話しするRailsアプリ と最終的な実行環境について 簡易ブログ、フレームワークはRuby on Rails、データベースはMySQL Container Web App for Containers Rails + Nginx + Puma
  4. 4. Web App for Containers と App Service on Linux
  5. 5. コンテナを使う理由? • アプリケーションのポータビリティ • 必要なものは全てイメージ化してクラウド、オンプレをまたがってコンテナを 移動できる • 起動時間の短縮 • 仮想マシンよりもオーバーヘッドが少なく起動が高速 • 高密度なリソース利用が可能 • 構成が仮想化よりも単純であるため高密度なリソース利用が可能
  6. 6. 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環境
  7. 7. Azure App Service - アプリ実行PaaS環境群 • 用途に応じたアプリケーション実行のPaaS環境を提供 • 負荷分散、オートスケール、継続的インテグレーション(CI)、 災害対策(DR)などさまざまな機能を提供
  8. 8. App Serviceを使う理由? • フルマネージドなアプリ実行環境 • これまではWindows + IISのマネージド環境 • パッチあてなどUpdate とランタイムの更新は Azureが行う • 高速なプロビジョニング • 数秒でアプリ実行環境が完成 • 柔軟なスケーリング • スケールアップ・スケールアウトも数クリック、オートスケールも可能 • 簡単なデプロイメント • 既存のコードレポジトリ(Git/Github)やCIツール・サービス(Jenkins, VSTS, TravisCI/CircleCIなど) と連携した CI/CD が容易に実現可能
  9. 9. お客様からの強いリクエスト https://feedback.azure.com/forums/169385-web-apps/suggestions/8362119-support-linux-for-paas
  10. 10. Web App for Containers App Service on Linux • フルマネージドサービス、Platform-as-a-Service (PaaS) • 柔軟なスケールアップ・ダウン + オートスケール • お客様からの強い要望により実現 • Linux VMで動いているコンテナベースのアプリをターゲット • オンプレからのLift and Shiftがとても容易 2017年9月正式リリース
  11. 11. 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
  12. 12. Web App for Containers • Bring Your Own Container • アプリケーション入りの皆さんのカスタムイメージを デプロイして実行する イメージのソース  Azure Container Registry  Docker Hub  プライベートレジストリ
  13. 13. Azure Container Registry Azure上のファーストクラスDockerプライベートレジストリ https://azure.microsoft.com/en-us/services/container-registry/
  14. 14. Azure Database for MySQL/PostgreSQL
  15. 15. 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)
  16. 16. 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! 13 Azure regions available today
  17. 17. MySQL / PostrgreSQL サービスの構成基盤 • Azure SQL Database と共通基盤 • これまでの運用実績、ノウハウをフィードバック「枯れた」基盤で運用 • Virtual Machine 上ではなく、”Service Fabric” 上に実装 https://azure.microsoft.com/ja-jp/services/service-fabric/ PowerBI,AppServices,DataFactory, Analytics,ML,Cognitive,Bot… 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, Monitoring Database Services Platform Service Fabric
  18. 18. サービスの概念と接続イメージ 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 の “エンドポイント” • 接続制御はファイアウォールの ルールベースで実施
  19. 19. ダウンタイム無しでスケーリング可能 Azure リージョン Database Server サーバーマネジメント Azure Database Mgmt Service Azure Resource Manager REST API Azure ポータル Custom Mgt. ApplicationsAzure CLI server=myserver.<mysql/postgres>.database.azure.com IP1:5432 or 3306 retry • いったん接続が切れても内部ゲートウェイでリトライ してくれるのでアプリケーションは切断の影響を受け にくい • さらに慎重を期すならば、長時間トランザクションを 避ける実装にすることがおすすめ (トランザクションは接続オブジェクトに紐づくため) Gateway
  20. 20. セキュリティの仕組み データ保護 • 標準でデータベースと バックアップ データを 暗号化 (AES 256) アクセス管理 • 規定SSL 接続 • サーバー ファイアウォール • (IPホワイトリスト方式) ID 管理 • PostgreSQL / MySQL ネイティブ認証
  21. 21. その他運用面でのメリット • 自動的にパッチ適用で運用の心配を減らす • メトリック監視とアラート機能を提供 • サーバーログは最大7日分まで保存(ポータル、Rest API, Azure CLIで確認可能) • 最大35日分のバックアップを保持でポイントインタ イムリカバリ可能 • サーバーパラメータの設定も可能
  22. 22. サービス帯とパフォーマンス 22 Service Tier 想定ユースケース 低めのワークロード IOPSが可変でも問題ないケース 全体のスループットを重視し IOとCPUバランスを取りたい ケース 高いスループット、 IOPSを実現したいケース Compute Units(CU) 50, 100 100, 200,400,800 ?? Storage (included) 50GB Magnetic Media 125GB Remote SSD ?? IOPS (included) Variable 375 ?? 追加オプション 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 版の情報であり、今後変更になる可能性があります
  23. 23. アプリをDockerコンテナ化して フルマネージドサービスに移行
  24. 24. サンプルアプリとその移行イメージ サンプルアプリ • 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
  25. 25. フルマネージド化対応までの流れ 1. MySQL接続部をAzure DB for MySQLに対応 2. アプリをDockerコンテナイメージにパッケージ化 3. コンテナレジストリに作成したコンテナイメージを push(Docker Hub / Azure Container Registry) 4. Web App for Container の プロビジョニング + コンテナイメージのデプロイメント
  26. 26. 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
  27. 27. 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
  28. 28. アプリのDB接続設定を修正して RailsコマンドでDBテーブル新規作成 Rails設定ファイルのMySQL接続情報をAzure DB for MySQLに変更 → config/database.yml Railsコマンドでアプリ用データベースとテーブル作成
  29. 29. MySQL接続情報を環境設定読み込み方式に変更 ソースやアプリ設定ファイルに埋め込むのではなくWeb Appから変更可能にする ためにMySQL接続部分を環境変数からの読み取り方式に変更 RailsのMySQL接続情報設定ファイル( config/database.yml ) の変更
  30. 30. アプリのパッケージ化 - 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!”, ポートは2222 https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-ssh-support 永続化データと/homeディレクトリ WEBSITES_ENABLE_APP_SERVICE_STORAGEをtrueで/homeディレクトリはストレージにマウントされる この場合、ビルド段階で/homeディレクトリにコピーされたデータは削除され、ストレージマウントが行われる
  31. 31. FROM ruby:2.4.1 MAINTAINER Yoichi Kawasaki yoichi.kawasaki@microsoft.com 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 configfiles COPY 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.conf COPY railsapp/config/sshd_config /etc/ssh/sshd_config COPY 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 localRoleInstance ENV WEBSITE_INSTANCE_ID localInstance #Start Server ENTRYPOINT ["/bin/init_container.sh"] Dockerfile init_contailer.sh Web AppへのSSHログインのための設定 永続化ディレクトリ(/home)にログ出力
  32. 32. アプリのパッケージ化 - 2/2 コンテナをビルドする (image-name:tag=railsapp:0.0.1) コンテナをローカルで走らせてテスト [注意] 環境変数でMySQL接続情報をセットが必要
  33. 33. DockerHubにイメージをPUSH Docker HubにPUSH (image-name:tag=railsapp:0.0.1) Docker Hubにイメージが PUSHされていることを確認 <docker-id>/<imagename>:<tag> = yoichikawasaki/railsapp:0.0.1
  34. 34. 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のパラメータにスペース区切りで複数設定可)
  35. 35. 継続的デリバリー(CD)
  36. 36. 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
  37. 37. CircleCI – パイプライン設定内容 パイプライン処理で必要な パッケージをインストール コンテナイメージのビルド イメージのテスト Docker Hubにイメージ プッシュ Web Appのベースコンテナ を新しいイメージに設定変更 設定ファイル: https://github.com/yokawasa/ci-demo-rails-app/blob/master/.circleci/config.yml
  38. 38. Thank you
  39. 39. APPENDIX
  40. 40. Rails Scaffoldでアプリ雛形作成 - 1/2 Scaffoldアプリ雛形作成 config/database.ymlの編集
  41. 41. Rails Scaffoldでアプリ雛形作成 - 2/2 Scaffoldアプリに必要なテーブルの作成 rails serverを起動してテスト実行し、http://localhost:3000/articlesにアクセス bundle exec rails server curl http://localhost:3000/articles
  42. 42. 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/
  43. 43. Jenkinsを使ったCI https://docs.microsoft.com/en-us/azure/jenkins/deploy-jenkins-app-service-plugin

×