Systems Manager で Windows ドメイン参加を自動化してみる

Systems Manager Run Command で Windows ドメインへの参加を自動化する方法を紹介します。
2019.04.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井です。

今回は Systems Manager Run Command で Windows ドメインへの参加をしてみます。
ドメイン参加はリモートデスクトップで実施しても難しくないですが、
台数が多いと面倒に感じると思います。

Run Command を使って手間を削減しましょう!

ドメイン参加用ユーザーの準備

Run Command のコード内に直接ユーザーアカウントとパスワードを書くわけにはいかないので
これらはパラメータストアに格納します。

パラメータストア を開きます。

ドメイン参加用ユーザー

パラメータの作成 をクリックします。
<パラメータの詳細>画面では以下を入力します。

項目
名前 識別しやすい名前。
例)/YourCompany/YourID
タイプ 文字列
ドメイン参加用のユーザーID

パラメータの作成 をクリックします。

ドメイン参加用パスワード

パラメータの作成 をクリックします。
<パラメータの詳細>画面では以下を入力します。
※パスワードは暗号化して格納します。

項目
名前 識別しやすい名前。
例)/YourCompany/YourPassword
タイプ 安全な文字列
KMS の主要なソース 現在のアカウント
KMS キー ID alias/aws/ssm
ドメイン参加用のパスワード

パラメータの作成 をクリックします。

インスタンスプロファイルの作成

ドメイン参加させる EC2 に紐付けるインスタンスプロファイルを作成します。

IAMポリシーの作成

IAM ポリシーを作成します。
これは暗号化したパスワードを復号するために必要です。

暗号化キー を開きます。
リージョンを選択するドロップダウンがあるので、EC が稼働しているリージョンを選択します。
リージョン選択後、aws/ssm をクリックします。

概要に表示されている ARN をメモします。
暗号化キー画面は閉じて大丈夫です。

ポリシー を開きます。
ポリシーの作成 をクリックします。
JSONタブ をクリックし、以下をコピー&ペーストします。
「your-arn」は前の手順でメモした ARN に置き換えてください。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "kms:Decrypt"
         ],
         "Resource":[
            "your-arn"
         ]
      }
   ]
}

ポリシーの確認 をクリックします。

<ポリシーの確認>画面では、識別しやすい名前を入力し、ポリシーの作成 をクリックします。

IAMロールの作成

ロール を開きます。

ロールの作成 をクリックします。

サービスが一覧されていると思います。その中から EC2 をクリックします。
ユースケースの選択 が表示されるので EC2 Role for Simple Systems Manager をクリックし、 次のステップ: アクセス権限 をクリックします。

<Attached アクセス権限ポリシー>画面では、AmazonEC2RoleforSSM が表示されていることを確認し、次のステップ: タグ をクリックします。

<タグの追加(オプション>画面では、任意のタグキーを入力します。(必須ではありません)
次のステップ: 確認 をクリックします。

<ロールの作成>画面では、識別しやすいロール名を入力し、ロールの作成 をクリックします。

ロールが作成されました。
作成したばかりのロールを開きます。

ポリシーをアタッチします をクリックします。

前に手順で作成したポリシーにチェックを入れ、ポリシーのアタッチ をクリックします。
IAM ロールには、AmazonEC2RoleforSSM と作成したポリシーが紐付いていることを確認します。

EC2へアタッチ

インスタンス を開きます。

対象のインスタンスにチェックを入れ、アクション → インスタンスの設定 → IAM ロールの割り当て/置換 をクリックします。

<IAM ロールの割り当て/置換>画面では、前の手順で作成したロールを選択し、適用 をクリックします。

ドキュメントの作成

RunCommand で実行するドキュメントを作成します。
ドキュメント を開きます。

ドキュメントの作成 をクリックします。
<ドキュメントの作成>画面では以下を入力します。

項目
名前 識別しやすい名前
ドキュメントタイプ コマンドのドキュメント

コンテンツでは YAML にチェックを入れ以下のコードを貼り付けます。
「/YourCompany/YourID」 と 「/YourCompany/YourPassword」 は手順「ドメイン参加用ユーザーの準備」で作成した値に置換してください。
「your-domain」 はご自身の環境のドメインに置換してください。

---
schemaVersion: "2.2"
description: "Run Add-Computer"
mainSteps:
- name: runAddComputer
  action: aws:runPowerShellScript
  inputs:
    runCommand: 
      - $ErrorActionPreference = "Stop"
      - echo '---------------'
      - echo 'Run Add-Computer'
      - $User = (Get-SSMParameterValue -Name /YourCompany/YourID).Parameters[0].Value
      - $PWord = (Get-SSMParameterValue -Name /YourCompany/YourPassword -WithDecryption $True).Parameters[0].Value | ConvertTo-SecureString -asPlainText -Force 
      - $Credential = New-Object System.Management.Automation.PSCredential($User,$PWord)
      - Add-Computer -DomainName your-domain -Credential $Credential 
      - echo '---------------'
      - echo 'Reboot!'
      - Restart-Computer -Force

コードの貼り付けと置換が完了したら、ドキュメントの作成 をクリックします。

オペレーション

作成したドキュメントを実行します。
ランコマンド を開きます。

コマンドの実行 をクリックします。

<コマンドの実行>画面のフィルター欄で 所有者:自己所有 を選択し絞り込みます。
前の手順で作成したドキュメントにチェックを入れます。

ターゲット → インスタンスの手動選択 で対象のインスタンスを選択します。

出力オプション で任意の S3 バケットを選択します。
Run Command の出力はコンソールでは2500文字しか表示されず、日本語が文字化けします。
エラー時の解析を容易にするため、及び、実行証跡を残すために必ず S3 バケットを出力するようにしましょう。

実行 ボタンをクリックすると処理が実行されます。
実行の詳細が表示されるので成功することを確認します。

おわりに

難易度が低い作業においても自動化することの意義はあると思います。
本手順では自動化に加え、ドメイン参加用ユーザーとパスワードをパラメータストアに持たすことで
オペレーターにパスワードを教えなくてよい手順となっています。
みなさまの自動化推進の助けになれば幸いです。

参考

AWS Systems Manager Run Command
チュートリアル: Secure String パラメータを作成し、インスタンスをドメインに結合する (PowerShell)