sorta kinda...

主にAWS関連ですが、これに限らずいろいろ勉強したことや思ったことを書いていきます。

Slack チャンネル一覧を Backlog wiki に表形式で書くスクリプトを作ってみた

Slack 運用は簡単じゃないってのを感じはじめています、那須です。

社内 Slack をスタンダードプランにアップグレードしたのをきっかけに、マルチチャンネルゲストやシングルチャンネルゲストをうまく使っていくことになりました。 早速ユーザの種別を変更していくと、マルチチャンネルゲストの方が既存のパブリックチャンネルに入りたいけど存在が見えなくなった、と連絡いただきましてね。。

help を見ると確かにそういう権限になっていますね。

get.slack.help

「今こんなチャンネルがあるよーが時々ほしいですね」とご意見をいただいたので、少ない脳みそをフル回転させてスクリプトを作ってみました。 久々の Github への公開ですw
今はこれを AWS Lambda で平日だけ朝 9 時に実行するようにしています。

github.com

悪戦苦闘して 8 回も commit したのがバレるのはちょっと恥ずかしいですが、これも経験だと思ってこれから Git の文化?に慣れていこうと思います。

こここうしたほうがいいんじゃない?みたいなご意見は山のようにあるかとは思いますが、言ってくれたほうが勉強になっていいので是非ツッコミください。

Windows Server の初期設定を Session Manager で即完了させよう

bash だけじゃなく PowerShell も触っていこうと思い直しました、那須です。

先日、Windows Server のディスク初期設定を PowerShell でやってしまおうと書きました。

nasrinjp1.hatenablog.com

Windows Server の初期設定っていろいろとやることあるんですが、いちいち RDP で入って GUI で作業するのも時間かかるので全部 PowerShell でかつ Session Manager 経由でやりたいなと思ってやってみました。 なんとかなるもんですね。

 

やること

今回は下記のタスクを PowerShell で一気に片付けてしまおう、というお話です。

  • Windows Firewall の無効化
  • IE ESC の無効化
  • タイムゾーンの設定
  • ディスクの初期化
  • administratorのパスワード変更
  • ホスト名の変更と反映のための再起動

 

やってみよう

今回はこの Windows Server 2019 を実験台にしてやってみましょう。 f:id:nasrinjp1:20190307224711p:plain

EC2 インスタンスが起動したら、すぐに Systems Manager の Session Manager コンソールに移動しましょう。 そしてセッションを開始します。

時々、いくら待っても Systems Manager から対象の EC2 インスタンスが見えない時があります。 そんな場合は、EC2 インスタンスを再起動するとかなりの確率で見えるようになりますよ。
f:id:nasrinjp1:20190307224727p:plain

セッションが開いたら、スクリプトをコピペして実行します。
f:id:nasrinjp1:20190307224742p:plain

コピペするスクリプトは↓こんな感じの内容です。 改良の余地はたくさんあると思いますが、初期設定でしか使わないのでこんなんで十分です。

# Set variable
$AdminKey = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}"
$UserKey = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}"
$Timezone = "Tokyo Standard Time"
$Hostname = "nasunoserver"
$InitializedDisks = @(
    @(
        "vol-0e6dfb6b7edc3cc24",
        "VVVVV",
        "V"
    ),
    @(
        "vol-010029bd0a044c8a4",
        "WWWWW",
        "W"
    )
)

# Disable Windows firewall
get-NetFirewallProfile | set-NetFirewallProfile -Enabled false

# Change timezone
Set-TimeZone -Id $Timezone

# Disable IE ESC
Set-ItemProperty -Path $AdminKey -Name "IsInstalled" -Value 0
Set-ItemProperty -Path $UserKey -Name "IsInstalled" -Value 0

# Initialize disks
$InitializedDisks | foreach {
    Get-Disk | Where SerialNumber -match ($_[0] -replace "-") | Set-Disk -IsReadonly $False | Set-Disk -IsOffline $False
    Get-Disk | Where SerialNumber -match ($_[0] -replace "-") | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel $_[1] -Force | Get-Partition | Add-PartitionAccessPath -AccessPath ($_[2] + ":")
}

# Change administrator password
$Password = Read-Host "Enter Administrator password" -AsSecureString
$UserAccount = Get-LocalUser -Name "Administrator"
$UserAccount | Set-LocalUser -Password $Password

# Rename hostname
Rename-Computer -NewName $Hostname -Force -Restart

 

確かめてみよう

再起動が終わったタイミングを見計らって、RDP でログインしてみましょう。 先ほど変更したパスワードを使って administrator ユーザで入ります。 入れましたか?
f:id:nasrinjp1:20190307224756p:plain

サーバーマネージャーとエクスプローラを開いてみると、変更をかけた部分がちゃんと変わっていますね。
なんか Windows Firewall が On のままだけど、この後もう一回同じ手順でやったら Off になったのでよしとしよう。 初期設定のためにエラーハンドリングを時間をかけてきっちり書いていくのもちょっと違うなーと思っているので、そういうこともあるよなと割り切ってます。

 

まとめ

いいこと

  • キーペアで初期パスワードを復号する必要がない&EC2 インスタンス作成後の数分待つのがなくなる
  • パスワードを忘れたとしても簡単にパスワード変更ができる
  • RDP で入らなくてもいいので、なんか遅いな…とかでストレスたまらない
  • 同じ作業をたくさんの EC2 インスタンスにすればするほど時間短縮の恩恵がある

もひとつなこと

  • PowerShell で実行してエラーが出なかったからといって想定通り変更されているとは限らない(可能性は低いけど 0 ではない

これは PowerShell の問題というよりは Session Manager の問題な気もします。 コマンドレット実行してるように見えるけど実際には実行されてない、とか?

確実に変更されていることを確認するには、コマンドレット実行後に状態を確認して必要に応じて処理をする、みたいな流れのスクリプトにすることである程度は対処できそうですね。

 

というわけで、Session Manager は本当に便利ですよ!というお話でした。