我水也

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

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

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です。

続きは次の記事で。。。