amazon-chroot.html.markdown 9.81 KB
Newer Older
1
---
Chris Bednarski's avatar
Chris Bednarski committed
2 3 4 5 6 7 8 9
description: |
    The `amazon-chroot` Packer builder is able to create Amazon AMIs backed by an
    EBS volume as the root device. For more information on the difference between
    instance storage and EBS-backed instances, storage for the root device section
    in the EC2 documentation.
layout: docs
page_title: 'Amazon AMI Builder (chroot)'
...
10 11 12 13 14

# AMI Builder (chroot)

Type: `amazon-chroot`

Chris Bednarski's avatar
Chris Bednarski committed
15 16 17 18 19
The `amazon-chroot` Packer builder is able to create Amazon AMIs backed by an
EBS volume as the root device. For more information on the difference between
instance storage and EBS-backed instances, see the ["storage for the root
device" section in the EC2
documentation](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ComponentsAMIs.html#storage-for-the-root-device).
20

Chris Bednarski's avatar
Chris Bednarski committed
21 22 23 24
The difference between this builder and the `amazon-ebs` builder is that this
builder is able to build an EBS-backed AMI without launching a new EC2 instance.
This can dramatically speed up AMI builds for organizations who need the extra
fast build.
25

Chris Bednarski's avatar
Chris Bednarski committed
26 27 28
\~> **This is an advanced builder** If you're just getting started with
Packer, we recommend starting with the [amazon-ebs
builder](/docs/builders/amazon-ebs.html), which is much easier to use.
29

Chris Bednarski's avatar
Chris Bednarski committed
30 31
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.
32 33 34

## How Does it Work?

Chris Bednarski's avatar
Chris Bednarski committed
35 36 37 38 39
This builder works by creating a new EBS volume from an existing source AMI and
attaching it into an already-running EC2 instance. Once attached, a
[chroot](http://en.wikipedia.org/wiki/Chroot) is used to provision the system
within that volume. After provisioning, the volume is detached, snapshotted, and
an AMI is made.
40

Chris Bednarski's avatar
Chris Bednarski committed
41 42
Using this process, minutes can be shaved off the AMI creation process because a
new EC2 instance doesn't need to be launched.
43

Chris Bednarski's avatar
Chris Bednarski committed
44 45 46 47 48 49
There are some restrictions, however. The host EC2 instance where the volume is
attached to must be a similar system (generally the same OS version, kernel
versions, etc.) as the AMI being built. Additionally, this process is much more
expensive because the EC2 instance must be kept running persistently in order to
build AMIs, whereas the other AMI builders start instances on-demand to build
AMIs as needed.
50 51 52 53 54 55 56

## Configuration Reference

There are many configuration options available for the builder. They are
segmented below into two categories: required and optional parameters. Within
each category, the available configuration keys are alphabetized.

57
In addition to the options listed here, a
Chris Bednarski's avatar
Chris Bednarski committed
58 59
[communicator](/docs/templates/communicator.html) can be configured for this
builder.
60

61
### Required:
62

Chris Bednarski's avatar
Chris Bednarski committed
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
-   `access_key` (string) - The access key used to communicate with AWS. If not
    specified, Packer will use the key from any
    [credentials](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-config-files)
    file or fall back to environment variables `AWS_ACCESS_KEY_ID` or
    `AWS_ACCESS_KEY` (in that order), if set. If the environmental variables
    aren't set and Packer is running on an EC2 instance, Packer will check the
    instance metadata for IAM role keys.

-   `ami_name` (string) - The name of the resulting AMI that will appear when
    managing AMIs in the AWS console or via APIs. This must be unique. To help
    make this unique, use a function like `timestamp` (see [configuration
    templates](/docs/templates/configuration-templates.html) for more info)

-   `secret_key` (string) - The secret key used to communicate with AWS. If not
    specified, Packer will use the secret from any
    [credentials](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-config-files)
    file or fall back to environment variables `AWS_SECRET_ACCESS_KEY` or
    `AWS_SECRET_KEY` (in that order), if set. If the environmental variables
    aren't set and Packer is running on an EC2 instance, Packer will check the
    instance metadata for IAM role keys.

-   `source_ami` (string) - The source AMI whose root volume will be copied and
    provisioned on the currently running instance. This must be an EBS-backed
    AMI with a root volume snapshot that you have access to.
87

88
### Optional:
89

Chris Bednarski's avatar
Chris Bednarski committed
90 91
-   `ami_description` (string) - The description to set for the
    resulting AMI(s). By default this description is empty.
92

Chris Bednarski's avatar
Chris Bednarski committed
93 94 95
-   `ami_groups` (array of strings) - A list of groups that have access to
    launch the resulting AMI(s). By default no groups have permission to launch
    the AMI. `all` will make the AMI publicly accessible.
96

Chris Bednarski's avatar
Chris Bednarski committed
97 98 99
-   `ami_product_codes` (array of strings) - A list of product codes to
    associate with the AMI. By default no product codes are associated with
    the AMI.
100

Chris Bednarski's avatar
Chris Bednarski committed
101 102 103
-   `ami_regions` (array of strings) - A list of regions to copy the AMI to.
    Tags and attributes are copied along with the AMI. AMI copying takes time
    depending on the size of the AMI, but will generally take many minutes.
104

Chris Bednarski's avatar
Chris Bednarski committed
105 106 107
-   `ami_users` (array of strings) - A list of account IDs that have access to
    launch the resulting AMI(s). By default no additional users other than the
    user creating the AMI has permissions to launch it.
108

Chris Bednarski's avatar
Chris Bednarski committed
109 110 111
-   `ami_virtualization_type` (string) - The type of virtualization for the AMI
    you are building. This option is required to register HVM images. Can be
    "paravirtual" (default) or "hvm".
112

Chris Bednarski's avatar
Chris Bednarski committed
113 114 115 116 117
-   `chroot_mounts` (array of array of strings) - This is a list of additional
    devices to mount into the chroot environment. This configuration parameter
    requires some additional documentation which is in the "Chroot Mounts"
    section below. Please read that section for more information on how to
    use this.
118

Chris Bednarski's avatar
Chris Bednarski committed
119 120 121 122 123
-   `command_wrapper` (string) - How to run shell commands. This defaults
    to "{{.Command}}". This may be useful to set if you want to set
    environmental variables or perhaps run it with `sudo` or so on. This is a
    configuration template where the `.Command` variable is replaced with the
    command to be run.
124

Chris Bednarski's avatar
Chris Bednarski committed
125 126 127
-   `copy_files` (array of strings) - Paths to files on the running EC2 instance
    that will be copied into the chroot environment prior to provisioning. This
    is useful, for example, to copy `/etc/resolv.conf` so that DNS lookups work.
128

Chris Bednarski's avatar
Chris Bednarski committed
129 130 131
-   `device_path` (string) - The path to the device where the root volume of the
    source AMI will be attached. This defaults to "" (empty string), which
    forces Packer to find an open device automatically.
132

Chris Bednarski's avatar
Chris Bednarski committed
133 134 135
-   `enhanced_networking` (boolean) - Enable enhanced
    networking (SriovNetSupport) on HVM-compatible AMIs. If true, add
    `ec2:ModifyInstanceAttribute` to your AWS IAM policy.
136

Chris Bednarski's avatar
Chris Bednarski committed
137 138
-   `force_deregister` (boolean) - Force Packer to first deregister an existing
    AMI if one with the same name already exists. Default `false`.
Clint Shryock's avatar
Clint Shryock committed
139

Chris Bednarski's avatar
Chris Bednarski committed
140 141 142 143 144
-   `mount_path` (string) - The path where the volume will be mounted. This is
    where the chroot environment will be. This defaults to
    `packer-amazon-chroot-volumes/{{.Device}}`. This is a configuration template
    where the `.Device` variable is replaced with the name of the device where
    the volume is attached.
145

Chris Bednarski's avatar
Chris Bednarski committed
146 147 148 149 150 151
-   `mount_options` (array of strings) - Options to supply the `mount` command
    when mounting devices. Each option will be prefixed with `-o` and supplied
    to the `mount` command ran by Packer. Because this command is ran in a
    shell, user discrestion is advised. See [this manual page for the mount
    command](http://linuxcommand.org/man_pages/mount8.html) for valid file
    system specific options
152

Chris Bednarski's avatar
Chris Bednarski committed
153 154
-   `root_volume_size` (integer) - The size of the root volume for the chroot
    environment, and the resulting AMI
155

Chris Bednarski's avatar
Chris Bednarski committed
156
-   `tags` (object of key/value strings) - Tags applied to the AMI.
157

158 159 160 161
## Basic Example

Here is a basic example. It is completely valid except for the access keys:

Chris Bednarski's avatar
Chris Bednarski committed
162
``` {.javascript}
163 164 165 166 167
{
  "type": "amazon-chroot",
  "access_key": "YOUR KEY HERE",
  "secret_key": "YOUR SECRET KEY HERE",
  "source_ami": "ami-e81d5881",
168
  "ami_name": "packer-amazon-chroot {{timestamp}}"
169
}
170
```
171 172 173

## Chroot Mounts

Chris Bednarski's avatar
Chris Bednarski committed
174 175 176
The `chroot_mounts` configuration can be used to mount additional devices within
the chroot. By default, the following additional mounts are added into the
chroot by Packer:
177

Chris Bednarski's avatar
Chris Bednarski committed
178 179 180 181 182
-   `/proc` (proc)
-   `/sys` (sysfs)
-   `/dev` (bind to real `/dev`)
-   `/dev/pts` (devpts)
-   `/proc/sys/fs/binfmt_misc` (binfmt\_misc)
183

Chris Bednarski's avatar
Chris Bednarski committed
184 185 186
These default mounts are usually good enough for anyone and are sane defaults.
However, if you want to change or add the mount points, you may using the
`chroot_mounts` configuration. Here is an example configuration:
187

Chris Bednarski's avatar
Chris Bednarski committed
188
``` {.javascript}
189 190 191 192 193 194
{
  "chroot_mounts": [
    ["proc", "proc", "/proc"],
    ["bind", "/dev", "/dev"]
  ]
}
195
```
196

Chris Bednarski's avatar
Chris Bednarski committed
197 198
`chroot_mounts` is a list of a 3-tuples of strings. The three components of the
3-tuple, in order, are:
199

Chris Bednarski's avatar
Chris Bednarski committed
200 201
-   The filesystem type. If this is "bind", then Packer will properly bind the
    filesystem to another mount point.
202

Chris Bednarski's avatar
Chris Bednarski committed
203
-   The source device.
204

Chris Bednarski's avatar
Chris Bednarski committed
205
-   The mount directory.
206 207 208

## Parallelism

Chris Bednarski's avatar
Chris Bednarski committed
209 210 211 212
A quick note on parallelism: it is perfectly safe to run multiple *separate*
Packer processes with the `amazon-chroot` builder on the same EC2 instance. In
fact, this is recommended as a way to push the most performance out of your AMI
builds.
213

Chris Bednarski's avatar
Chris Bednarski committed
214 215
Packer properly obtains a process lock for the parallelism-sensitive parts of
its internals such as finding an available device.
216

217 218 219 220 221 222
## Gotchas

One of the difficulties with using the chroot builder is that your provisioning
scripts must not leave any processes running or packer will be unable to unmount
the filesystem.

Chris Bednarski's avatar
Chris Bednarski committed
223 224 225 226
For debian based distributions you can setup a
[policy-rc.d](http://people.debian.org/~hmh/invokerc.d-policyrc.d-specification.txt)
file which will prevent packages installed by your provisioners from starting
services:
227

Chris Bednarski's avatar
Chris Bednarski committed
228
``` {.javascript}
229 230 231 232 233 234 235 236
{
  "type": "shell",
  "inline": [
    "echo '#!/bin/sh' > /usr/sbin/policy-rc.d",
    "echo 'exit 101' >> /usr/sbin/policy-rc.d",
    "chmod a+x /usr/sbin/policy-rc.d"
  ]
},
237 238 239

// ...

240 241 242 243 244 245
{
  "type": "shell",
  "inline": [
    "rm -f /usr/sbin/policy-rc.d"
  ]
}
246
```