--- description: | The amazon-ebs Packer builder is able to create Amazon AMIs backed by EBS volumes for use in EC2. For more information on the difference between EBS-backed instances and instance-store backed instances, see the storage for the root device section in the EC2 documentation. layout: docs page_title: Amazon EBS - Builders sidebar_title: EBS --- # AMI Builder (EBS backed) Type: `amazon-ebs` The `amazon-ebs` Packer builder is able to create Amazon AMIs backed by EBS volumes for use in [EC2](https://aws.amazon.com/ec2/). For more information on the difference between EBS-backed instances and instance-store backed instances, see the ["storage for the root device" section in the EC2 documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ComponentsAMIs.html#storage-for-the-root-device). This builder builds an AMI by launching an EC2 instance from a source AMI, provisioning that running machine, and then creating an AMI from that machine. This is all done in your own AWS account. The builder will create temporary keypairs, security group rules, etc. that provide it temporary access to the instance while the image is being created. This simplifies configuration quite a bit. The builder does _not_ manage AMIs. Once it creates an AMI and stores it in your account, it is up to you to use, delete, etc. the AMI. -> **Note:** Temporary resources are, by default, all created with the prefix `packer`. This can be useful if you want to restrict the security groups and key pairs Packer is able to operate on. ## EBS Specific Configuration Reference There are many configuration options available for the builder. In addition to the items listed here, you will want to look at the general configuration references for [AMI](#ami-configuration), [BlockDevices](#block-devices-configuration), [Access](#access-configuration), [Run](#run-configuration) and [Communicator](#communicator-configuration) configuration references, which are necessary for this build to succeed and can be found further down the page. #### Optional: @include 'builder/amazon/ebs/Config-not-required.mdx' ### AMI Configuration #### Required: @include 'builder/amazon/common/AMIConfig-required.mdx' #### Optional: @include 'builder/amazon/common/AMIConfig-not-required.mdx' ### Access Configuration #### Required: @include 'builder/amazon/common/AccessConfig-required.mdx' #### Optional: @include 'builder/amazon/common/AccessConfig-not-required.mdx' ### Run Configuration #### Required: @include 'builder/amazon/common/RunConfig-required.mdx' #### Optional: @include 'builder/amazon/common/RunConfig-not-required.mdx' @include 'builders/aws-session-manager.mdx' ### Block Devices Configuration Block devices can be nested in the [ami_block_device_mappings](#ami_block_device_mappings) or the [launch_block_device_mappings](#launch_block_device_mappings) array. @include 'builder/amazon/common/BlockDevice.mdx' #### Optional: @include 'builder/amazon/common/BlockDevice-not-required.mdx' ### Communicator Configuration #### Optional: @include 'helper/communicator/Config-not-required.mdx' @include 'helper/communicator/SSH-not-required.mdx' ## Basic Example Here is a basic example. You will need to provide access keys, and may need to change the AMI IDs according to what images exist at the time the template is run: ```json { "variables": { "aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}", "aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}" }, "builders": [ { "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "us-east-1", "source_ami": "ami-fce3c696", "instance_type": "t2.micro", "ssh_username": "ubuntu", "ami_name": "packer_AWS {{timestamp}}" } ] } ``` -> **Note:** Packer can also read the access key and secret access key from environmental variables. See the configuration reference in the section above for more information on what environmental variables Packer will look for. Further information on locating AMI IDs and their relationship to instance types and regions can be found in the AWS EC2 Documentation [for Linux](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html) or [for Windows](http://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/finding-an-ami.html). ## Accessing the Instance to Debug If you need to access the instance to debug for some reason, run the builder with the `-debug` flag. In debug mode, the Amazon builder will save the private key in the current directory and will output the DNS or IP information as well. You can use this information to access the instance as it is running. ## AMI Block Device Mappings Example Here is an example using the optional AMI block device mappings. Our configuration of `launch_block_device_mappings` will expand the root volume (`/dev/sda`) to 40gb during the build (up from the default of 8gb). With `ami_block_device_mappings` AWS will attach additional volumes `/dev/sdb` and `/dev/sdc` when we boot a new instance of our AMI. ```json { "type": "amazon-ebs", "access_key": "YOUR KEY HERE", "secret_key": "YOUR SECRET KEY HERE", "region": "us-east-1", "source_ami": "ami-fce3c696", "instance_type": "t2.micro", "ssh_username": "ubuntu", "ami_name": "packer-quick-start {{timestamp}}", "launch_block_device_mappings": [ { "device_name": "/dev/sda1", "volume_size": 40, "volume_type": "gp2", "delete_on_termination": true } ], "ami_block_device_mappings": [ { "device_name": "/dev/sdb", "virtual_name": "ephemeral0" }, { "device_name": "/dev/sdc", "virtual_name": "ephemeral1" } ] } ``` ## Build template data In configuration directives marked as a template engine above, the following variables are available: - `BuildRegion` - The region (for example `eu-central-1`) where Packer is building the AMI. - `SourceAMI` - The source AMI ID (for example `ami-a2412fcd`) used to build the AMI. - `SourceAMIName` - The source AMI Name (for example `ubuntu/images/ebs-ssd/ubuntu-xenial-16.04-amd64-server-20180306`) used to build the AMI. - `SourceAMIOwner` - The source AMI owner ID. - `SourceAMIOwnerName` - The source AMI owner alias/name (for example `amazon`). - `SourceAMITags` - The source AMI Tags, as a `map[string]string` object. ## Build function template engine variables For the build function of [template engine](/docs/templates/engine), the following variables are available: - `SourceAMIName` - The source AMI Name (for example `ubuntu/images/ebs-ssd/ubuntu-xenial-16.04-amd64-server-20180306`) used to build the AMI. ## Tag Example Here is an example using the optional AMI tags. This will add the tags `OS_Version` and `Release` to the finished AMI. As before, you will need to provide your access keys, and may need to change the source AMI ID based on what images exist when this template is run: ```json { "type": "amazon-ebs", "access_key": "YOUR KEY HERE", "secret_key": "YOUR SECRET KEY HERE", "region": "us-east-1", "source_ami": "ami-fce3c696", "instance_type": "t2.micro", "ssh_username": "ubuntu", "ami_name": "packer-quick-start {{timestamp}}", "tags": { "OS_Version": "Ubuntu", "Release": "Latest", "Base_AMI_Name": "{{ .SourceAMIName }}", "Extra": "{{ .SourceAMITags.TagName }}" } } ``` -> **Note:** Packer uses pre-built AMIs as the source for building images. These source AMIs may include volumes that are not flagged to be destroyed on termination of the instance building the new image. Packer will attempt to clean up all residual volumes that are not designated by the user to remain after termination. If you need to preserve those source volumes, you can overwrite the termination setting by specifying `delete_on_termination=false` in the `launch_block_device_mappings` block for the device. ## Connecting to Windows instances using WinRM If you want to launch a Windows instance and connect using WinRM, you will need to configure WinRM on that instance. The following is a basic powershell script that can be supplied to AWS using the "user_data_file" option. It enables WinRM via HTTPS on port 5986, and creates a self-signed certificate to use to connect. If you are using a certificate from a CA, rather than creating a self-signed certificate, you can omit the "winrm_insecure" option mentioned below. autogenerated_password_https_boostrap.txt ``` ps1 # MAKE SURE IN YOUR PACKER CONFIG TO SET: # # # "winrm_username": "Administrator", # "winrm_insecure": true, # "winrm_use_ssl": true, # # write-output "Running User Data Script" write-host "(host) Running User Data Script" Set-ExecutionPolicy Unrestricted -Scope LocalMachine -Force -ErrorAction Ignore # Don't set this before Set-ExecutionPolicy as it throws an error $ErrorActionPreference = "stop" # Remove HTTP listener Remove-Item -Path WSMan:\Localhost\listener\listener* -Recurse # Create a self-signed certificate to let ssl work $Cert = New-SelfSignedCertificate -CertstoreLocation Cert:\LocalMachine\My -DnsName "packer" New-Item -Path WSMan:\LocalHost\Listener -Transport HTTPS -Address * -CertificateThumbPrint $Cert.Thumbprint -Force # WinRM write-output "Setting up WinRM" write-host "(host) setting up WinRM" cmd.exe /c winrm quickconfig -q cmd.exe /c winrm set "winrm/config" '@{MaxTimeoutms="1800000"}' cmd.exe /c winrm set "winrm/config/winrs" '@{MaxMemoryPerShellMB="1024"}' cmd.exe /c winrm set "winrm/config/service" '@{AllowUnencrypted="true"}' cmd.exe /c winrm set "winrm/config/client" '@{AllowUnencrypted="true"}' cmd.exe /c winrm set "winrm/config/service/auth" '@{Basic="true"}' cmd.exe /c winrm set "winrm/config/client/auth" '@{Basic="true"}' cmd.exe /c winrm set "winrm/config/service/auth" '@{CredSSP="true"}' cmd.exe /c winrm set "winrm/config/listener?Address=*+Transport=HTTPS" "@{Port=`"5986`";Hostname=`"packer`";CertificateThumbprint=`"$($Cert.Thumbprint)`"}" cmd.exe /c netsh advfirewall firewall set rule group="remote administration" new enable=yes cmd.exe /c netsh firewall add portopening TCP 5986 "Port 5986" cmd.exe /c net stop winrm cmd.exe /c sc config winrm start= auto cmd.exe /c net start winrm ``` You'll notice that this config does not define a user or password; instead, Packer will ask AWS to provide a random password that it generates automatically. The following config will work with the above template: ``` { "builders": [ { "type": "amazon-ebs", "region": "us-east-1", "instance_type": "t2.micro", "source_ami_filter": { "filters": { "virtualization-type": "hvm", "name": "*Windows_Server-2012*English-64Bit-Base*", "root-device-type": "ebs" }, "most_recent": true, "owners": "amazon" }, "ami_name": "default-packer", "user_data_file": "winrm_bootstrap.txt", "communicator": "winrm", "force_deregister": true, "winrm_insecure": true, "winrm_username": "Administrator", "winrm_use_ssl": true }] } ``` ## Windows 2016 Sysprep Commands - For Amazon Windows AMIs Only For Amazon Windows 2016 AMIs it is necessary to run Sysprep commands which can be easily added to the provisioner section. ```json { "type": "powershell", "inline": [ "C:/ProgramData/Amazon/EC2-Windows/Launch/Scripts/InitializeInstance.ps1 -Schedule", "C:/ProgramData/Amazon/EC2-Windows/Launch/Scripts/SysprepInstance.ps1 -NoShutdown" ] } ``` @include 'builders/aws-ssh-differentiation-table.mdx'