RailsのエラーログをAzure Application Insightsに集約する
運用中のWebアプリに問題が発生した際に、エラーログから原因を探ったりすることがありますよね。
その際に、幾つものサーバーのログを確認したりしませんか?結構面倒ですよね。
私は面倒です。
1箇所にまとまっていれば...いちいちサーバーにログインしてログを目grepするのは...
Azureに、Application Insights(PREVIEW)というWebアプリ向けのパフォーマンス監視が出来るものがあります。
今回はRuby on Railsを使いたいのですが、実はMicrosoft純正のgemがあります。
github.com
・・・ですが、これ・・・
> Ruby 1.9.3 is currently supported by this gem.
とあるんですよね。
Ruby 2.0.0以降で使えないかな〜と探していたところ、ありました!
github.com
本家を活用した Ruby 2.0 or later 向けのgemです。ありがたや、ありがたや。
今回はこれを使ってみたいと思います。
利用した環境は次の通りです。
まずは、AzureポータルでApplication Insightsの準備
メニューでApplication Insightsを選択し、「+Add」を選びます。
適当なNameを入れ、今回はApplication Typeを「Other (preview)」にします。
あとはそれぞれ適当なものを選び、「Create」。
作成されたら、「Properties」の「INSTRUMENTATION KEY」をメモっておく。
次にRailsプロジェクトに移ります。
Gemfileに以下を追記します
gem 'appinsights'
追記したら、いつも通り。
$ bundle install
あとは設定ファイルを作成したら準備完了です。
config/application_insights.toml
[ai] instrumentation_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' custom = 4 properties = 'belong to the context' # Contracts configuration [ai.application] ver = '0.5.0' [ai.device] id = 'hoge' os = 'hogehoge' # Enable/Disable Middlewares [[middleware]] name = 'AppInsights::ExceptionHandling' enabled = true [[middleware]] name = 'ApplicationInsights::Rack::TrackRequest' enabled = true [middleware.initialize] instrumentation_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' buffer_size = 500 send_interval = 60
この設定ファイルはTOMLという形式を使っています。
TOMLについては、こちらの記事をどうぞ。
qiita.com
あとはアプリを起動して待つだけです。
上記設定では通常のリクエストもApplicationInsightsに登録され、エラー時にも登録されます。
こんな感じになります。
例外発生時にはerror_messageが表示され、詳細はこんな情報が見れます。
backtraceもしっかり表示され調査・分析しやすいです。
サーバー毎にログ確認をする手間が省けますので、是非使ってみてください。
Azure App Services(PHP)でLINE BOTを作ってみた
LINE BOTを作りたくなったので、Azure App Servicesを使ってお手軽に作ってみました。
App Servicesは、.NET/python/PHP/NodeJSが使えるので、今回は個人的に馴染みのあるPHPを選択しました。
まずはLINE BOTを作るためにLINE BUSINESS CENTERでアカウントを作ります。
business.line.me
アカウントを作ったらApp Services側の作業です。
Azureポータルのメニューから[App Services] -> [+Add] -> [Web Apps]を選択して作成します。
アプリの名前を入力、サブスクリプション、リソースグループを選択(なければ新規作成)し、プランを選択します。
今回はお試し的な感じですので B1 を選択しました。
あとは[create](日本語だと[作成]とかかもしれません)して作成されるのを待ちます。
作成されたらOverview部分にこのアプリのURLがあります(http://xxxxx.azurewebsites.net)ので、これをLINE BOT側のWebhookに指定します。
httpsが必須みたいですので、https://xxxxx.azurewebsites.net:443/linebot/callback.php のようにhttpsとポート番号の指定をしてください。
パスはこれから作るファイルですので、好みに合わせて変更してください。
LINE BOT側には Server IP Whitelist 設定があり、ここに追加したIPからのリクエストしか受け付けないため、App Servicesのプロパティにある[Outbound IP Addresses]を追加します。
次にLINE BOTの仕様に沿ってPHPの実装を作成します。
LINE BOTの詳しい解説はリファレンスやいろいろな人の作ってみた記事を参考にしてください。
API Reference
トライアル時に作成された方の記事が結構ありますが、現在は少し実装が変わるみたいですので、そこは気を付けてください。
PHPの実装が出来ればあとはApp Servicesに転送するだけです。
Git連携などいろいろやり方はありますが、今回は純粋にFTPでファイルをあげます。
[Deployment credentials]設定をしていない方はまずftpユーザーの設定を行います。
ftpユーザーの設定後、Overview部分にユーザー名とftp/ftpsの接続先がありますので、ftpクライアントに設定します。
画像はFileZillaの設定イメージです。
FTPで接続出来たら必要なファイルをアップロードして完了です!
自分デバイスのLINEを開き、友だち追加からLINE DevelopersにあるQRコードを読み込ませます。
友だちになった自分のBOTに話しかけると・・・
BOTからの返事が返ってくるようになったかと思います。(あとは自分の実装次第)
私は今回、テキストだったらそのテキストを発言し、画像だったらCognitive Services - Face APIを利用して性別・年齢・笑顔度を発言するようなBOTを作りました。
azure.microsoft.com
機会があればFaceAPIの実装に関する記事を書きたいと思います。
Azure仮想ネットワークをRubyで作る
事前準備
前回の記事(Azureリソースグループの作成)を行います。
matcu.hatenablog.com
仮想ネットワークとは?
クラウド内にユーザー独自のネットワーク環境が作成出来、仮想マシンなどはこのネットワーク内に配置されます。
azure.microsoft.com
仮想ネットワークを作る
では、Azure SDK for Rubyを使って仮想ネットワークを作ってみます。
今回は以下の構成でネットワークを作成します。
- SampleVNet 192.168.0.0/16
- FrontSubnet 192.168.1.0/24
- BackSubnet 192.168.2.0/24
利用環境
- ruby 2.2.5p292
- Bundler version 1.11.2
Rubyスクリプトの作成
前回の記事で作成したプロジェクトに移動します。
cd azure_sample
仮想ネットワークを作成するスクリプトを作成します。
実際に利用する場合には、設定情報などはyamlで外出しすると使いやすくなります。
$:.unshift File.expand_path(File.join(File.dirname(__FILE__))) require 'bundler/setup' require 'azure_mgmt_network' require 'dotenv' # Include SDK modules to ease access to compute classes. include Azure::ARM::Network include Azure::ARM::Network::Models Dotenv.load # Create authentication objects. token_provider = MsRestAzure::ApplicationTokenProvider.new(ENV['AZURE_TENANT_ID'], ENV['AZURE_CLIENT_ID'], ENV['AZURE_CLIENT_SECRET']) credentials = MsRest::TokenCredentials.new(token_provider) # # Create a virtual network. # client = NetworkManagementClient.new(credentials) client.subscription_id = ENV['AZURE_SUBSCRIPTION_ID'] vn_props = VirtualNetworkPropertiesFormat.new # アドレス設定 address_space = AddressSpace.new address_space.address_prefixes = '192.168.0.0/16' vn_props.address_space = address_space # サブネット設定 subnets = [] # FrontSubnet設定 subnet_prop = SubnetPropertiesFormat.new subnet_prop.address_prefix = '192.168.1.0/24' subnet = Subnet.new subnet.name = 'FrontSubnet' subnet.properties = subnet_prop subnets << subnet # BackSubnet設定 subnet_prop = SubnetPropertiesFormat.new subnet_prop.address_prefix = '192.168.2.0/24' subnet = Subnet.new subnet.name = 'BackSubnet' subnet.properties = subnet_prop subnets << subnet vn_props.subnets = subnets # SampleVNet設定 params = VirtualNetwork.new params.location = 'japanwest' params.properties = vn_props promise = client.virtual_networks.create_or_update('sample-group', 'SampleVNet', params) result = promise.value!
スクリプトを実行すると「SampleVNet」という仮想ネットワークと「FrontSubnet/BackSubnet」というサブネットが作成されます!
AzureリソースグループをRubyで作る
事前準備
前回の記事に書いた事前準備を実施すると、RubyでAzureを触る準備は完璧です。あとはRubyで書くだけでOK。
matcu.hatenablog.com
リソースグループとは?
Azure Resource Managerでは、全てのリソースをグループとして管理します。
そのため、まずはこのリソースグループを作成する必要があります。
azure.microsoft.com
リソースグループを作る
では、Azure SDK for Rubyを使ってリソースグループを作ってみます。
利用環境
- ruby 2.2.5p292
- Bundler version 1.11.2
プロジェクトの準備
まずはプロジェクトを作ります。
gem install bundler -v '1.11.2' mkdir azure_sample cd azure_sample bundle init
作成されたGemfileに必要なgemを追加します。
dotenvは前回記事でゲットした3つの情報を設定するために使います。
source 'https://rubygems.org' gem 'dotenv' gem 'azure_mgmt_resources'
上記で追加したgemをプロジェクトのbundleディレクトリにインストールします。
bundle install --path bundle
.envファイルに認証に必要な情報を書きます。
AZURE_TENANT_ID="00000000-0000-0000-0000-000000000000" AZURE_CLIENT_ID="00000000-0000-0000-0000-000000000000" AZURE_CLIENT_SECRET="00000000000000000000000000000000000000000000" AZURE_SUBSCRIPTION_ID="00000000-0000-0000-0000-000000000000"
最後にリソースグループを作成するスクリプトを作成します。
$:.unshift File.expand_path(File.join(File.dirname(__FILE__))) require 'bundler/setup' require 'azure_mgmt_resources' require 'dotenv' include Azure::ARM::Resources include Azure::ARM::Resources::Models Dotenv.load # Create authentication objects. token_provider = MsRestAzure::ApplicationTokenProvider.new(ENV['AZURE_TENANT_ID'], ENV['AZURE_CLIENT_ID'], ENV['AZURE_CLIENT_SECRET']) credentials = MsRest::TokenCredentials.new(token_provider) # Create resource group. client = ResourceManagementClient.new(credentials) client.subscription_id = ENV['AZURE_SUBSCRIPTION_ID'] resource_group = ResourceGroup.new() resource_group.location = 'centralus' promise = client.resource_groups.create_or_update('sample-group', resource_group) result = promise.value!
スクリプトを実行すると「sample-group」というリソースグループが作成されます!
次の記事では仮想ネットワークの作成を行いたいと思います。
Azure(Resource Manager)をRubyで触るための準備
Azure SDK for Ruby(Resource Manager版)
Azureには従来のクラシックとリソースマネージャーという2つのモデルがあり、現行で開発が進んでいるのがリソースマネージャーになります。
まだまだ開発中であったりすることもあり、SDKはありますが未対応であったりしたため、Windows PowerShellで頑張っていたのですが、先日「Microsoft Azure SDK for Ruby」のARM対応版があることを見つけました。(まだプレビュー版です)
github.com
プレビューとは言いつつ結構な範囲が触れそうでしたので、これは使ってみないとと思い、使ってみましたので、その際の事前準備を紹介します。
使うには?
After creating the service principal, you should have three pieces of information, a client id (GUID), client secret (string) and tenant id (GUID) or domain name (string).
ということなので、サービスプリンシパルを作成し、Client ID/Client Secret/Tenant IDをゲットします。
サービスプリンシパルの作成
このページにやり方が載っていましたので、詳細は省きます。
azure.microsoft.com
Client ID/Client Secret/Tenant IDこの3つの情報をゲットすれば、準備はOKです。
続きは次の記事で。。。