tech.guitarrapc.cóm

Technical updates

AWS Windows 自動化ラウンドテーブルのセッション資料公開

2016/5/13 に、アマゾン ウェブ サービス(AWS) 様主催で、AWS で Windows を扱っている方を集めてのクローズドなラウンドテーブルの第1回が開催されました。

私も、AWS Solution Architect の@keisuke69さんにお誘いいただき登壇させていただきました。今回の資料を作るきっかけを与えていただき、本当にありがとうございます。当日参加して下さった方もありがとうございます。

今回は、ラウンドテーブルで用いた資料と、グラニのインフラの基本的な考え方を紹介します。

目次

Simple Windows Architecture on AWS

グラニは3年以上に渡りAWSでインフラ環境を構築しています。

神獄のヴァルハラゲートのリリース当初はPHPだったためAmazon Linux でしたが、2013年7月のある晩にサービス運営中のコードベースをC# にリプレースし、以降は Windows Server を中心としています。

当時と現在では、大きくインフラ構成が異なります。最も大きな変更が、インフラコンポーネントを Disposable *1 にしたことであり、よりシンプルにすることの追求です。

なぜ構成を公開するのか

今回の構成は、かなり踏み込んだ部分まで公開しています。グラニのインフラ構成を公開したのは、自分達の現状の整理と戒めを強く意識しています。

過去もそうですが、現在のインフラ構成にも多くの不満があり直したいことが山積みです。しかし直すにあたっても、そもそも私の考えが間違っていることが非常に多い自覚があります。

資料の補足と現状の理解を確認することを兼ねて少し現在の考えを書きますが、この資料や記事を読んでいただいた素敵な皆様がおかしいと感じられたことをご指導いただけると本当に嬉しいです。

Cloud Design Pattern

Cloud Design Pattern というと、AWS Cloud Design Patterns をぱっと思い浮かべることが多いと思います。しかし同時に Azure Design Pattern も浮かべる方も多いのではないでしょうか?私は、それぞれのデザインパターンを次のように大雑把に捉えています。

Cloud Design Pattern 大雑把な解釈
AWS-CloudDesignPattern インフラコンポーネント構成に関するデザインパターン
アンチパターンでないパターン集
Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications | Microsoft Learn サービス設計に関するデザインパターン
ベスト プラクティスパターン集

インフラ環境をDisposable(いつでも捨てられるよう)にする。これを実現するためにAWS上の構成変更を躊躇わず、マネージドサービスを積極的に利用し、インフラ全員がコードを書いています。しかし巷に溢れる優れたサービスを無差別に採用はできません、自分達にあったサービスを選択するための原則がないとすぐにカオスな状況に陥ります。

コード設計、サービス取捨選択の原則としている考え方が Azure の Cloud Design Pattern にある、Retry PatternExternal configuration store Pattern です。

Retry Pattern

AWS にかぎらず、パブリッククラウドにおける大原則であることが多いように思います。

そのための手法も多く公開されています。

docs.aws.amazon.com

azure.microsoft.com

グラニも同様に失敗しても再施行によって成功する構成を目指しています。*2

失敗時の処理方法を共有するのではなく、もう一回やればいい。

このシンプルさは失敗に対する心理的障壁を下げるだけでなく、チームに対しても単純で伝えやすいです。

External configuration store Pattern

グラニのインフラは、インスタンスを1台たてるのも100台立てるのも構成方法と処理時間に大きな違いがないようにしています。この担保をしている重要な要素が External configuration Pattern であり、スケーラビルティに大きく寄与すると思っています。

インフラは多くのミドルウェアが動きます。*3自分たちのコードもその1つです。そんな時に利用するのが External configuration store Patternです。

ミドルウェアをインスタンスに配置するにあたり、構成ファイルをデプロイ自体に含めるのではなく、S3 や Blob、場合によっては Github など外部に寄せるようにする。

もちろん自動デプロイ/再デプロイが高速、容易な場合はその限りではありません。またコードを書くにしても、AWS LambdaAzure Functions といった Serverless を利用できないかまず検討しています。*4

Github に push すれば、全サーバーの構成が速やかに自動的に変わるというのは楽なものです。

Stamp Pattern

さて、インフラ視点のクラウドデザインパターンとして採用しているのが Stamp Pattern です。*5

ウェブサーバーに限らず、事前構成に時間が掛かる役割のEC2は Stamp パターンを用いてることで、全て同一構成に揃うようにしています。

https://aws.clouddesignpattern.org/index.php/CDP:Stamp%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

この辺は過去にも記事で書いたことがあります。

gihyo.jp

個人的には柔軟性、展開速度、シンプルさの観点からStamp Pattern はかなり嫌いです。*6Amazon AMI に Configuration Management を適用するだけで済む場合は、Stamp Pattern を利用せず CM を適用するだけで構成しています。

このあたりはWindows版 Docker が Windows Server 2016 で出るのを心から待っています。リリースされたらすぐに乗り換えて、全サーバーコンポーネントを一新します。

他の基本としている要素

Design Pattern とは少し違いますが、基本としている要素があります。

速度

先日のセッションと公開した資料の中で、「何度も、素早く繰り返すこと」(高速なイテレーション)を重視していることを述べました。

リトライするにしても、1回の処理に30min もかかっていては繰り返し自体が困難です。なるべく一回の施行は高速に、そして短いスパンで繰り返せることを目指しています。

もちろん何でも速さが正義ではありません。頻度との兼ね合いで、一日1回しか実行しないなら数分、数秒に大きなこだわりを出しても仕方ないと思っています。

副作用を伴う改善は極力選択しない

「課題A」を改善するために、「回避不可能な別の課題B」を生じる。

そんな改善は選択しないように気をつけています。*7

もちろん程度問題なので、課題B が限定的だったり無視できるようなデメリットなら採用することが多いです。また、短期的にデメリットがあっても、すぐに改善するとわかっているなら課題の大きさによっては待たずに即採用もあります。*8

大事にしているのは、「根本の問題がなんなのか、原因を分析」することです。その場ですぐに解決できなくても後日ヒントや解決策に気づけるように意識づけています。

コスト意識

AWS EC2 なら、Lambda や S3 など「実行時課金」の Serverless へ変更できないかいつも考えています。

もしEC2でやるしかなくても、Spot Instance を積極的に採用しています。EC2 オンデマンドだったり、他のリソースなら Reserved Instance を検討します。

グラニのインフラにおいて、AWS 利用コストは当初と比較して劇的に改善しました。今も、不定期に構成を見なおして改善できないか検討しています。

自動化を常に考慮する

マネージドサービスを導入する際は、自動化できることを強く評価しています。Webhook、APIを含めて、サービス間連携できることが自動化手段を提供しているかどうかは重要です。

逆に、.NET SDK がなくとも APIが公開されていれば問題とすることがあまりありません。*9

そういえば AWS でウェブコンソールを使って最後にEC2を立てたのは3年前です。ずっと SDK 経由で作成しかしていません。

デプロイ戦略

今回構成したインフラ構成において、アプリは C#6.0、ASP.NET MVC 5.3.2 です。

そのため、2013年当時は MSDeployを用いていましたが、内製ツールのRapidHouse へと一年以上前に切り替えました。

残念ながらRapidHouse の公開は今のところ予定にないのですが、当初の構想通りデプロイが 1秒で終わるようにできたのは体感できるインパクトが大きくよかったと思っています。

ずっと言っているのですが、Windows におけるシンボリックリンクの重要性は極めて高く、インフラ構成を「柔軟、簡素」にできる可能性が高いのでぜひ検討してください。

mamiya の発表を見た時に、ほとんど同じ発想だったのでどこの環境でも同じことを考えるのだなぁと思い、ブラッシュアップのため参考にさせていただきました。

github.com

資料も非常に分かりやすかったので、セッション資料でも参考にしています。

speakerdeck.com

インフラ基盤を C#へ

RapidHouse によって 各Windowsサーバーの操作がAPI公開されているので、サーバーの管理は PowerShell Remoting から HTTP(S)経由に完全移行し、C# がフル活用できるようになっています。

察しの良い方は気づかれた通り、昔のグラニは PowerShell をインフラの中心としていましたが、現在はC# が中心になっています。

もちろんPowerShell も利用しますが、ただのツールです。PowerShell DSC の Configuration や ワンライナー、補助スクリプトがメインで長大なコードは次々とC#にリプレースされています。

構成図の見直し

今回は、ヴァルハラゲートの構成図でしたが、最初期からみてどんどん変わっていっています。

変化は大事だと思っています。停滞はサービスの死に直結します。

そして変化の記録と公開も同様に大事にしています。弊社のサービス構成図は、CTOのスライド でも度々引用されています。

少し時系列で並べて見ます。構成図にない変化がかなりあるのですが、ここでは触れません。

時期 構成図
2013年3月
2013年9月
2014年1月
2015年12月
2016年5月

構成図自体も変化しています。従来は構成図を Visio で書いていましたが、現在は CloudCraft に移行しています。Visio、昔から使っていますが、ついにトドメを刺せました。

だれでも直感的に使えて再利用も共有も可能。しかも、コンポーネントの違いも3D で表現しやすい構成図。CloudCraft はそんなサービスだと思います。

cloudcraft.co

まとめ

どうでしょうか?目新しいことがない、ふつーの構成ではありませんか?Windows を AWS で使うのがツラい、Linux にしたいという声をよく聞きますが、私達は Unix/Linux でのふつーをWindows でも十分に構築できると考え実践する努力をしています。インフラの多くのコンポーネントは、実は Serverless だったりもします。

AWSにロックイン、ということもよく耳にしますが一切そんなことはありません。AWS じゃなくても、いつでも Azure や Google Cloud Platform に移行できる体制でもあります。それでも AWS を使うのは全てのバランスとAurora などの各リソースの強力、安定さからです。

グラニのインフラが目指しているのは、Windowsでうんぬんより、ユーザーにサービスをよりよく楽しんでもらえることです。そのためにできることをチーム全員が積極的に挑戦しています。Linux には、共有するという文化から始まり、多くの面でインフラのトレンドを突き進んでいます。新しい考え方、手法にはサービスがより良くなることが多く秘められています。それが Windows でできないということは誰も言っていません、だから採用する努力をしています。

あ、あと、グラニのこんなインフラを変えたい、もっと良くしたいとお考えの方をインフラ一同心からお待ちしています。

*1:Immutable Infrastructure というより Disposable Infrastructure という方がグラニには適しています

*2:失敗したらリトライ可能な状態にロールバックする、冪等性を担保するなど、多くのやり方があるでしょう

*3:なるべく動かしたくないですし、減らすことを常に図っていますが!

*4:AWS Lambda が C# に対応してくれれば、Azure Functions にある不満が API Gateway/Lambda で強く改善できるので変更するのですが...

*5:いわゆるゴールデンイメージですね

*6:正確にはEC2が嫌いです

*7:それでも失敗します……

*8:なるべく待ちますが

*9:特に Swagger に対応していると嬉しいです

Remote Desktop Web Access の Remote Apps が重複する問題の対処

Remote Desktop Service (リモートデスクトップサービス) には、RD Web Access (RD Web アクセス) と RD Session Host (RD セッションホスト)呼ばれる機能があります。

これらの機能を使うことで、Remote Desktop Service で展開している Remote Apps を公開できます。

今回は、この Remote Apps が重複して表示される問題への対処について。

目次

Remote Apps の公開

たとえば、以下のような RD Web Apps 公開設定します。

すると、Web Access に対してブラウザ経由でアクセスした際に 通常は以下のようにRemote Apps が公開されます。

このRemote Apps の実行はあくまでも Remote Desktop Service サーバーで実行されているので、一見すると Windows や iOS、Android など OS を問わず実行が可能です。

重複した表示

しかし、Remote Desktop Service の機能をアンインストールしてからインストールし直した場合に「RD Web Appsが重複して表示」される場合があります。

正確には、前回の構成で表示していた RD Web Apps が表示されてしまいます。つまり以下の状態。

この状態は利用者からするとかなり厄介で、今回の Remote Desktop Service 構成で設定した RD Remote Apps ではないアプリを選択するとエラーが発生します。Feed 表示でも同様に重複していることから、キャッシュによるものでもありません。しかも見た目で判断は不可能です。

2件ほど似たような事例がありますが、どれも違う場合に役に立つでしょう。

問題となった設定を探す

インストールの流れを疑ってみましょう。

Server Manager の GUI 表示

設定にしたがって Server Manager > Remote Desktop Service > Collection から設定した RD Web Apps を見て見るでしょう。しかし、重複はありません。

PowerShell での Collection 表示

また、PowerShell で RD Session Collection が重複しているか見ても重複はありません。

gist.github.com

CollectionName                 Size ResourceType       CollectionDescription
--------------                 ---- ------------       ---------------------
<設定した CollectionName>      1    RemoteApp プロ...  RD Session Collection
RDWeb のフォルダ状態

RDWeb の IIS 設定は、 %WinDir%\Web\RDWeb に中身があります。

当然キャッシュもなく、Default.aspx、Default.aspx.cs にも異常はありません。

つまり、物理構成でも論理構成でもないということです。

原因はレジストリ

RD Remote Apps の実態は、設定するとレジストリに登録されます。大事なのは、PublishFarms 以下です。

PowerShell を使うと楽でしょう。

gist.github.com

通常は上記のように設定した コレクション名のエントリのみになります。しかし重複している場合は、PublishedFarms 配下に設定していないコレクション名が存在しています。

対処

レジストリから設定していないコレクション名を削除して、Remote Desktop Service を再起動してください。*1これで Remote Apps の重複が修正されます。

もしこれでダメな場合は、Remote Desktop Service の機能を入れなおせば間違いなく治ります。

まとめ

Remote Desktop Service を入れなおした時は、レジストリが汚いままなので気をつけましょう。

*1:あるいはサーバー再起動でもいいです

Windows Management Framework 5.0 RTM (PowerShell 5.0 RTM) が再リリースされました

おかえりなさい。

ということで、リリースされて一週間で撤収された WMF 5.0 (PowerShell 5.0) RTM でしたが、ようやくバグ修正が終わり再リリースされました。

Download Windows Management Framework 5.0 (Superceeded by WMF 5.1 RTM version: http://aka.ms/wmf5download) from Official Microsoft Download Center

目次

回収理由

以前も説明しましたが、$PSModulePath が WMF5.0 のインストール時に上書かれる問題があったためです。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11148471-bug-wmf5-rtm-psmodulepathwindowsserver.uservoice.com

前回との違い

ほぼアリマセン。

  • The KB numbers of these packages (KB3134758, KB3134759, and KB3134760) are different than previously released WMF 5.0 RTM packages (KB3094174, KB3094175, and KB3094176)
  • These packages have fixes only for the PSModulePath issue compared to the previously released WMF 5.0 RTM packages

ということで、インストールKB が変わりました。 そして、修正されたのは PSModulePath 問題だけです。

Operating System アーキテクチャ インストールパッケージ名
Windows Server 2012 R2 x64 Win8.1AndW2K12R2-KB3134758-x64.msu
Windows Server 2012 x64 W2K12-KB3134759-x64.msu
Windows Server 2008 R2 x64 Win7AndW2K8R2-KB3134760-x64.msu
Windows 8.1 x64 Win8.1AndW2K12R2-KB3134758-x64.msu
Windows 8.1 x86 Win8.1-KB3134758-x86.msu
Windows 7 SP1 x64 Win7AndW2K8R2-KB3134760-x64.msu
Windows 7 SP1 x86 Win7-KB3134760-x86.msu

ということは、New-ScheduledTaskTrigger 問題残ってるかもですが..。

インストール時の注意

You must uninstall previously released WMF 5.0 RTM (KB3094174, KB3094175, and KB3094176) packages.

以前の WMF5.0 はアンインストールしてください。

Windows 10 や Windows Server 2016TP への影響

Windows 10 and Windows Server 2016 Technical Previews builds are not impacted by the above mentioned PSModulePath issue. This issue was only impacting down-level systems where WMF 5.0 RTM can be installed.

ありません。あくまでも、Windows Server 2012R2 や Windows 8.1 などのダウンレベルOS のみです。

BuildInsider での詳細機能紹介

さて、PowerShell v5 がリリースされる。ということで、Build Insider で記事を書いております。

www.buildinsider.net

当初、2015年12月22日リリースだったこともあり、早々に記事を用意していたのですがその後回収されてしまったので 2ヶ月近くオクラ入りになってました。

さて、今回の記事を書くにあたって、編集者の @isshiki様と新しい試みを試しました。GitHub での記事の編集作業です。

www.buildinsider.net

コミット履歴で まさかの revert があるように、当初かなりやり方の意識に相違があったため戸惑いましたが、結果としては非常に楽になりました。これもすべて、@isshiki 様が良くしようという努力をしてくださったからです。今回の試みは、記事執筆、推敲、進捗どうですかなどの様々な面で Build Insider の記事執筆時に感じていた辛さが軽減されました。このスタイルを望む人にとって標準になると嬉しいですね。

PowerShell Team の Twitter アカウント

PowrShell Team の Twitter アカウントが @PowerShell_Team 開設されました。ここでもBuidInsiderの記事を紹介してあります。海外から見ると日本語記事は相当とっつきにくいのですが、Translator なりで参考になればいいですね。

まとめ

ぜひ WMF5.0 をお楽しみください!

tech.guitarrapc.com

WMF 5.0 (PowerShell 5.0) の再リリース予定が発表されました

WMF 5.0 (PowerShell 5.0) は、2015/12/16 にリリースされてから、12/23 に PSModulePath 上書きをはじめとするバグがあったことで回収されてました。

長らく再リリース日が未確定でしたが、本日リリース予定日として 2016年2月末日が予告されました。

blogs.msdn.microsoft.com

Updated 02/08/2016 – Thank you for your continued patience. We have fixed the offending PSModulePath issue and tested it thoroughly. We are working towards getting properly signed WMF 5.0 RTM builds. Now, we expect that around end of February you will be able to download the revised packages.

ということで、お待ちください。

PowerShell 5.0 で使える機能をまとめた記事も用意してあるので、リリースされ次第公開します。

WeatherHacks を触ってみる

Twitter を眺めていると面白そうなのをみつけたので、自分ならどう書くか考えてました。

https://www.baku-dreameater.net/archives/8741#more-8741www.baku-dreameater.net

ただやるのでは楽しくないので、PowerShell との比較です。

目次

コードサンプル

素直だったので、てきとーにいきましょう。エラーハンドルはここではしていません。

4つ用意しました。

gist.github.com

WeatherHacks.cs

元との違いは HttpClient 使ってることぐらいです。サクッとデータ取るにはいいのです。

WeatherHacksClass.cs

JSON をいちいちパースするのがつらいので、普段はクラスとして一気にデシリアライズしています。

Visual Studio2013 以降は JSON String を貼り付けるときに、自動的にクラス変換する機能があります。そこで、適当に PowerShell や LINQPad で取得したJSONをクリップボードにコピーして、VS2015 で貼り付けるだけで クラスが生成できます。

あとは普通です。

WeatherHacksClass.ps1

PowerShell v5 の クラス構文で C# に近いコードの再現例です。

PowerShell では Invoke-RestMethod Cmdlet で超お手軽簡単にAPIを叩いてオブジェクトとして取得できます。が、そのままでは型が PSCustomObjectとなりとてもつらくなります。これはクラスに結果を突っ込めば解消できるので、C# で取得したクラスをちょちょいと持ってくるか、JSON String をクラスに自動変換する何かを書けばいいでしょう。

ちなみに PasteJSONasPowerShell はダメです。PSCustomObject にしちゃうのでこのケースでは意味を成しません。

ConvertToClass がいい感じでしょう。*1

WeatherHacksFunction.ps1

クラス構文がない PowerShell v4 では、C# クラスを Add-Type するか、妥協して PSCustomObject でどうぞ。

まとめ

API を一発叩くだけなら、PowerShell でもいいのですが、いかんせん非同期処理はコールバック地獄一直線なので、非同期処理するなら C# 一択です。

*1:Class 名が重複した場合の処理が入っていないのでIssueにあげてあります https://github.com/dfinke/ConvertToClass/issues/2