tech.guitarrapc.cóm

Technical updates

PowerShellGet の PSGallery が消えた場合の対処

PowerShellGet のデフォルトのPSRepository は、PowerShell Gallery です。

PowerShell Gallery | Home

デフォルトなので、何もせずとも設定されているのですが、過去に2回設定が消えたことがあります。原因がいまいちつかめていないので、復旧方法のメモだけ。

目次

PowerShell Gallery

通常は、Get-PSRepository を実行すると、PSGallery が表示されます。

結果、Find-ModuleInstall-Module といった PSGallery を使ったモジュールの検索、インストールが可能になります。

対処方法

しかし、状況によって、Get-PSRepository をしても PSGallery がないことがあります。

その場合、以下を PowerShell で実行しましょう。

gist.github.com

実行後に、PSGallery が復活することを確認します。

Find-Module も使えますね。

まとめ

単純な設定なのですが、面倒なものです。

OneGet や PowerShellGet の更新は、結構ほそぼそしているのですが、開発は続いています。今後がどうなることか、というところですが、明らかにサーバー展開時のモジュールやパッケージの導入が楽になります。

ぜひ WMF5 や PowerShellGetを試して貰えるといいですね。

PowerShell でディスクの初期化からフォーマットを行う

Windows のディスクを管理したいとき、古の時代から diskpart コマンドがあります。

DiskPart Command-Line Options | Microsoft Learn

www.atmarkit.co.jp

しかし現在これらのdiskpart 操作をを使うことはありません。PowerShell でより高度、安全に操作できるからです。

こういったディスクの初期化処理は、AWS や Azure においてディスク追加するときにも必要になることがあります。

そこで今回はその例を少し見てみましょう。

目次

GUI のディスク管理

Windows 10 を例にします。 Win +x > k によって ディスクの管理 を起動できます。

例えば以下のディスク構成があります。

この中のディスク3 は、現在は プライマリパーティション1つの 単一パーティション構成です。こういった場合は GUI でボリュームの削除を行って綺麗に構成可能です。

しかし、以前OSをインストールしていたディスクの場合は GUI で行えることに制限があります。*1

ディスクの管理では、OSインストール時に自動構成された回復パーティションを削除できません。

そこで古代においては、diskpart を使って操作を行うことがありました。

今回は、OSが入ったりした ディスク3 を「完全に消去 > 単一パーティション > NTFSフォーマット」まで構成してみましょう。

diskpart

コマンドプロンプトから diskpart を入力すると、管理者へのUAC昇格と共に diskpart の対話モードが開始します。

まずは list diskでディスク一覧を呼び出して対象を把握します。

次に操作対象ディスクを select disk 3 で選択します。

操作内容として、回復パーティションも含めて綺麗にするので、clean コマンドでディスクを消去します。

という感じです。

PowerShell で初期化する

PowerShell には、Disk や Partition、Volume 操作用の Cmdlet があります。これらをパイプラインで繋げれば、初期化からフォーマットまでワンライナーで綺麗に完了します。*2

gist.github.com

どうでしょうか?先のディスク3の初期化も一発です。かつ、ディスクの製品名から指定もできたり、BootDisk を除外してまとめて行ったりも可能です。

操作も Cmdlet が明確に意図を示しています。

Cmdlet やっていること
Get-Disk ディスク一覧の取得
where FriendlyName -Match ST3500 ST3500という製品名に該当するディスクにフィルタ
Clear-Disk -RemoveData -RemoveOEM -PassThru ディスクを消去
Initialize-Disk -PartitionStyle MBR -PassThru ディスクを MBRで初期化
New-Partition -UseMaximumSize -AssignDriveLetter 新規パーティションをディスク全体を単一として、ドライブレターを自動付与で作成
Format-Volume -FileSystem NTFS -Force 作成したボリュームを NTFS でフォーマット

簡単ですね。

まとめ

diskpart しかできないという操作はそうそうありません。回復コンソールなど、極めて限定的なシーンでの利用となるでしょう。

こういったWindowsシステム系の操作は PowerShell だと本当に楽に書けるのでぜひ試してみるといいと思います。

*1:OSインストール時やパーティション操作ソフトを除きます

*2:PowerShellを管理者権限で起動する必要があります

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