我水也

いろんなことに興味をもっています。

合同勉強会 in 福岡で登壇してきました

2/11に開催されました「合同勉強会 in 福岡」で登壇してきました。

connpass.com

当初の想定以上の方に参加していただき、大変緊張しました。

続きを読む

Fukuoka.NET#5で登壇してきました

1/27に開催されましたFukuoka.NET#5で登壇してきました。

C#VB.NETなどMicrosoftの.NETに関するコミュニティです。通称「ふくてん」。
Fukuoka.NET - ふくてん

と言っても私はC#ビギナー!!
年末にXamarinや.NET Coreを使ったくらいで・・・

今回は.NET CoreをメインにOSSを使って、AzureVM構築から.NET Core環境、新規プロジェクトのデプロイまでを行いました。

Terraform

Terraform by HashiCorp

Ansible

Ansible is Simple IT Automation

続きを読む

Xamarin Dev Days Hands-On手順と自前のWebAPIを使ってiOS/Androidアプリを作る

このエントリは Xamarin(その2) Advent Calendar 2016 - Qiita の24日目です。
ぎりぎりクリスマスイブ中に投稿できたと思います。

今回はXamarinです。
Azure上に.NET Coreでモバイルバックエンドを作ってみる - 我水也 にあるように自分でAzure API AppにデプロイしたなんちゃってWebAPIを使って、Xamarin Dev Days Hands-On手順書に沿ってアプリを実装してみたいと思います。

手順書はこれ GitHub - xamarin/dev-days-labs です。
日本語版はちょまどさんが作成しているこれ xamarin-dev-doc/hands-on at master · chomado/xamarin-dev-doc · GitHub です。

続きを読む

Azure上に.NET Coreでモバイルバックエンドを作ってみる

このエントリは Microsoft Azure Advent Calendar 2016 - Qiita の17日目です。

最近弊社で Xamarin に取り組んでいることもあり、全然モバイル畑ではないですが、勢いで Xamarin(その2) Advent Calendar 2016 - Qiita にもエントリしてしまったので、Azure側でバックエンドを実装してみようと思います。

続きを読む

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です。ありがたや、ありがたや。

今回はこれを使ってみたいと思います。

利用した環境は次の通りです。

  • Ruby 2.3.0
  • Rails 5.0.0.1
  • appinsights 0.0.5
  • application_insights 0.5.3


まずは、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に登録され、エラー時にも登録されます。

こんな感じになります。
f:id:matcu:20161013222836p:plain

例外発生時にはerror_messageが表示され、詳細はこんな情報が見れます。
f:id:matcu:20161013223010p:plain

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とポート番号の指定をしてください。
パスはこれから作るファイルですので、好みに合わせて変更してください。
f:id:matcu:20161007013406p:plain

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の設定イメージです。
f:id:matcu:20161007014359p:plain

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」というサブネットが作成されます!