Azure Files & Azure File Sync を使ったバックアップや共有フォルダの同期

前にも調べたのだけど、ついに使う時が来てくれそうなので、【オンライン】札幌 Azure/Microsoft Learn もくもく会 30(2021/01) – connpass で思い出しつつまとめ。Azure Filesや同期の仕組みはかなり簡単に導入できるし、ファイルサイズの大きいデータを大量に扱わないのであれば料金もさほど高くないのでありがたい。

やりたいこと

  • オンプレの共有フォルダをクラウド側に同期(バックアップ)したい。
  • 他の拠点の共有フォルダにも同期して使いたい日もあるかもしれない。
  • クラウド側の共有フォルダのファイルも使いたい(現状ちょっと微妙)。

手順

  1. Azure Files で共有フォルダを作る
    1. ストレージアカウントを作成する
    2. ファイル共有を作る
  2. オンプレミスに共有フォルダを作る(というか、元からある)
    1. OSは同期ツールの関係で2012R2、2016、2019にする。
    2. 他は特に何もすることはないけど、WindowsServer上で共有フォルダを作る。
  3. ストレージ同期サービスを追加する
    1. 同期グループを追加
    2. クラウド エンドポイントを追加(同期グループを追加するときに一緒に追加できた気がする)
    3. オンプレミスの共有フォルダサーバーに、Azure File Sync Agentをインストールして、Azureに接続する。
    4. ストレージ同期サービスからサーバーエンドポイントを追加する。
  4. 別の拠点にも同期させたい場合には、同期グループに対して、サーバーエンドポイントを追加する(同期サーバーは1台まで無料、あとは1台ごとに追加費用がかかる)。

できること

  • 同期
    • ここまで設定すると、オンプレのサーバーでファイルを編集すると、Azure の共有フォルダに同期してくれるようになる。
    • また、他の同期サーバーに対しても同期してくれる。
    • 同時に更新があった場合には、上書きはされず、別名で保存してくれる。
  • Azure Files
    • 私の家の環境では、VPN接続して利用している会社の共有フォルダとAzure Filesの共有フォルダは同じくらいの応答速度で操作できる。

ポイント・こまることなど

  • Azure Filesの共有フォルダにアクセスする場合、ポート445の通信をできるようにしておく必要がある。昔のファイアウォール設定のままだと445の通信を遮断している場合がある。
  • Azureの共有フォルダのファイルを更新した場合、何もしないと24時間ごとに変更を検知して同期する(らしい。未確認)。
    即時同期させたい場合には、Invoke-AzStorageSyncChangeDetection コマンドで変更を検知して同期させる必要がある。
    このコマンドでは結局ファイルを全検索しての検知になるのでそれなりに時間がかかる。パラメータでPathやディレクトリを指定できるのでいい感じにするしかない。
  • 24時間とか遅いじゃん! という方は、要望があがっているのでVoteしておきましょう。
    Enable immediate sync after changes on the Azure file share for Azure File Sync – Customer Feedback for ACE Community Tooling
  • 料金のうちディスク容量、同期サーバー数ははっきりわかるが、操作による金額やデータ転送量の金額がどの程度になるかがざっくり計算しかできずモヤモヤする。
    同期するとしてどの程度の操作数やデータ転送量になるか、サーバーで計測できるツールとかないでしょうか・・・。SQL ServerのDTU計算みたいなやつがあると楽なんだけどなー。
  • 実際に複数人で使った時にどんな感じになるとか、パフォーマンスがどうか、とかわからないことはまだあるので、実際に使うことができたらまとめていきたい。

CosmosDB Serverless preview

CosmosDBのserverlessのPreviewがきたということで、【オンライン】札幌 Azure/Microsoft Learn もくもく会 25(2020/08) でちょっと試してみました。といっても限界まで試したとか金額計算したというわけではないので、そこらへんはしばやんさんのブログがわかりやすいです。

Azure Cosmos DB Serverless が Preview になったので試した – しばやん雑記

今回は、.netのコンソールアプリからCosmosDBにアイテムを追加するところを試してみました。

CosmosDBの準備

1.適当にリソースグループを作成します。
2.リソースグループにCosmosDBを作成します。
Capacity modeを Serverless(preview) に設定します。

3.接続文字列をメモっておきます。

CosmosDBにアイテムを追加してみる

1.Visual Studio から .Net Frameworkのコンソールプロジェクトを作成します。
2.nugetから Microsoft.Azure.Cosmos をインストールします。
3.下のような感じのプログラムを作ります。
CosmosClientを作って接続して、CreateDatabaseIfNotExistsAsync、CreateContainerIfNotExistsAsyncでデータベース、コンテナを作成し、CreateItemAsyncでコンテナにアイテムを追加します。
using Microsoft.Azure.Cosmos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace CosmosDB_BulkSupport
{
    class DemoItem
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public DateTime CreatedOn { get; set; }
        public string PartitionKey { get; set; }
    }


    class Program
    {
        static async Task Main(string[] args)
        {
            var connectionString = "xxxx";
            var databaseId = "TestDB";
            var containerId = "TestContainer";
            var partitionKey = "/partitionKey";


            // SerializerOptionsで CosmosPropertyNamingPolicy.CamelCaseを指定しているので、
            // CosmosDBに投げるJSONは "PartitionKey": "..." ではなく "partitionKey": "..."になる。
            // そのため、コンテナの PartitionKey には "/partitionKey" を指定する
            // また、CosmosDBのアイテムに id が必要なので、 CosmosPropertyNamingPolicy.CamelCase を指定しない場合には、
            //         [JsonProperty(PropertyName = "id")]
            //         public string Id { get; set; }
            // こんな感じで Id を id にしてあげる。
            // その場合には、コンテナのPartitionKeyには、"/PartitionKey"を指定する(のだと思う。試してない)


            var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions
            {
                AllowBulkExecution = true,
                SerializerOptions = new CosmosSerializationOptions
                {
                    PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
                }
            });


            Database database = await cosmosClient.CreateDatabaseIfNotExistsAsync(databaseId);
            Container container = await database.CreateContainerIfNotExistsAsync(containerId, partitionKey);


            var tasks = Enumerable.Range(1, 10000)
                                  .Select(x => new DemoItem
                                  {
                                      Id = Guid.NewGuid().ToString(),
                                      Name = $"Test-{x}",
                                      CreatedOn = DateTime.Now,
                                      PartitionKey = Guid.NewGuid().ToString()
                                  })
                                  .Select(x => container.CreateItemAsync(x, new PartitionKey(x.PartitionKey)));


            await Task.WhenAll(tasks);
        }
    }
}
4.実行して、Azureのコントロールパネルからアイテムの登録やRUの状況を確認します。
これだけだとServerlessは全然関係ないですが、料金の感じを見ると、平均してRUを消費するわけではなく、Free Tierを超えるような使い方であればちょうどよい・・・んでしょうか。つかってないのでよくわかりません。 次のような記事もありましたので、今度どこかでマスタ系にFree Tierを使ってみて、感触を確かめてみようかなーとおもいます。

Azure Cosmos DB Free Tier をプロダクション環境で使う – PaaSがかりの部屋

raspberry pi と motion でわんちゃんライブカメラを作ってみる

ワンチャンではなく、わんちゃん(犬)です。
最近、わんこ様が家族の仲間入りをしたのですが、普段どうしているのかの確認のために、Raspberry Piを引っ張り出してきて作りました。ModelB+だったと思うけど動きは遅いですね。最近のRaspberryPiがほしいです。 今回は motion を使ってウェブカメラの映像を見れるようにしてみました。

Raspberry Pi OSのインストール

知らないうちにraspbianから名前が変わっていたRasapberry Pi OSをインストールします。まずはイメージをSDに書き込むソフトウェアをダウンロードします。 Raspberry Pi Downloads – Software for the Raspberry Pi https://www.raspberrypi.org/downloads/
ダウンロードが終わったら imager_1.4.exe を起動してインストールします。
起動したら、CHOOSE OSからOSを選択します。
次にSDカードを選択します。
WRITERを選択してイメージを書き込みます。
OSイメージのダウンロードを行って。SDに書き込んでくれているのだと思うのでのんびり待ちます。
おわったらメッセージが出る(次の画像はダウンロードしたイメージを書いたときのものなのでメッセージが違います)

起動する

できあがったSDカードをRaspberryPiに差し込んで起動します。
起動したら pi / raspberry でログインします。

無線LANの設定

まずは無線LANとSSHの設定をしてリモートから接続できるようにします。 USBの無線LANをつけて /etc/wpa_supplicant/wpa_supplicant.conf を設定します。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        ssid="SSID"
        psk="xxxxxxxxxxxxxxxxx"
}
iwconfig を実行して次のようになっていたら接続できています。
wlan0     IEEE 802.11  ESSID:"SSID"
          Mode:Managed  Frequency:2.462 GHz  Access Point: XX:XX:XX:XX:XX:XX
          Bit Rate=65 Mb/s   Tx-Power=20 dBm
          Retry short  long limit:2   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=51/70  Signal level=-59 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:24  Invalid misc:25   Missed beacon:0
接続できていないときは、raspi-config から設定してみても良いかもしれません。raspberryのバージョンによって画面が違うかもしれませんが、Network Optionsあたりから設定しても無線LANに接続できました。 固定IPにしたいので /etc/dhcpcd.conf に設定を追加します。IPの設定は /etc/network/interfaces ではなくなったんですね。
interface wlan0
static ip_address=xxx.xxx.xxx.xxx
static routers=yyy.yyy.yyy.yyy
static domain_name_servers=zzz.zzz.zzz.zzz
次にSSHで接続できるようにします。opnessh-serverはインストール済みだったので、/etc/ssh/sshd_configを変更します。
#Port 22
#AddressFamily any
ListenAddress 0.0.0.0
#ListenAddress ::
とりあえず接続できれば良かったのdえ、ListenAddress 0.0.0.0 だけコメントアウトして自動起動するよう設定し設定を読み込み直します。
sudo systemctl enable ssh
sudo systemctl reload ssh
これで別のPCからSSHで接続できるようになりました。

ウェブカメラを使えるようにする

では本題のウェブカメラを使えるようにしていきます。 まずはおもむろにUSB ウェブカメラを差し込んで、dmesgを実行して認識していることを確認します。次のような感じの出力があれば使用できます。
[ 1042.539163] input: UCAM-DLG200H: UCAM-DLG200H as /devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input10
[ 1042.544619] usbcore: registered new interface driver uvcvideo
[ 1042.544637] USB Video Class driver (1.1.1)
今回は、motion を使ってウェブカメラのサーバーを構築してみます。まずはインストール
sudo apt update
sudo apt install motion

motionの自動起動の設定

/etc/default/motion の no を yes に変更する
# set to 'yes' to enable the motion daemon
start_motion_daemon=yes

motionの設定

/etc/motion/motion.conf を変更する。設定が多いのでそれぞれ確認しつつちょうどよい設定にしてください。 今回は、ストリーミングでカメラの映像を確認できれば良いので、動体検知機能、静止画撮影、動画撮影はオフにして、フレームレートを15fpsで表示できるようにしました。 設定が終わったら次のコマンドでmotionを再起動
sudo systemstl restart motion
ブラウザで xxx.xxx.xxx.xxx:8080 にアクセスしてカメラの映像が見えることを確認します。
わんこがほぼ見えてない
途中適当に触っていたので、他にも必要だったかもしれませんが、概ねこのような手順で作れました。 わんこの様子を見に現場へ行くと、到着前に気が付かれてスタンバイされているので、これで確認することができて良さそうです。

Azure の Local Network Gateway の Gateway IP Addressを設定したい

うちの会社をAzureとVPN接続していたいなーと思いました。
しかし、会社は固定IP環境ではなく、AzureのローカルネットワークゲートウェイのゲートウェイIPアドレスにはIPしか指定できません。
それであれば、多少接続が切れてしまうけども、IPが切り替わるたびにゲートウェイIPアドレスを設定してやればいいじゃないかー、ということで、ちょうど 札幌 Azure/Microsoft Learn もくもく会 24 がありましたので設定方法を探してみました。
# ローカルネットワークゲートウェイのゲートウェイIPを設定するよ.ps1

#
# 
#
$UserName = "ユーザー名"
$Password = "パスワード"
$TenantId = "テナントID"
$SubscriptionId = "サブスクリプションID"

$ResourceGroupName = "リソースグループ名"
$LocalNetworkGatewayName = "ローカルネットワークゲートウェイの名前"


#
# Get external ip address
# なにかしらどこかから外部のIPを取得する。実際には自前で作ったサービスを使っています。
#
$ExternalIPAddress = (Invoke-WebRequest -Uri "https://www.myexternalip.com/raw").Content


#
# Login
#
$secureStringPassword = $Password | ConvertTo-SecureString -AsPlainText -Force 
$credential = New-Object System.Management.Automation.PSCredential -ArgumentList $UserName, $secureStringPassword

Connect-AzAccount -Credential $credential `
    -Tenant $TenantId `
    -SubscriptionId $SubscriptionId 


#
# Set GatewayIpAddress
#
$lgw = Get-AzLocalNetworkGateway -ResourceGroupName $ResourceGroupName -Name $LocalNetworkGatewayName

$lgw.GatewayIpAddress = $ExternalIPAddress

Set-AzLocalNetworkGateway -LocalNetworkGateway $lgw


あとはこれをIPが変わったときだけ動かせばOKだと思ってますが、そこまでは試していないのでうまくいかなかったらごめんなさい。

Visual Studioのビルドが終わったら知らせてほしい!

長いビルドが走ると、他のことをやり始めて、ビルドしてたことを忘れます。もうやばい。

というわけで、終わったら通知できないかと探してみたら、普通にコントロールパネル>サウンドから設定ができるじゃないですか!

2016-04-21_15h03_50

でもビルドするたびに音が鳴るとうるさいよね。
長いときだけ、もしくは、VisualStudioが非表示/バックグラウンドにあるときだけ教えてほしい。

windows でパッケージ管理 scoop

Windowsでのアプリケーションパッケージの管理ツールはchocolateryを使っていたのだけど、
giboをインストールしようとしたらscoopじゃないとできないようだったのでscoopを使ってみた。

Scoop

インストール

とっても簡単。scoopのウェブに書いてあるとおり。powershellを開いて、

iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

実行すると次のような出力がでて終了。

initializing...
downloading...
extracting...
creating shim...
adding ~\AppData\Local\scoop\shims to your path
scoop was installed successfully!
type 'scoop help' for instructions

使い方

パッケージリストの更新(たぶん)

scoop update

パッケージのインストール

scoop install gibo

パッケージの更新

scoop update gibo

chocolateryと何が違うんだろう・・・

一体何が違うのか、何が売りなのか・・・。本当にgiboを入れることしかしなかった・・・

giboで.gitignoreを生成したい・・・からのPowerShellのリダイレクト

ちょいと昔ならwindowsだと苦労したかもしれませんが、chocoやscoopによりインストールも楽だし、powershellも操作しやすくなったし、見たことないけどbashも動くらしいし、でだいぶ楽です。

simonwhitaker/gibo: A shell script for easily accessing gitignore boilerplates

インストール

scoop install gibo

対応する言語やエディタの一覧

gibo -l

VisualStudioなら

gibo VisualStudio > .gitignore

ですね

とは、いかなかったんですよ

もじこーどこのやろう。

powershellでリダイレクトすると、Unicodeで文字が書き込まれてしまいます。
すると、gitが.gitignoreを読めないのです・・・。
gitの鍛え方が足りないのですすみません。

というわけで、

> したいときは

gibo visualstudio | set-content .gitignore

>> したいときは

gibo visualstudio | set-content .gitignore

エンコードを変えたいときは

git VisualStudio | Out-File -encoding utf8 -filepath .gitignore

らしいです。

(ちなみにVisualStudioあれば.gitignoreを勝手に用意してくれる気がします)

社内用NugetServerを立てて社内ライブラリを管理する

社内で使うライブラリをもっと整理して使いやすくしようということで、社内にNuGetのサーバーを立ててみました。
そもそもNuGetのパッケージも作ったことなかったのでちょうど良かったですが、まだ全然調べていません。
まずは、NuGetサーバーを立てて、NuGetパッケージを作って、登録するところまでです。

NuGet.Serverの構築

非常に簡単です。

  1. Create New ASP.NET Empty Project
  2. Install-Packatge NuGet.Server
  3. F5

これで問題なければ、社内のIISにホスティングします。
必要であれば設定ファイルのAPIKEYを指定します。

ちなみに、NuGetパッケージには、デバッグシンボルとソースを含んだシンボルパッケージというのもあるようですが、それはこのNuGet.ServerにはPUSHできないようです。
次の記事を参考にすればできるようになりそうです(試してない)

NuGet Packageの作成

ざっくりと。

  • nuget spec でNuGetパッケージのプロジェクトファイルを作成し、
  • nuget pack でパッケージ化して、
  • nuget push {Package file name} -s {url} {API_KEY} でNuGetServerにプッシュする。

urlにはNuGet.Serverをブラウザで開いたときに表示されているURLを入力すればOKです。

あとは使うだけ

あとは、VisualStudioのオプションからNuGetサーバーのソースを追加して使うだけです。
自分たちのライブラリがNuGetの画面に出てくると、なんとなくうれしい感じがします・w・

参考

次のモバイルマウスはマイクロソフトの Mobile Mouse 3600 にしました。

カエレバでamazonの画像貼ってみたかった系のあれです。

携帯用に使っているマウス「Bluetooth® Notebook Mouse 5000」の持つところがベトベト になってきたので、新しいのを探してみました。

ちなみに、「Bluetooth® Notebook Mouse 5000」はとても好きだったので合計3個ほど買ったのですが、
経年劣化(?)で両サイドのゴムっぽいところがベトベトになってしまうのが残念です。

候補

今回はBluetooth® Notebook Mouse 5000がもう打ってなかったので(あっても販売終了になっていてプレミア価格orz)、
いくつか候補を絞って、実店舗で触らせていただいて決めてみました。

1. Logicool ロジクール ワイヤレス ミニマウス ブラック M187BK

すごく小さくみたいで携帯するには○
お値段も手頃です。
ただ、できればBluetoothのマウスがほしかったので、今回は見送りしました。

2. ELECOM マウス Bluetooth CAPCLIP 3ボタン IRLED搭載 充電式 ホワイト M-CC1BRWH

by カエレバ

形からしてすでにおかしい、すっごい小さい携帯するには間違いなくベストそうなマウス。
Bluetoothなのも○
しかし、やっぱり使いにくそう・・だよね?

3. マイクロソフト ワイヤレスマウス Bluetooth Mobile Mouse 3600 Black ブラック (PN7-00007)

超小型ではありませんが一回り小さめのボディーです。
画像だとよくわかりませんが、表面にはやわらかいコーティングがされていて、さわり心地は良かったです(1年もしたらツルツルになっちゃいそうな気もしますが・・・)。

また、今時のマウスっぽくクリック音も静かです。
モバイルシーンだとクリック音が気になってしまう小心者なのでありがたいです。

Bluetoothで接続できて、電池が単3電池1本なので軽そうです。

最終的にはコレとArc Touchで迷いました。

4. マイクロソフト ワイヤレス Bluetooth マウス Arc Touch Bluetooth Mouse (7MP-00018

だいぶ前からありますが、これ使ってみたいのです!
携帯性というか、カバンに収納するのが楽そうですし、
カチッっと折って電源ONするギミックも非常に心地よさそうです。

しかし、高い上にレビューを見ると接続が切れる、
ちょっと持ちにくい、持ちにくいのでボタンを押しにくい、
などが目についてしまい、最高に良い感じではなさそう。

実機を触ってみたかったですが、残念ながら訪れたお店にはありませんでした(T_T)

5. Logicool ロジクール MXAnywhere2™ ワイヤレスモバイルマウス BluetoothSmart・USB対応 MX1500

たかい!
しかし、質感、重さ、形状、大きさ、クリック感は非常に良い感じでした。

きっと耐久性も高いのでしょう。
でも高い!(しつこい

まとめ

今回は最後、arc touchとMobile Mouse 3600で迷いました。
マウスはどうしても1~2年で壊れてしまう印象なので、そこに8000円近いマウスを買うのも・・・でもあのギミックを試してみたい・・・と(=w=)
そんなタイミングで、Mobile Mouse 3600がamazonのタイムセールで 3,234 円になるようだったので、もういいやっ、ってことでモバイル マウス 3600にしました。

*届いてみた感想は、ちょこんとした小さな出で立ちで、触り心地よく使い心地もまずまずですが、そんなにクリックは静かではないです。

お手軽無料のSSL証明書発行サービス Let’s Encryptを使ってみる

ちょいと前ですが、正式サービスが開始されたようなのでLet’s Encrypt を使ってみた。

README / Introduction — Certbot 0.7.0.dev0 documentation

インストール

user@webserver:~$ git clone https://github.com/letsencrypt/letsencrypt
user@webserver:~$ cd letsencrypt
user@webserver:~/letsencrypt$ ./letsencrypt-auto --help

インストールなのかヘルプなのかよくわからないコマンドですが・・・。

インストールが終わるとパスが表示されるので、パスを通すなりなんなりする。

詳しい使い方はヘルプで。

$ letsencrypt --help all

SSL証明書の発行の仕方

nginxはbuggyだって書いてるので、certonlyで行う。apacheならインストールまでしてくれるっぽい。

nginxを使っていて、

  • domainが hoge.com
  • webのrootが /var/www/hoge.com

の場合

まず、普通にウェブを80ポートで動かして、アクセスできる状態にする。
認証の仕組みとしては、上記の webrootに認証用のファイルを配置して、letsencryptのサーバーからそこにアクセスして確認するっぽい。

証明書の発行は次のコマンド

sudo letsencrypt certonly --webroot -d hoge.com -w /var/www/hoge.com

処理が終わると、/etc/letsencrypt/live/hoge.com に証明書が保存される。

nginxへの設定

今回はすでに別のSSL証明書を設定しているnginxにドメインを追加しての設定だったので、SNI機能が有効かを確認。

$ nginx -V 2>&1 | grep SNI
TLS SNI support enabled

問題なければ、設定ファイルをつくる。

server {
    listen 443;
    server_name hoge.com
    ssl on 
    ssl_certificate /etc/letsencrypt/live/hoge.com/cert.pem
    ...

証明書の更新

サーバーにインストールしているすべての証明書のうち期限が近い証明書を更新する。

sudo letsencrypt renew

個別に更新したい場合には、発行時と同じコマンドを動かし、Renewを選択する

sudo letsencrypt certonly --webroot -d hoge.com -w /var/www/hoge.com

直接操作できないサーバーの場合

FTPのみの場合であれば、–manualで表示された内容を自分で設置すると同じようにSSL証明書を作成できる。

sudo letsencrypt certonly --manual -d hoge.com