tl;dr

Windows Server の初期設定を出来るだけワンタッチ(スクリプト一発とか)で行う方法を試行錯誤していて、ついでに Packer で AMI も作ってみようと思って試したメモ。

あくまでもメモ。

教材

Contribute to sample-packer-windows development by creating an account on GitHub.

github.com

memo

作成される AMI の概要

  • Python をインストールする(msi パッケージのインストール試した)
  • pyWin32 インストール(exe パッケージのインストールを試した)
  • Ansible で構成管理出来るように設定(PowerShell スクリプトの実行を試した)

インスタンス起動時に指定するユーザーデータ

  • タイムゾーンを JST に変更
  • ネットワークプロファイルを Public から Private に変更

tzutil.exe /s "Tokyo Standard Time"
Set-NetConnectionProfile -NetworkCategory Private

出来た AMI を Serverspec でテスト

% tree spec
spec
├── common
│   └── common_spec.rb
└── spec_helper.rb

1 directory, 2 files

tips

  • msi パッケージのインストール完了を待つ場合
Start-Process "C:download_filespython-2.7.11.amd64.msi" /quiet -Wait

Start-Process コマンドレットを使って -Wait オプションを利用する。

  • Administrator のパスワードをリセットする
    "provisioners": [
        {
            "type": "powershell",
            "inline": [
                "C:\PROGRA~1\Amazon\Ec2ConfigService\Ec2Config.exe -sysprep"
            ]
        }
    ]

上記のように Packer の Provisioner において Ec2Config を -sysprep オプション付きで実行する。詳細は以下のドキュメントが詳しい。

EC2Config サービスを使用して Windows インスタンスを設定し、高度な機能を利用 ...

docs.aws.amazon.com

Sysprep を使って標準の Amazon マシンイメージを作成する。

docs.aws.amazon.com

  • その他
  • 今回は AMI に仕込んでおきたい諸々は Userdata にて実行するようにした(PowerShell スクリプトやコマンドプロンプトで書くことが出来る)
  • Packer の Provisioner でも PowerShell やコマンドプロンプトにて書くことが出来る(今回は EC2Config で sysprep する以外で利用していない)
  • ネットワークプロファイルは NIC 作成時点で設定されるようなので AMI に設定を施してもダメ(っぽい)
  • タイムゾーンも同様に AMI に埋め込むよりインスタンス起動時に userdata で指定した

参考

以上

  • Packer 奥深い
  • Windows も頑張れば GUI にアクセスすることなく構築、運用は出来そう
  • 要 PowerShell 力

元記事はこちら

Packer で Windows Server の EC2 AMI を作ってみたメモ