Azure AD テナントを削除する際にエンタープライズ アプリケーションが残って削除できない時の対策
検証で使って不要になったAzure AD テナントを削除する時にはまったので備忘録的に。
全体的にはAzure AD テナントから削除に進むとチェックが走り、必要な操作に沿って対応していくと状態が全てグリーンになります。
が、色々外部連携やAzure DevOps等を利用していくと削除のできないものが出てきます。
削除時に出るエラーは以下のような状態ですね。
一旦以下の手順で削除していき、これで解決できるならOKです。
しかしながら、Azure DevOps等はこの手順では消えてくれませんでした。
他システムや他テナントと連携するようなアプリケーションは削除ロックがかかるようで、普通には消えません。
残っている状態が以下のような状態ですね。
そのような場合は以下の手順にて削除します。
事前に用意するものはWindows PowerShellへ以下モジュールのインストールをします。
事前準備
管理者権限でWindows PowerShellプロンプトを起動します。
以下コマンドでモジュールのインストールを行います。
Install-Module MSOnline
作業対象ディレクトリ確認
以下コマンドで対象のディレクトリか確認します。
間違ったテナントで作業すると大変なことになるので確認しましょう。
Get-MsolDomain
対象アプリケーションの無効化及び削除
以下コマンドで対象のアプリケーションを無効化します。
ObjectIdはAzure PortalのAzure AD → エンタープライズアプリケーション などから取得します。
Get-MsolServicePrincipal -ObjectId <ObjectId> | Set-MsolServicePrincipal -AccountEnabled $false
無効化されたら削除します。
Get-MsolServicePrincipal -ObjectId <ObjectId> | Remove-MsolServicePrincipal
ポータルのエンタープライズアプリケーションから表示されなくなっていれば成功です。
WVDのプロファイルをFSLogixを使って Private Link 経由で Azure Storage へ保管する
Windows Virtual Desktop (WVD) のプロファイルを外部へ保管する方法としてFSLogixが推奨されています。
WVDを使う理由としてデータを社外に持ち出したくないというところもあると思います。
Azure 上にプロファイルサーバーを立ててそこに保管する方法もありますが、サーバーを管理したくないので Azure Storage のBLOBへ配置します。
また、表題にもあるように完全にVNet内で通信を完結するために Private Link でBLOBへ接続します。
流れとしては以下となります。
- Azure Storage の作成
- WVD用仮想マシン(イメージ)の作成
- FSLogix をインストール
- サインインしての検証
Azure Storage の作成
まず Azure ポータルからStorage Accountを作成します。
名称等を入れます。
注意事項としてはパフォーマンスはPremiumを選択しましょう。
Standardだとサインイン・アウト時の読み込みなどの速度に影響してきます。
接続方法はプライベート エンドポイントを選択します。
名称と展開する仮想ネットワーク・サブネットを選択します。
ここでプライベートDNS統合を選択することで接続文字列等を変更なく利用できます。
検証に成功したら作成します。
ARMテンプレートにも対応しているので、利用したい場合はダウンロードして参考にしてみてください。
WVD用仮想マシン(イメージ)の作成
今回は Microsoft Windows 10 + Office 365 ProPlus で構築していきます。
選択したのは Windows 10 Enterprise multi-session, Version 2004 + Office 365 ProPlusです。
画面についてはここでは触れませんが、ネットワークは先ほど作った Azure Storage の Private Link のエンドポイントに接続できるよう、同一VNet内かPeeringされたネットワークに配置してください。
FSLogix をインストール
VMの展開が完了したらリモートデスクトップ接続して作業します。
(安全に接続するには Azure Bastion で接続する方がいいと思います。)
FSLogix をダウンロードします。
https://aka.ms/fslogix_download
展開して x64\Release\FSLogixAppsSetup.exe を実行します。
他にある実行ファイルはそれぞれ以下の役割をインストールしますが今回は対象外です。
FSLogixAppsJavaRuleEditorSetup.exe → Javaバージョン管理機能のルール作成
FSLogixAppsRuleEditorSetup.exe → Application Masking
次にGPO設定用にadml、admxファイルをコピーします。
fslogix.adml → C:\Windows\PolicyDefinitions\en-US
fslogix.admx → C:\Windows\PolicyDefinitions
ファイル名を指定して実行で「gpedit.msc」を実行します。
[コンピューターの構成] → [管理用テンプレート] → [FSLogix] → [Profile Containers] → [Enabled] をEnabledへ変更
[コンピューターの構成] → [管理用テンプレート] → [FSLogix] → [Profile Containers] → [Cloud Cache] → [Cloud Cache Locations] を有効にして「type=azure,connectionString="接続文字列"」を入れます。
でもこのままではキーがそのまま見えてしまうので隠蔽して登録します。
C:\Program Files\FSLogix\Apps\frx.exe add-secure-key -key blobkey -value [BLOB Key]
出来上がったら以下に置き換えて登録しなおします。
type=azure,connectionString=”DefaultEndpointsProtocol=https;AccountName=[account_name];AccountKey=|fslogix/blobkey|;EndpointSuffix=core.windows.net”;
サインインしての検証
設定が終わったらサインインして検証します。
一度サインアウトしてサインインしなおします。
ディスクの管理から見るとプロファイルがVHDとしてマウントされています。
VNet上のマシンから Azure Storage Explorer や Azure Portal から見ると以下のようにユーザー毎にコンテナーが作られ、その中にvhdファイルが保管されていることが確認できます。
VNet外のマシンから上記のように確認しても権限がないとアクセスすることができません。
Storage BLOB へのアクセスをPrivate Link経由にすることでBLOBストレージを外部に公開することなくプライベートなネットワークで利用することができ、WVDのプロファイルの保管用途としても外部に公開したくないというニーズにも応えられるようになっています。
リモートワークのお供にWindows Virtual Desktop (WVD)
Windows Virtual Desktop (WVD)
昨今の社会情勢からリモートワークが基本となり、お家から仕事するという生活が続いているかと思います。
ですが、職種や職域によってはどうしてもオフィスに行かなければならない方々もいらっしゃいます。
それを少しでも緩和できる可能性があるのがWindows Virtual Desktop(WVD)ではないかと思います。
WVDとはMicrosoft Azure上で動作するマネージドVirtual Desktop Infrastructure(VDI)サービスです。
Azure上にWindows 10デスクトップ環境を用意してリモートで接続し、作業できる環境を用意するサービスです。
Express RouteやVPNを使ってオンプレミスのデータセンターと接続することで、社内データやネットワークにもアクセスすることができます。
個人的にもVDIはもう10年以上触ってきているので、Azureでここまで簡単に構築できるのは感慨深いです。
2020/05/01にパブリックプレビューとして公開されたARMで管理された新しいWVDのご紹介をしていきます。
構築には以下の方法があります。
- Azure Portal で構築する
- Azure PowerShell で構築する
※ 2020年5月25日現在はAzure Resource Manager (ARM) での構築は非対応です
Azure Portal で構築する
前提としてAzure AD DSかAzure AD Connectで構築されたAzure ADが構築済みなこと。
Azure Portalから「Windows Virtual Desktop」を検索します。
「Create a host pool」をクリックします。
Basicesには以下の情報を入力します。
- Subscription → サブスクリプションを選択
- Resource Group → リソースグループを作成(ここでのRGはHost poolリソースの配置先)
- Host pool Name → ホストプールの名称を入力
- Location → メタデータの保管先(現状は日本は選択不可)
- Host pool type → Pooledは共有型、Personalは個人固定型
- Max session limit → 最大セッション数
- Load balancing algorithm → Breadth-first Breadth-firstは幅優先の負荷分散、Depth-firtsは深さ優先の負荷分散
Virtual Machinesには以下の情報を入力します。
- Add virtual machines → デフォルトはNo、ここではVMの設定を入れるためにYes
- Resource group → リソースグループを指定、何も指定しなければHost poolと同一のRGに配置
- Virtual machine location → VMの配置先リージョン
- Virtual machine size → VMのサイズを指定
- Number of VMs → VMの台数
- Name prefix → VMの名称の頭文字、後ろにナンバリングが入る
- Image type → VMのイメージの選択元、作成したイメージもGalleryから選択できる
- Image → イメージを選択、カスタムイメージはBrowse〜から選択する
- OS disk type → ディスク種類の選択ができる、早いものがほしければPremium SSD
- Virtual network → AzureADに接続可能なVNetを選択(ピアリングでも可)
- Subnet → 配置可能なサブネットを選択
- Public IP → パブリックIPを設定する場合はYes、通常はNoでいいと思います
- Network security group → NSGを設定するかどうか、Subnetに設定しておいてここではNoneにするのがいいと思います
- Specify domain or unit → OUの指定をする場合に選択
- AD domain join UPN → ドメイン参加実行アカウント
Workspaceには以下の情報を入力します。
- Register desktop app group → デフォルトはNo、ここではワークスペース名を指定するためYes
- To this workspace → ワークスペース名を入力、WVDサインイン時にユーザーに見える名称です
Review + createをクリックして作成します。
作成完了したら接続します。
【Web Client】
https://rdweb.wvd.microsoft.com/arm/webclient/
【WVD専用クライアント】
https://go.microsoft.com/fwlink/?linkid=2068602
ARM対応になり、Powershellでの管理必須というハードルから解放されました。
導入もしやすくなったのではないでしょうか?
是非お試しあれ。
Azure Active Directory Domain Services を PowerShell で構築する
Azure Active Directory Domain Services (Azure AD DS または AADDS)
AADDSって構築後にDNSの設定をしないとドメイン参加できないので、構築後のAADDSリソースの概要をAzure Portalから見るとDNSを構成するボタンが表示されています。
今回、それをPowerShellでやる場合のメモです。
そもそもとしてのAzure AD DS の構築方法としては以下があります。
- Azure Portal で構築する
- Azure PowerShell で構築する
- Azure Resource Manager (ARM) で構築する
Azure Portal で構築する
PowerShell での構築方法
ARM テンプレートでの構築方法
今回は2つ目のPowerShellで構築していたのですがAADDS構築後に通常だとAzure Portalから操作する部分があり、そこも自動化したくて考慮点を調べました。
考慮点
- Custom DNS をVNetへ設定しなければならない
- Network Security Group をSubnetへ設定しなければならない
AADDS構築後に以下の画像のようにDNS構成をするボタンが概要ページに出てきますが、ここでカスタムDNSやNSGの設定をしてくれています。
PowerShell での追加設定の仕方
Custmom DNS をVNetへ設定する
- 既存の構築用に使ったNew-AzVirtualNetworkの最後尾にDnsServerを追加して適用する。
【構築時のコマンド】
PS> $VNet = New-AzVirtualNetwork ` -ResourceGroupName <ResourceGroupName> ` -Location <AzureLocation> ` -Name <VNetName> ` -AddressPrefix 0.0.0.0/0 ` -Subnet <SubnetName> PS> $VNet | Set-AzVirtualNetwork
【適用するコマンド】
PS> $VNet = New-AzVirtualNetwork ` -ResourceGroupName <ResourceGroupName> ` -Location <AzureLocation> ` -Name <VNetName> ` -AddressPrefix 0.0.0.0/0 ` -Subnet <SubnetName> ` -DnsServer 0.0.0.4,0.0.0.5 PS> $VNet | Set-AzVirtualNetwork
上記設定まで完了すると以下のように変化します。 NSGを設定しろ的な感じですね。
Network Security Group (NSG) をSubnetへ設定する
- VNetの情報取得
PS> $VNet = Get-AzVirtualNetwork -Name <VNetName> -ResourceGroupName <ResourceGroupName>
- サブネットの情報取得
PS> $Subnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $VNet -Name <SubnetName>
- Network Security Group (NSG) の情報取得
PS> $Nsg = Get-Az NetworkSecurityGroup -ResourceGroupName <ResourceGroupName> -Name <NSGName>
- Subnetへ適用するNSGのコンフィグ設定
PS> $Subnet.NetworkSecurityGroup = $Nsg
- VNetへのコンフィグ適用
PS> Set-AzVirtualNetwork -VirtualNetwork $VNet
まとめると以下になります。
PS> $VNet = Get-AzVirtualNetwork -Name <VNetName> -ResourceGroupName <ResourceGroupName> PS> $Subnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $VNet -Name <SubnetName> PS> $Nsg = Get-Az NetworkSecurityGroup -ResourceGroupName <ResourceGroupName> -Name <NSGName> PS> $Subnet.NetworkSecurityGroup = $Nsg PS> Set-AzVirtualNetwork -VirtualNetwork $VNet
完了するとPortalのボタンで設定したものと同じようになります。
上記で問題なくドメイン参加まで行けましたので、PowerShellで全部組みたい方(少数派デスヨネ)に参考になれば。
Azure BastionがGAされました
Azure BastionがMicrosoft IgniteでGA (General Availability)の発表がありました。
VMを使っている方は嬉しい発表ではないでしょうか?
Azure Bastion
利用している仮想ネットワーク内でプロビジョニングするフルマネージドなbastion serviceで、Azure portal内で直接SSLを経由して仮想マシンへのシームレスな接続を提供されます。
サポートプロトコルはRDP、SSHで、Azure Bastion経由で接続する場合、仮想マシンにパブリックIPアドレスは不要となります。
追加のクライアント、エージェント、ソフトウェアも不要といったサービスです。
ブラウザとAzureアカウントさえあれば使えるので、作業用のPCがないとアクセスできない!とかいうことから開放されますね。
デプロイ方法
AzureのMarketplaceからBastionを検索して追加します。
作成を押します。
必要事項を入力していきます。
名称等を入れるブレードのところで注意が必要です。
まず、専用サブネットが必要になります。
デプロイ先の仮想ネットワークのアドレス空間の空きを確認し、AzureBastionSubnetという名称でサブネットを追加します。
サブネットの範囲は27ビットマスク以上の範囲が必要になります。
出来上がったら仮想マシンの接続からBastionを選択してアクセスします。
2019/11/05現在は以下リージョンのみで使用可能です。
- Australia East
- East US
- Japan East
- South Central US
- West Europe
- West US
難しいことはあまりありませんが、サブネット名等の注意は必要ですね。
良い踏み台ライフを。
KEDA+AKSでk8s上にFaaSを構築する
5月に発表されたKEDA(Kubernetes-based Event-driven Autoscaling)ですが、AKS(Azure Kubernetes Service)の上でサーバーレス のイベントドリブンコンテナーをサポートするものとしてオープンソースでMicrosoftとRedHatが共同で発表しました。
KubernetesのスケーリングはコンテナのCPUとメモリ消費率に関連付けされていますが、KEDAを使う事でAzure FunctionsなどのFaaSと同様にイベントに応じたリソースのプロビジョニングやスケーリングをする事が可能になります。
現状(2019/9/30現在)サポートされているイベントソースとスケーラーは以下になります。
- AWS CloudWatch
- AWS Simple Queue Service
- Azure Event Hub†
- Azure Service Bus Queues and Topics
- Azure Storage Queues
- GCP PubSub
- Kafka
- Liiklus
- Prometheus
- RabbitMQ
- Redis Lists
詳細などはGitHubや発表時のブログを参照してください。
実際に動かしてみる
AKSの構築
いずれかの方法でAKSを構築します。
KEDAのインストール
Kubernetesクラスターにhelmをインストール
helm init
Helm repoの作成
helm repo add kedacore https://kedacore.azureedge.net/helm
Helm repoの更新
helm repo update
keda-edge chartのインストール
helm install kedacore/keda-edge --devel --set logLevel=debug --namespace keda --name keda
Azure Functions Core Toolsのインストール
func kubernetes install --namespace keda
ストレージの作成
キュートリガーで動くよう作るのでストレージアカウントとキューを作成
アプリケーションの作成
作業ディレクトリの作成
mkdir kedaapp & cd kedaapp
ディレクトリの初期化
optionはnode→javascriptを選択
func init . --docker
Queueトリガーの作成
Azure Queue Storage triggerを選択
名称は適宜変更
func new
function.jsonの「queueName」をStorage Queueのキュー名と合わせる
{
"bindings": [
{
"name": "myQueueItem",
"type": "queueTrigger",
"direction": "in",
"queueName": "js-queue-items",
"connection": "AzureWebJobsStorage"
}
]
}
local.settings.jsonのAzureWebJobsStorageへ作成したStorage accountのAccess keysよりConnection stringをコピーする(key1,key2どちらでもよい)
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "node",
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=mystorageaccount;AccountKey=keykey==="
}
}
KEDAへアプリケーションのデプロイ
コマンドにてdocker hubへプッシュし、Kubernetesへデプロイする
func kubernetes deploy --name kedaqueue --registry <docker-user-id>
動作確認
リソースが作成されていることを確認する
キューをポータルより作成し、Podが自動的に起動するのを確認する
上記のように処理が完了してしばらくするとTerminatingされます
最後に
まだベータ版で開発中です。
今後CosmosDBやAzure Monitor、IoT Hubなどの連携も予定されているので今後がたのしみなプロダクトですね!
macからAzure Cache for Redisへredis-cliにて接続する
やろうとしてちょっと困ったので備忘録的に。
Azure Cache for RedisはデフォルトでNon-SSL portがdisabledになっており、本番運用としてもNon-SSL portをenableにして使うことはないと思います。
でも格納されているデータをAzure PortalのConsoleから利用しようとすると使い勝手が悪い。。。手元のterminalで操作してデータを取りたい。ということでmacから接続する方法です。
Windowsで接続する方法は以下ドキュメントがありますのでそちらを参照してください。
redis-cliはssl対応されていないためstunnelでSSLトンネリングして接続します。
homebreのインストール
まずhomebrewをインストールします。
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
redisのインストール
次にredisのインストール
$ brew install redis
stunnelのインストールとstunnel.confの編集
stunnelをインストールし、コンフィグを作成する。
$ brew install stunnel $ vi /usr/local/etc/stunnel/stunnel.conf
stunnel.confの内容は以下のようにする。(example部分は自リソースで置き換える)
[redis-cli] client = yes accept = 127.0.0.1:6379 connect = example.redis.cache.windows.net:6380
接続
準備が終わったら接続です。
$ redis-server & $ stunnel $ redis-cli -h localhost --raw 127.0.0.1:6379> auth {access key} OK
rawオプションをつけているのは2バイト文字の文字化け対応です。