AzureのARMテンプレートと少々闘った
早くも半年以上放置されていたブログです。
継続的にブログとか記事書いてる人はすごいですねほんと。
私事ですが転職して7月から新たな環境で働いてるので、そのうちAWS関連のメモが登場するかもしれません。
ちょうど来週Cloud Practitioner受けますが今回はAzureの話です。
ARMテンプレートって何かというと、Azureリソースの構成をJSON形式で記述しているものです。
IaC的なノリです、たぶん。
JSON形式でAzureリソースを定義しておいて、PowershellとかAzure CLIでえいっ!ってやると、
定義どおりにAzureリソースが作成されます。
で、何を書くかというと
本番環境のデータをコピーして検証環境作るんだ!!多分それなりの頻度で作っては壊すんだ!
って感じのお話があったので、それをARMテンプレートにしてみました。
ARMテンプレートならAzureポータルから作成できるので、お客さん自信でも必要なときにデプロイできますしね。
まぁもう3年位プレビューだけど…ポータルから消えないことを祈ります。
今回はそのARMテンプレートを作る過程でハマったこととか関数とかをメモがてら置いていきます。
ハマったもの
増分デプロイモードの挙動
リソースをデプロイするときに、「完全デプロイモード」と「増分デプロイモード」が選べます。
完全デプロイモードではARMテンプレート内に記述のないリソースは削除されますが、
増分デプロイモードでは記述のないリソースはそのままです。
増分デプロイモードでリソース内の設定を少し変更しようと思って手抜きしようとしたら少しハマりました。
Azure Resource Manager のデプロイ モード | Microsoft Docs
ただし、既存のリソースを増分モードで再デプロイした場合の結果は異なります。 更新対象だけでなく、リソースのすべてのプロパティを指定します。 一般的な誤解は、指定されていないプロパティは変更されないままであると考えることです。 特定のプロパティを指定しなかった場合、Resource Manager は更新によってそれらの値を上書きするものと解釈します。
一般人なので一般的な誤解をしました。 具体的には作成済みのNICをLoad Balancerのバックエンドプールに追加しようとしたところ、既存のNSG設定を削除しました。
増分デプロイモードはリソースの有無に対しては増分のみデプロイされるけど、リソース内のプロパティは上書きされるのでしっかり定義しましょう。(戒め
それと検証環境だし完全デプロイモードにしようとしたら、リンクされたテンプレートとか入れ子のテンプレートがあると使えないよ~!という感じだったので増分デプロイモードになりました。
copyのcount
copyは反復処理させるときに使用する関数です。
VMが合計24台とかあったので有効活用しました。が、一部ハマりました。
いろんな用途のVMがあったのでデータディスクの本数も様々なので、
count: "[length(parameters('dataDisks'))]" みたいなことしたかったんですが、コピー制限がありました。
Azure リソースの複数インスタンスのデプロイ | Microsoft Docs
REST API バージョン 2019-05-10 以降のテンプレートをデプロイする場合、count を 0 に設定できます。 それ以前の REST API のバージョンでは、count をゼロに設定することはサポートされていません。
Microsoft.Compute/virtualMachines 2019-03-01 - Azure template | Microsoft Docs
Microsoft.Compute/virtualMachinesの最新APIバージョンは2019-03-01ってなってました。詰んだ。
おとなしくデータディスクが存在しないVMは別のテンプレートにしました
他にもちょいちょいハマりましたが、だいたい書く階層を間違えてるような凡ミスが多かったです。jsonで書くのつらたんです。
便利だったもの
リソース関数 reference
NSGのセキュリティルールを1から書くのしぬほど大変じゃないですか。
検証環境なので本番環境の値そのまま持ってくればいいので探してみたら便利な関数見つけました。
Azure Resource Manager テンプレートの関数 - リソース | Microsoft Docs
使い方はこんな感じでした。
"resources": [ { "name": "nsg2", "type": "Microsoft.Network/networkSecurityGroups", "apiVersion": "2017-10-01", "location": "Japan East", "properties": { "securityRules": "[reference(resourceId(parameters('prdRg'), 'Microsoft.Network/networkSecurityGroups', 'nsg1'),'2019-04-01').securityRules]" } } ]
第1引数にリソースID、第2引数にAPIバージョンを指定してあげて、参照したいプロパティ名を最後につけるだけ。
第3引数に’Full’を与えるとproperties以外の値も取ってきてくれるようですが、
NSGのセキュリティルールはpropertiesに書いてあるので引数2つで問題なしです。
使用可能な箇所については制限があるのでちゃんと読みましょう。読まなかった人からのアドバイスです。
reference 関数は、リソース定義のプロパティと、テンプレートまたはデプロイの出力セクションでのみ使用できます。
nullの判定
特定のプロパティが存在しないときにequals(parameters('aa'),null) みたいなこと書いてみたら怒られました。
空とかnullの判定はemptyという関数があるようです。
Azure Resource Manager テンプレートの関数 - 配列とオブジェクト | Microsoft Docs
empty(parameters('aa'))
とってもシンプルでした。
大層なテンプレートは書いてないので今日はざっくりここまでということで。
(というかちょいちょい忘れてる部分があるので、次回からはもう少しメモ残しながら作ります
AzureのVMでスクリプトを定期実行させてみる
会社の人から毎月初めにログをアーカイブしておくのが大変、なんて話を聞いたのでちょっと遊んでみた話です。
なんかWindowsのセキュリティログをアーカイブしてディスクに丁寧に保存してるんだとか。
保持期限も設定されてないのでとりあえず内部のディスクに溜まり続ける宿命らしい。
最初はLog Analyticsで収集しておくかーって思ったけど、保管してあればいいだけで検索できる必要もないし、
そもそもセキュリティログは収集出来ないらしかった。
というわけで、zipにしてストレージアカウント放り込んでおこう、という安易な考えに至りました。
以下がその過程です。
まずはVM内でスクリプトを実行するにはいくつか方法があるらしい。
docs.microsoft.com
- カスタム スクリプト拡張機能
これはだいたいVM作成時に使うものので除外 - 実行コマンド
昨年あたりに使えるようになった、ポータルからも実行できるやつ。
とりあえず手っ取り早そう - Hybrid Runbook Worker
なんか使えそう。 - シリアル コンソール
ポータルからしか使えん
というわけでHybrid Runbook Workerが最適っぽいけど何故か実行コマンドを選びました。我ながら愚か。
そして実行コマンドをAutomationで定期実行しよう、と貧弱な発想に思い至ったのです。
AutomationからInvoke-AzVMRunCommandを叩くだけなので、まずはVM内で実行するスクリプトを書いてみた
param ( [parameter(mandatory=$true)] [string]$workDir, # ログのあるディレクトリ [parameter(mandatory=$true)] [string]$msiId, #マネージドID [parameter(mandatory=$true)] [string]$storageAccount, #アップロード先のストレージアカウント [parameter(mandatory=$true)] [string]$container #アップロード先のコンテナ ) $ErrorActionPreference = "Stop" # Compressing Log Set-Location $workDir $beginDay = (Get-Date -Day 1 -Hour 0 -Minute 0 -Second 0).AddMonths(-1) $endDay = (Get-Date -Day 1 -Hour 23 -Minute 59 -Second 59).AddDays(-1) $fileName = "Archive-Security-$($endDay.ToString("MM")).zip" $sourcePath = (Get-ChildItem | Where-Object{($_.Name -like "Archive-*") -and ($_.LastWriteTime -ge $beginDay) -and ($_.LastWriteTime -le $endDay)}).FullName $destPath = "$($workDir)\$($fileName)" &C:\Tools\7z1806-extra\x64\7za a -tzip $destPath $sourcePath # Upload Log &C:\tools\azcopy\azcopy login --identity $msiId &C:\tools\azcopy\azcopy cp $destPath "https://$($storageAccount).blob.core.windows.net/$($container)" Remove-Item $sourcePath Remove-Item $destPath
マネージドIDについてはこちら
docs.microsoft.com
ストレージアカウントの情報とか、AzureADの資格情報とか直接書きたくないなあ、と思ったらちょっと便利そうな機能だったので使ってみた。
VMからならAzureへのログインが簡単にできる。うちのVMはローカルアカウントの管理がザルなので、その気になれば悪用できるけどその部分は先輩に考えてもらうことにします。
上記のスクリプトをストレージアカウントに保存して、大切な情報も載せてないのでパブリック公開しました。(手抜き)
そしてそれをAutomationで実行しようとした結果がこちらのRunbook。
param( [parameter(Mandatory=$true)] [String] $rgname, [parameter(Mandatory=$true)] [String] $vmname, [parameter(Mandatory=$true)] [string]$workDir, [parameter(Mandatory=$true)] [string]$msiId, [parameter(Mandatory=$true)] [string]$storageAccount, [parameter(Mandatory=$true)] [string]$container" ) $connection = Get-AutomationConnection -Name "AzureRunAsConnection" Write-Output $connection Login-AzAccount -ServicePrincipal -Tenant $connection.TenantID -ApplicationId $connection.ApplicationID -CertificateThumbprint $connection.CertificateThumbprint $script= 'Archive-AuditLog.ps1' Invoke-WebRequest -Uri "https://$($storageAccount).blob.core.windows.net/scripts/$script" -OutFile $script Invoke-AzureRmVMRunCommand -ResourceGroupName $rgname ` -Name $vmname ` -CommandId 'RunPowerShellScript' ` -ScriptPath $script ` -Parameter @{"workDir" = "$($workDir)"; "msiId" = "$($msiId)"; "storageAccount" = "$($storageAccount)"; "container" = "$($container)"}
rgnameとvmnameは実行対象のVMの指定です。
他はVM内で実行するスクリプトに渡す情報です。
最後にAutomationのスケジュール登録して終わり。すごい手抜きでごめんなさい。
また時間を見つけてHybrid Runbook Workerで書き直してみようと思いますのでしばらくお待ちください。
Azureと自宅をVPNした
またしても1年半のブランクが空いてました。
歳のせいか1年が早いです。
今回はAzureのVPN Gatewayと自宅のIX2015でVPNを張って、BGPで経路交換したいと思います。
たまに会社の案件で使いそうになるので検証したいと思いつつ、会社が検証用のNW環境がないので自宅でやろうと思い立った次第です。
ダイナミックルーティングだしActive/Active構成にしろよと思われるかもしれませんが、
一般宅なのでインターネット回線冗長化してないです、すいません。
あとBGPはCCNPの勉強でちょっと触れた程度なので、わかってない部分が多いです…
とりあえず今回の構成はこんな感じ。
仕事ではほぼAzureしか使ってないので、いつものこちらのアイコン使いました。
Download Microsoft Azure, Cloud and Enterprise Symbol / Icon Set - Visio stencil, PowerPoint, PNG, SVG from Official Microsoft Download Center
まずはAzure側の設定
1. VPN Gatewayの設定
VPNGatewayはBasicのものが既にあるので、BGPに対応したStandardにSKU変更し、「BGP ASNの構成」にチェック入れます。
(SKUの変更でも新規作成と同じくらい時間がかかりました)
本当はVpnGw1が良いんでしょうけど、常時繋いでおくにはBasicがお安いのです…
2. ローカルネットワークゲートウェイの設定
ローカルネットワークゲートウェイはオンプレミスのルータに関する情報をAzureに登録しとくようなやつです。
作成画面じゃないけどこんな感じ。
IPアドレス:自宅のグローバルIP
アドレス空間:オンプレミスのデバイスのローカルIP(そのままBGPピア貼るためのスタティックルートになる)
ASN:オンプレミスのAS番号
BGPピアのIPアドレス:オンプレミスのデバイスのローカルIP
3. 接続の作成
サイト対サイトを選択して、さっき作ったローカルネットワークゲートウェイとVPNGatewayを指定するだけです。
「BGPを有効にする」のチェックは忘れずに。
Azure側の設定はこれだけ。
次にオンプレミスのIX2105の設定です
1. VPNの設定
だいたいNECのドキュメントを参考に。
ikev2 authentication psk id ipv4 <VPN GatewayのグローバルIP> key char <共有キー(PSK)> ikev2 default-profile dpd interval 10 sa-proposal dh 1024-bit source-address GigaEthernet0.0 interface Tunnel0.0 description AzureVPN tunnel mode ipsec-ikev2 ip unnumbered GigaEthernet1.0 ip tcp adjust-mss 1350 ikev2 connect-type auto ikev2 ipsec pre-fragment ikev2 peer <VPN GatewayのグローバルIP> authentication psk id ipv4 <VPN GatewayのグローバルIP> no shutdown
2. BGPの設定
最初のスタティックルートとBGPのupdate-sourceを忘れてて数時間潰しました。
スタティックルート書かないとネイバーまでの経路がわからないので必要。
update-sourceは理解不足。冗長化してるときはループバックインターフェイスの指定が必要みたいだけど、まぁ1本しかないので普通に物理インターフェイス指定してます。
ebgp-multihopはBGPのパケットは通常TTLが1らしいので必要。最大値設定したけど2でいいのかもしれない。
ip route 172.31.255.254/32 Tunnel0.0 router bgp 65500 neighbor 172.31.255.254 remote-as 65510 neighbor 172.31.255.254 update-source GigaEthernet1:1.0 neighbor 172.31.255.254 ebgp-multihop 254 neighbor 172.31.255.254 description AzureVPN-BGP address-family ipv4 unicast network 192.168.SS.0/24 network 192.168.TT.0/24
だいたいこんな感じでIX側の設定も完了。
あとはVPNの確認と、BGPの確認を行うだけです。
Azure側は接続リソースが「接続済み」になってればOKですね。いつもどおり。
IX側は
show ikev2 sa
でも叩いて確認。
続いてBGPの確認
Azure側は
Get-AzureRmVirtualNetworkGatewayLearnedRoute
など
Origin : EBgpでオンプレミス側から受け取った経路情報が見えるはず。
IX側は
show ip bgp neighbors
だいたいこんな感じでサイト対サイトVPNでBGPできました。
ぶっちゃけciscoと似たような設定なのでciscoのドキュメントやら黒本も参考にしました。
ざっくりだけど以上です。時間空きすぎなのでもう少しこまめに何か書こう……
といってまた1年後に何か書いてる姿が目に浮かぶ。
Azureネットワークウォッチャーでパケットキャプチャー
いろいろとサボってたら、1年半近くブログ書いてない事に気付いてしまった。
何をしてたのかと問われると困るけれど、社会人デビューしてました。
1年半前のネスペに見事落ちましたが、
昨年は無事に合格しました。進展はそれくらいです。
最近仕事でAzureに触れることが非常に多いので、
せっかくなのでAzureのこと書いてみるか~と思い立って早数ヶ月。
先月あたりにひょっこり登場した、
「Azure Network Watcher」を導入してみたいと思います。
Network Watcherの導入
ひとまずこちらのページを参考に導入を試みましたが、導入方法がざっくりすぎたので公式のドキュメントに行きました。
docs.microsoft.com
まだプレビュー機能なので、登録するところから始まります。
Register-AzureRmProviderFeature -FeatureName AllowNetworkWatcher -ProviderNamespace Microsoft.Network Register-AzureRmResourceProvider -ProviderNamespace Microsoft.Network
しばらく待つと登録が完了します。
Get-AzureRmProviderFeature -FeatureName AllowNetworkWatcher -ProviderNamespace Microsoft.Network
お次はポータルから有効化をぽちぽちと。
この画面で気付いたんですが、
現在提供されてるのは米国西部、米国中北部、米国中西部の3リージョンのみのようです。
パケットキャプチャの有効化
ネットワークウォッチャーが有効化できたので、パケットキャプチャ機能を使ってみたいと思います。
と、パケットキャプチャの追加ボタンを押したら何やらメッセージが…
エージェント入れないといけないみたいですね、ええ
docs.microsoft.com
ちゃんとドキュメントにも書いてありました。
- Windowsの場合
パワーシェルで以下のコマンドを
Set-AzureRmVMExtension -ResourceGroupName "リソースグループ名" ` -Location "リージョン" ` -VMName "仮想マシン名" ` -Name "networkWatcherAgent" ` -Publisher "Microsoft.Azure.NetworkWatcher" ` -Type "NetworkWatcherAgentWindows" ` -TypeHandlerVersion "1.4"
- Linuxの場合
こちらはAzure CLIの模様
azure vm extension set リソースグループ名 仮想マシン名 NetworkWatcherAgentLinux Microsoft.Azure.NetworkWatcher 1.4
OKが返ってきたら、やっとパケットキャプチャを追加できます。
対象のマシンやら、保存先のストレージアカウントやら簡単な設定だけでOKです。
プロトコルやIP、ポートでフィルターもかけられますが一旦省略。
追加が完了すると、実行中になります。
ちなみにコレ、設定した制限時間経つか、キャプチャを停止しないとファイルに出力されません。
規定の設定だと5時間後です。
待つのも辛かったので、一旦キャプチャを停止しました。
指定したストレージアカウントを見てみると、ちゃんと保存されてます。
あとはこれをWiresharkや、Microsoft Message Analyzerで開けばOKです。
試しにMicrosoft Message Analyzerで開いた画面がこちら。
Azure上の必要な通信については、以下のサイトで説明してくれてます。
blogs.msdn.microsoft.com
その他の使い方
公式のドキュメント見た感じ、いろいろと使いみちはありそうです。
- Azure Automation を使用して VPN Gateway を監視する
- VPNゲートウェイを使用してオンプレミスの接続を診断する
- パケットキャプチャを分析して異常を検出する
- パケットキャプチャを使用してAzure機能によるプロキシブなネットワーク監視を実行する
- パワーBIを使用してフロアを視覚化する
- オープンソースツールを使用して、フロアを視覚化する
- オープンソースツールを使用してネットワークトラックパラメータを視覚化する
- PowerShellを使用してネットワークのコンプライアンスと監査を実行する
- オープンソースツールを使用して侵入調査を実行する
- Azure Log Analyticsでアプリケーションゲートウェイのログを分析する
が、私の能力不足のため今日はとりあえずはここまで
たった3週間の勉強でネスペに挑んだ愚か者
長らく放置してました。なんと5ヶ月半ぶり。
きっといろいろと忙しかったんです…(?)
それはさておき、先日の情報処理技術者試験受けてきました。ネットワークスペシャリストです。
今年の4月に「9月末までにCCNAを取る」「ネスペ取る」っていう宣言をさせられたのが事の始まりです。
就活やらイベントやらテストやらでごたごたしてて、9/25という期日ギリギリの日程でCCNA受けました。そっちは無事に合格。なんとびっくり勉強期間1週間!
そしてそこからネスペの勉強を始めたのです。試験22日前スタート!馬鹿ですね!!!
高度試験は午前Ⅰ、午前Ⅱ、午後Ⅰ、午後Ⅱの四部構成で、午前Ⅰ受からないと後ろは一切採点しないっていう鬼畜仕様です。なので本命の午後問題にたどり着かないことには話が始まりません。
まずは10日くらいかけて午前の勉強を。だいたい過去問から出るイメージなので過去問をとりあえず何周かやってみました。
このサイトでぽちぽちと。基本情報の頃からだけど、開発系とストラテジ系が苦手なのでちょっと重点おいてみました。
午前Ⅱはあんまり眼中になかったのでほぼスルー。
そして後ろの10日くらいで午後の勉強を。
全然時間がなかったので、H21~26の過去問を解いて解説読んで~っていうのを一通りやりました。解説読めば理解は出来ても、自力ではなかなか答えにたどり着けませんね。
MACアドレスの学習とか基本的なことが頭から抜けてたりしました。
この環境だとどういう問題が起こるか~とか、動作とかきちんと理解してないとさっぱりですね。
あとは丁寧にパケット・フレームの流れを追うの、とても大事ですね。
そして一昨日の本番になったわけですが、午後Ⅱがヤバかったです。
ネットワーク関係の問題を選べば、無線SIPセキュリティ関係は学校でもやってる部分もあるし丁寧にやれば大丈夫。なんて思ってた時期が私にもありました。
問2がネットワーク関係だったんですけど、CGN、IGMP、VXLANとか出てきました。泣きました。すべてノーマークです。勉強不足です。
一応問題文と本文じっくり読みながら流れを確認しながら解答欄埋めてみましたがとても自信がないです。大破どころか轟沈です。
昨日公表された午前問題は、自己採点では合格してました。
3回ほど基本情報受けたので1ヶ月後には結果が分かるってイメージがあったんですけど、応用以上だと結果は2ヶ月後なんですね。午後問題の解答も結果発表の一週間前なんて知らなかった。
2ヶ月間ドキドキしながら過ごします。来年のネスペの準備もしておきます。
ねっとわーくまがいのはなし
GW暇じゃなかったけど気分転換に家のネットワークいじってみました。
我が家はauひかりなのでクソみたいなHGW:BL900HWを使用しております。
とりあえずその下に以前いただいたIX2005ぶら下げて、宅内の有線LANを見てもらうことにしてみました。
しかし我が家は1G契約なので、IX2005だとファストイーサなのです、100Mなのです。いじる前のほうが速度出たんや実は…くっ…
まぁ私のお遊びですしそんな困るようなこともない(はず)なので、しばらく使ってみます。
ところで我が家のWi-FIは、auのHOME SPOT CUBEとか使っちゃってるんですが、この子が糞でした。
基本的にLANに繋げば自動的に.254のアドレス拾ってくるようになってるみたいなんですが、諸事情でDHCPのアドレスプール変えたら.254を拾えなくなって発狂しました。プール内の一番後ろ拾うもんだと思ってたのに、そういうわけではなかった…
何も気付かずにふとスマフォ見てみたら、Wi-Fi繋がってないしノートPCにはIPv4のリンクローカルアドレス(169.254.xxx.xxx)が…
そして気付いたらWi-Fi繋いでツムツムやってた弟も発狂してた。いや、Wi-Fi影響ないと思ってたんですごめんよ
HGWのほうでMACアドレス指定して固定でIPアドレス割り当ててもらうようにしてみた、ら無事に繋がった。
ちなみにCUBEはほとんど手動設定できる項目がないです。面倒でした。config打てないって辛いなって思いました。ASUSの無線ルータほしいです。
GD
とある会社の一次選考がグループディスカッションでした。
生まれてこの方、そんなことしたことないよ~~~
正直最初はグループディスカッションとか無理だから受けるのやめよ…って思ってたけど、とりあえず挑戦してみようってことでエントリーしたわけです。
変なところでチャレンジ精神に溢れてるのが私です。
グループディスカッションの内容は深く話すとまずそうだからなんとなく。
一言でいうと、このところ売上が伸び悩んでるから今期気合入れてシェアNo.1奪いましょう!!っていうプロジェクトですね。
資料読んでそれぞれの意見を発表して、その後に話し合ってプロジェクトの方針を決めよう!ということでした。
資料の意見もそれぞれだし、グループ内でも意見それぞれだし、大変でした。当たり前か。
自分の意見を推したいけど、他の人の意見も分かるから全否定は出来ないし多分よろしくない。意見一つ言うのもいろいろと根拠が無いと相手も納得出来ないから、資料もちゃんと目を通しておかなくてはならない。時間少ないのに資料多すぎぃ!
普段そんなに意見ぶつけたり話し合ったりしない性格なので、真面目にグループディスカッションは結構な難敵でした。でもグループの人たち話しやすかったし、緊張はだんだん解けていったのがよかった。
正直合格を意識するほどの余裕はなかったですが…ふはは
でもやっぱり話し合いって大切ですよね。うーん、頭を使おう俺。
それとネットで噂になってたとおり、人事の人がとても良い人でした!
選考終わった後の質問コーナーで、企業の調べ方教えてくれた。いやー、そんなところ見たことなかったですヨー!