PackerでWindowsServerのAMIをつくってみます。 これが考えられる最小構成だと思います。 これに肉付けすることでカスタムAMIを作成することができると思います。
環境
- Packer v1.1.3
- Packerが動いているサーバ : Amazon Linux 2
- PackerがつくるWindowsServerのAMI : Microsoft Windows Server 2016 Base
概要
Packerを利用してWindowsServer 2016のAMIを作成します。
もととなるAMIとして使ったのはAWSが提供しているMicrosoft Windows Server 2016 Baseです。
うごきとしては以下のような感じです。
- PackerがWindows Server 2016 Baseのインスタンスを作成/起動
- WinRMで接続してEC2Launchを実行
- AMI作成
- インスタンス削除
WinRMで接続して~のところでいろいろやるように肉付けするとお好みのカスタムAMIを作成することができます。
実際にやってみる
実行コマンド
$ packer build ./template.json
実行ログ
amazon-ebs output will be in this color. ==> amazon-ebs: Prevalidating AMI Name: kabegiwa-test-windows-server amazon-ebs: Found Image ID: ami-157fe573 ==> amazon-ebs: Creating temporary keypair: packer_5a6ac1d4-c926-1c2c-fb7e-f0cf78d180cb ==> amazon-ebs: Creating temporary security group for this instance: packer_5a6ac1d8-b367-106b-ea1b-bd7f142b710a ==> amazon-ebs: Authorizing access to port 5985 from 0.0.0.0/0 in the temporary security group... ==> amazon-ebs: Launching a source AWS instance... ==> amazon-ebs: Adding tags to source instance amazon-ebs: Adding tag: "Name": "Packer Builder" amazon-ebs: Instance ID: i-02c873d6d7833d311 ==> amazon-ebs: Waiting for instance (i-02c873d6d7833d311) to become ready... ==> amazon-ebs: Waiting for auto-generated password for instance... amazon-ebs: It is normal for this process to take up to 15 minutes, amazon-ebs: but it usually takes around 5. Please wait. amazon-ebs: amazon-ebs: Password retrieved! ==> amazon-ebs: Waiting for WinRM to become available... amazon-ebs: WinRM connected. amazon-ebs: #< CLIXML amazon-ebs: <Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04"><Obj S="progress" RefId="0"><TN RefId="0"><T>System.Management.Automation.PSCustomObject</T><T>System.Object</T></TN><MS><I64 N="SourceId">1</I64><PR N="Record"><AV>Preparing modules for first use.</AV><AI>0</AI><Nil /><PI>-1</PI><PC>-1</PC><T>Completed</T><SR>-1</SR><SD> </SD></PR></MS></Obj><Obj S="progress" RefId="1"><TNRef RefId="0" /><MS><I64 N="SourceId">1</I64><PR N="Record"><AV>Preparing modules for first use.</AV><AI>0</AI><Nil /><PI>-1</PI><PC>-1</PC><T>Completed</T><SR>-1</SR><SD> </SD></PR></MS></Obj></Objs> ==> amazon-ebs: Connected to WinRM! ==> amazon-ebs: Provisioning with Powershell... ==> amazon-ebs: Provisioning with powershell script: /tmp/packer-powershell-provisioner631511055 amazon-ebs: amazon-ebs: TaskPath TaskName State amazon-ebs: -------- -------- ----- amazon-ebs: \ Amazon Ec2 Launch - Instance I... Ready ==> amazon-ebs: Stopping the source instance... amazon-ebs: Stopping instance, attempt 1 ==> amazon-ebs: Waiting for the instance to stop... ==> amazon-ebs: Creating the AMI: kabegiwa-test-windows-server amazon-ebs: AMI: ami-xxxxxxxx ==> amazon-ebs: Waiting for AMI to become ready... ==> amazon-ebs: Terminating the source AWS instance... ==> amazon-ebs: Cleaning up any extra volumes... ==> amazon-ebs: Deleting temporary security group... ==> amazon-ebs: Deleting temporary keypair... Build 'amazon-ebs' finished. ==> Builds finished. The artifacts of successful builds are: --> amazon-ebs: AMIs were created: ap-northeast-1: ami-xxxxxxxx {/code} ** template.json {code} { "builders": [{ "type": "amazon-ebs", "region": "ap-northeast-1", "source_ami": "ami-157fe573", "instance_type": "m4.medium", "ami_name": "kabegiwa-test-windows-server", "user_data_file": "{{template_dir}}/setup_winrm.txt", "communicator": "winrm", "winrm_username": "Administrator" }], "provisioners": [ { "type": "powershell", "inline": [ "C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\InitializeInstance.ps1 -Schedule", "C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\SysprepInstance.ps1 -NoShutdown" ] } ] } {/code} ** setup_winrm.txt {code} <powershell> winrm quickconfig -q winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="300"}' winrm set winrm/config '@{MaxTimeoutms="1800000"}' winrm set winrm/config/service '@{AllowUnencrypted="true"}' winrm set winrm/config/service/auth '@{Basic="true"}' netsh advfirewall firewall add rule name="WinRM 5985" protocol=TCP dir=in localport=5985 action=allow netsh advfirewall firewall add rule name="WinRM 5986" protocol=TCP dir=in localport=5986 action=allow net stop winrm sc config winrm start=auto net start winrm Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope LocalMachine </powershell>
結果確認
実行ログを見るとami-xxxxxxxxというAMIが作成されたことがわかります。 それをもとにインスタンスを作成します。
インスタンス作成
$ aws ec2 run-instances \ --image-id ami-xxxxxxxx \ --subnet-id subnet-yyyyyyyy \ --security-group-ids sg-12345678 sg-abcdefgh \ --count 1 \ --instance-type t2.micro \ --key-name himitsu-key \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=kabegiwa-test}]'
インスタンス起動確認
$ aws ec2 describe-instances --instance-id i-abcdefghijklmnop --query 'Reservations[] .Instances[].State.Name' [ "running" ]
おわりに
無事にWindows ServerのAMIを作成、インスタンスを起動することができました!
継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化
- 作者: Jez Humble,David Farley,和智右桂,高木正弘
- 出版社/メーカー: KADOKAWA
- 発売日: 2017/07/31
- メディア: 単行本
- この商品を含むブログを見る