

• AWS Systems Manager CloudWatch ダッシュボードは、2026 年 4 月 30 日以降は利用できなくなります。お客様は、これまでと同様に Amazon CloudWatch コンソールを使用して、Amazon CloudWatch ダッシュボードの表示、作成、管理を継続できます。詳細については、「[Amazon CloudWatch ダッシュボードのドキュメント](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html)」を参照してください。

# Parameter Store で SecureString パラメータを作成して、ノードをドメインに結合する (PowerShell)
<a name="sysman-param-securestring-walkthrough"></a>

このチュートリアルでは、 AWS Systems Manager `SecureString` パラメータと Run Command を使用して Windows Server ノードをドメインに結合する方法を示します。チュートリアルでは、ドメイン名やドメインユーザー名など一般的なドメインパラメータを使用します。これらの値は、暗号化されていない文字列値として渡されます。ドメインパスワードは、AWS マネージドキー を使用して暗号化され、暗号化された文字列として渡されます。

**前提条件**  
このチュートリアルでは、Amazon VPC に関連付けられた DHCP オプションセットでドメイン名と DNS サーバーの IP アドレスを既に指定していることを前提としています。詳細については、*Amazon VPC ユーザーガイド*の「[DHCP オプションセットを使用する](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html#DHCPOptionSet)」を参照してください。

**`SecureString` パラメータを作成し、ノードをドメインに結合するには**

1. AWS Tools for Windows PowerShell を使用してシステムにパラメータを入力します。

   次のコマンドでは、*ユーザー入力プレースホルダー*をユーザー自身の情報で置き換えます。

   ```
   Write-SSMParameter -Name "domainName" -Value "DOMAIN-NAME" -Type String
   Write-SSMParameter -Name "domainJoinUserName" -Value "DOMAIN\USERNAME" -Type String
   Write-SSMParameter -Name "domainJoinPassword" -Value "PASSWORD" -Type SecureString
   ```
**重要**  
`SecureString` パラメータの*値*のみが暗号化されます。パラメータ名、説明などのプロパティは暗号化されません。

1. ノードに IAM ロールのアクセス許可をするために、次の AWS Identity and Access Management (IAM) ポリシーを添付します。
   + **AmazonSSMManagedInstanceCore** – 必須。この AWS 管理ポリシーにより、マネージドノードは Systems Manager サービスのコア機能を使用できます。
   + **AmazonSSMDirectoryServiceAccess** – 必須。AWS 管理ポリシーでは、マネージドノードによるドメインの結合リクエストに対して、SSM Agent による AWS Directory Service へのアクセスをお客様の代わりに許可します。
   + **S3 バケットアクセスのカスタムポリシー** – 必須。ノードにあり、Systems Manager タスクを実行する SSM Agent は、Amazon 所有の特有の Amazon Simple Storage Service (Amazon S3) バケットへのアクセスが必要です。作成したカスタムの S3 バケットポリシーで、Systems Manager オペレーションに必要な独自の S3 バケットへのアクセス権も付与します。

     例: Run Command コマンドまたは Session Manager セッションの出力を S3 バケットに書き込んだ後、この出力を監査またはトラブルシューティングに使用できます。アクセススクリプトまたはカスタムパッチベースラインリストを S3 バケットに格納してから、コマンドを実行する場合、またはパッチベースラインが適用される場合にスクリプトまたはリストを参照します。

     Amazon S3 バケットアクセスのカスタムポリシーの作成の詳細については、「[インスタンスプロファイルのカスタム S3 バケットポリシーを作成する](setup-instance-permissions.md#instance-profile-custom-s3-policy)」を参照してください。
**注記**  
S3 バケットに出力ログデータを保存することはオプションですが、使用することを決定した場合は、Systems Manager 設定プロセスの最初に設定することをお勧めします。詳細については、*Amazon Simple Storage Service ユーザーガイド*の「[バケットの作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)」を参照してください。
   + **CloudWatchAgentServerPolicy** – オプション。この AWS 管理ポリシーでは、マネージドノードで CloudWatch エージェントを実行できます。このポリシーでは、ノードの情報を読み込み、Amazon CloudWatch に書き込むことができます。このポリシーは、Amazon EventBridge や CloudWatch Logs などのサービスを使用する場合にのみ、インスタンスプロファイルに必要です。
**注記**  
CloudWatch と EventBridge 機能の使用はオプションですが、使用することにした場合は、Systems Manager 設定プロセスの開始時にそれらを設定することをお勧めします。詳細については、*[Amazon EventBridge ユーザーガイド](https://docs.aws.amazon.com/eventbridge/latest/userguide/)*および *[Amazon CloudWatch Logs ユーザーガイド](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/)*を参照してください。

1. ノードにアタッチされた IAM ロールを編集し、次のポリシーを追加します。このポリシーは、`kms:Decrypt` と `ssm:CreateDocument` API を呼び出すためのアクセス許可をノードに付与します。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "kms:Decrypt",
                   "ssm:CreateDocument"
               ],
               "Resource": [
                   "arn:aws:kms:us-east-1:111122223333:key/kms-key-id"
               ]
           }
       ]
   }
   ```

------

1. 以下の json テキストをコピーしてテキストエディタに貼り付け、ファイルを `JoinInstanceToDomain.json` として `c:\temp\JoinInstanceToDomain.json` に保存します。

   ```
   {
       "schemaVersion": "2.2",
       "description": "Run a PowerShell script to securely join a Windows Server instance to a domain",
       "mainSteps": [
           {
               "action": "aws:runPowerShellScript",
               "name": "runPowerShellWithSecureString",
               "precondition": {
                   "StringEquals": [
                       "platformType",
                       "Windows"
                   ]
               },
               "inputs": {
                   "runCommand": [
                       "$domain = (Get-SSMParameterValue -Name domainName).Parameters[0].Value",
                       "if ((gwmi Win32_ComputerSystem).domain -eq $domain){write-host \"Computer is part of $domain, exiting\"; exit 0}",
                       "$username = (Get-SSMParameterValue -Name domainJoinUserName).Parameters[0].Value",
                       "$password = (Get-SSMParameterValue -Name domainJoinPassword -WithDecryption $True).Parameters[0].Value | ConvertTo-SecureString -asPlainText -Force",
                       "$credential = New-Object System.Management.Automation.PSCredential($username,$password)",
                       "Add-Computer -DomainName $domain -Credential $credential -ErrorAction SilentlyContinue -ErrorVariable domainjoinerror",
                       "if($?){Write-Host \"Instance joined to domain successfully. Restarting\"; exit 3010}else{Write-Host \"Instance failed to join domain with error:\" $domainjoinerror; exit 1 }"
                   ]
               }
           }
       ]
   }
   ```

1. Tools for Windows PowerShell で次のコマンドを実行して、新しい SSM ドキュメントを作成します。

   ```
   $json = Get-Content C:\temp\JoinInstanceToDomain | Out-String
   New-SSMDocument -Name JoinInstanceToDomain -Content $json -DocumentType Command
   ```

1. Tools for Windows PowerShell で次のコマンドを実行して、ノードをドメインに結合します。

   ```
   Send-SSMCommand -InstanceId instance-id -DocumentName JoinInstanceToDomain 
   ```

   コマンドが成功すると、システムは以下のような情報を返します。

   ```
   WARNING: The changes will take effect after you restart the computer EC2ABCD-EXAMPLE.
   Domain join succeeded, restarting
   Computer is part of example.local, exiting
   ```

   コマンドが失敗した場合、システムは以下のような情報を返します。

   ```
   Failed to join domain with error:
   Computer 'EC2ABCD-EXAMPLE' failed to join domain 'example.local'
   from its current workgroup 'WORKGROUP' with following error message:
   The specified domain either does not exist or could not be contacted.
   ```