EC2 の AMI では、SQL Server インストール済みのイメージが提供されています。
SQL Server のコンピューター名を変更する場合、SQL Server 側の設定も変更する必要があるのですが、EC2 ではどのように設定をしているか調べてみました。
SQL Server のコンピューター名の変更ですが、EC2Config サービスを使用した Windows インスタンスの設定 を使用しているようです。
下の画像は、EC2Config の設定内容となりますが、「Scripts\PostSysprep.cmd」が設定されていることが確認できます。
それでは「C:\Program Files\Amazon\Ec2ConfigService\Scripts\PostSysprep.cmd」の内容を確認してみます。
@REM This setting can affect resource utilization upon start and customers can manually enable for their use case. @REM reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v AUOptions /t REG_DWORD /d 2 /f @REM Restart the update service to stop any inflight downloads @REM User "net start" and "stop" b/c they are synchronous net stop wuauserv net start wuauserv @REM Sets local Admin user password to not expire WMIC USERACCOUNT WHERE "Name='Administrator'" SET PasswordExpires=FALSE @REM *************** @REM Sets the MSSQLServer machine name (if installed) so that the name will be in sync @REM If server is renamed at any point after sysprep, this should be run to keep the MSSQLServer name in sync @REM For some configurations, this needs to be performed as the last step -- SQL needs to be restarted for the change to take effect net start MSSQLSERVER SQLCMD -Q "DECLARE @InternalInstanceName sysname; DECLARE @MachineInstanceName sysname; SELECT @InternalInstanceName = @@SERVERNAME, @MachineInstanceName = CAST(SERVERPROPERTY('MACHINENAME') AS VARCHAR(128)) + COALESCE('\' + CAST(SERVERPROPERTY('INSTANCENAME') AS VARCHAR(128)), '');IF @InternalInstanceName <> @MachineInstanceName BEGIN EXEC sp_dropserver @InternalInstanceName; EXEC sp_addserver @MachineInstanceName, 'LOCAL'; END" net stop MSSQLSERVER /Y && net start MSSQLSERVER && net start SQLSERVERAGENT
コンピューター名と SQL Server が認識しているコンピューター名が異なっている場合は、ストアドプロシージャを実行して、SQL Server が認識しているコンピューター名を変更しているのが確認できますね。
これは、Sysprep 実行時の「C:\Windows\Setup\Scripts\SetupComplete.cmd」でも実現することができ、上記のスクリプトの中で、コンピューター名変更の個所を「SetupComplete.cmd」に設定することで、Sysprep 実行後にコンピューター名の変更を実行することができます。
@REM *************** @REM Sets the MSSQLServer machine name (if installed) so that the name will be in sync @REM If server is renamed at any point after sysprep, this should be run to keep the MSSQLServer name in sync @REM For some configurations, this needs to be performed as the last step -- SQL needs to be restarted for the change to take effect net start MSSQLSERVER SQLCMD -Q "DECLARE @InternalInstanceName sysname;DECLARE @MachineInstanceName sysname;SELECT @InternalInstanceName = @@SERVERNAME, @MachineInstanceName = CAST(SERVERPROPERTY('MACHINENAME') AS VARCHAR(128)) + COALESCE('\' + CAST(SERVERPROPERTY('INSTANCENAME') AS VARCHAR(128)), '');IF @InternalInstanceName <> @MachineInstanceName BEGIN EXEC sp_dropserver @InternalInstanceName; EXEC sp_addserver @MachineInstanceName, 'LOCAL'; END" net stop MSSQLSERVER /Y && net start MSSQLSERVER && net start SQLSERVERAGENT