2013-12-08 18:02:03 -05:00
---
2017-06-14 21:04:16 -04:00
description: |
2020-03-18 18:46:47 -04:00
The googlecompute Packer builder is able to create images for use with Google
Cloud Compute Engine (GCE) based on existing images.
2015-07-28 18:30:32 -04:00
layout: docs
2020-03-18 18:46:47 -04:00
page_title: Google Compute - Builders
2020-04-02 19:39:47 -04:00
sidebar_title: Google Cloud
2017-03-25 18:13:52 -04:00
---
2013-12-08 18:02:03 -05:00
# Google Compute Builder
Type: `googlecompute`
2015-07-28 18:30:32 -04:00
The `googlecompute` Packer builder is able to create
2018-10-26 20:02:51 -04:00
[images](https://developers.google.com/compute/docs/images) for use with
[Google Compute Engine](https://cloud.google.com/products/compute-engine) (GCE)
based on existing images.
It is possible to build images from scratch, but not with the `googlecompute`
Packer builder. The process is recommended only for advanced users, please see
2019-01-25 15:32:44 -05:00
[Building GCE Images from Scratch](https://cloud.google.com/compute/docs/tutorials/building-images)
2019-01-11 17:06:15 -05:00
and the [Google Compute Import
2020-03-31 17:40:07 -04:00
Post-Processor](/docs/post-processors/googlecompute-import) for more
2018-10-26 20:02:51 -04:00
information.
2017-06-14 21:04:16 -04:00
2014-09-05 12:49:40 -04:00
## Authentication
2013-12-12 22:59:29 -05:00
2018-10-26 20:02:51 -04:00
Authenticating with Google Cloud services requires at most one JSON file,
2020-03-18 18:46:47 -04:00
called the _account file_. The _account file_ is **not** required if you are
2018-10-26 20:02:51 -04:00
running the `googlecompute` Packer builder from a GCE instance with a
2015-07-28 18:30:32 -04:00
properly-configured [Compute Engine Service
Account](https://cloud.google.com/compute/docs/authentication).
2013-12-12 22:59:29 -05:00
2014-11-17 13:06:22 -05:00
### Running With a Compute Engine Service Account
2015-07-28 18:30:32 -04:00
If you run the `googlecompute` Packer builder from a GCE instance, you can
configure that instance to use a [Compute Engine Service
Account](https://cloud.google.com/compute/docs/authentication). This will allow
Packer to authenticate to Google Cloud without having to bake in a separate
credential/authentication file.
To create a GCE instance that uses a service account, provide the required
scopes when launching the instance.
2014-11-17 13:06:22 -05:00
For `gcloud`, do this via the `--scopes` parameter:
2020-05-29 17:12:05 -04:00
```shell-session
2020-01-27 09:53:17 -05:00
$ gcloud compute instances create INSTANCE-NAME \
--project YOUR_GCP_PROJECT \
--image-family ubuntu-1804-lts \
--image-project gce-uefi-images \
--network YOUR_GCP_NETWORK \
--zone YOUR_GCP_ZONE \
--scopes "https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/devstorage.full_control"
2014-11-17 13:06:22 -05:00
```
For the [Google Developers Console](https://console.developers.google.com):
2017-06-14 21:04:16 -04:00
1. Choose "Show advanced options"
2. Tick "Enable Compute Engine service account"
3. Choose "Read Write" for Compute
2019-04-09 21:47:50 -04:00
4. Choose "Full" for "Storage"
2014-11-17 13:06:22 -05:00
**The service account will be used automatically by Packer as long as there is
2020-03-18 18:46:47 -04:00
no _account file_ specified in the Packer configuration file.**
2014-11-17 13:06:22 -05:00
### Running Without a Compute Engine Service Account
2015-07-28 18:30:32 -04:00
The [Google Developers Console](https://console.developers.google.com) allows
you to create and download a credential file that will let you use the
`googlecompute` Packer builder anywhere. To make the process more
straightforwarded, it is documented here.
2013-12-12 22:59:29 -05:00
2017-06-14 21:04:16 -04:00
1. Log into the [Google Developers
2015-07-28 18:30:32 -04:00
Console](https://console.developers.google.com) and select a project.
2013-12-12 22:59:29 -05:00
2017-06-17 00:41:18 -04:00
2. Under the "API Manager" section, click "Credentials."
2013-12-12 22:59:29 -05:00
2017-06-17 00:41:18 -04:00
3. Click the "Create credentials" button, select "Service account key"
2013-12-13 00:52:25 -05:00
2018-10-26 20:02:51 -04:00
4. Create a new service account that at least has
`Compute Engine Instance Admin (v1)` and `Service Account User` roles.
2017-06-17 00:41:18 -04:00
2018-10-26 20:02:51 -04:00
5. Choose `JSON` as the Key type and click "Create". A JSON file will be
2020-03-18 18:46:47 -04:00
downloaded automatically. This is your _account file_.
2013-12-08 18:02:03 -05:00
2016-08-26 21:12:55 -04:00
### Precedence of Authentication Methods
2018-10-18 19:09:49 -04:00
Packer looks for credentials in the following places, preferring the first
location found:
2016-08-26 21:12:55 -04:00
2018-10-10 14:16:13 -04:00
1. An `account_file` option in your packer file.
2017-03-25 18:13:52 -04:00
2018-10-18 19:09:49 -04:00
2. A JSON file (Service Account) whose path is specified by the
2018-10-26 20:02:51 -04:00
`GOOGLE_APPLICATION_CREDENTIALS` environment variable.
2017-03-25 18:13:52 -04:00
2018-10-18 19:09:49 -04:00
3. A JSON file in a location known to the `gcloud` command-line tool.
2018-11-08 05:41:15 -05:00
(`gcloud auth application-default login` creates it)
2016-08-26 21:12:55 -04:00
2017-03-25 18:13:52 -04:00
On Windows, this is:
2016-08-26 21:12:55 -04:00
2017-06-14 21:04:16 -04:00
%APPDATA%/gcloud/application_default_credentials.json
2016-08-26 21:12:55 -04:00
2017-03-25 18:13:52 -04:00
On other systems:
2016-08-26 21:12:55 -04:00
2017-06-14 21:04:16 -04:00
$HOME/.config/gcloud/application_default_credentials.json
2016-08-26 21:12:55 -04:00
2018-10-18 19:09:49 -04:00
4. On Google Compute Engine and Google App Engine Managed VMs, it fetches
2018-10-26 20:02:51 -04:00
credentials from the metadata server. (Needs a correct VM authentication
scope configuration, see above.)
2016-08-26 21:12:55 -04:00
2018-02-03 16:56:29 -05:00
## Examples
### Basic Example
2013-12-08 18:02:03 -05:00
2018-10-10 14:16:13 -04:00
Below is a fully functioning example. It doesn't do anything useful since no
2016-05-24 20:13:36 -04:00
provisioners or startup-script metadata are defined, but it will effectively
2020-03-18 18:46:47 -04:00
repackage an existing GCE image. The account_file is obtained in the previous
2018-10-26 20:02:51 -04:00
section. If it parses as JSON it is assumed to be the file itself, otherwise,
it is assumed to be the path to the file containing the JSON.
2013-12-08 18:02:03 -05:00
2020-06-16 11:08:03 -04:00
<Tabs>
<Tab heading="JSON">
2020-03-12 10:05:08 -04:00
```json
2013-12-08 18:02:03 -05:00
{
2017-03-25 18:13:52 -04:00
"builders": [
{
"type": "googlecompute",
"account_file": "account.json",
"project_id": "my project",
"source_image": "debian-7-wheezy-v20150127",
2018-02-03 16:32:10 -05:00
"ssh_username": "packer",
2017-03-25 18:13:52 -04:00
"zone": "us-central1-a"
}
]
2013-12-08 18:02:03 -05:00
}
2014-10-20 13:55:16 -04:00
```
2013-12-08 18:02:03 -05:00
2020-06-16 11:08:03 -04:00
</Tab>
<Tab heading="HCL2">
```hcl
source "googlecompute" "basic-example" {
account_file = "account.json"
project_id = "my project"
source_image = "debian-7-wheezy-v20150127"
ssh_username = "packer"
zone = "us-central1-a"
}
build {
sources = ["sources.googlecompute.basic-example"]
}
```
</Tab>
</Tabs>
2017-03-28 11:27:57 -04:00
### Windows Example
2018-10-26 20:02:51 -04:00
Before you can provision using the winrm communicator, you need to allow
traffic through google's firewall on the winrm port (tcp:5986). You can do so
using the gcloud command.
gcloud compute firewall-rules create allow-winrm --allow tcp:5986
2020-03-24 20:10:25 -04:00
Or alternatively by navigating to [https://console.cloud.google.com/networking/firewalls/list](https://console.cloud.google.com/networking/firewalls/list).
2018-04-23 17:52:00 -04:00
Once this is set up, the following is a complete working packer config after
setting a valid `account_file` and `project_id`:
2017-03-28 11:27:57 -04:00
2020-03-12 10:05:08 -04:00
```json
2017-03-28 11:27:57 -04:00
{
2018-02-03 16:56:29 -05:00
"builders": [
{
"type": "googlecompute",
"account_file": "account.json",
"project_id": "my project",
"source_image": "windows-server-2016-dc-v20170227",
"disk_size": "50",
"machine_type": "n1-standard-1",
"communicator": "winrm",
"winrm_username": "packer_user",
"winrm_insecure": true,
"winrm_use_ssl": true,
"metadata": {
"windows-startup-script-cmd": "winrm quickconfig -quiet & net user /add packer_user & net localgroup administrators packer_user /add & winrm set winrm/config/service/auth @{Basic=\"true\"}"
},
"zone": "us-central1-a"
}
]
}
```
2018-10-26 20:02:51 -04:00
2019-04-19 20:03:20 -04:00
-> **Warning:** Please note that if you're setting up WinRM for provisioning, you'll probably want to turn it off or restrict its permissions as part of a shutdown script at the end of Packer's provisioning process. For more details on the why/how, check out this useful blog post and the associated code:
2019-06-03 23:17:46 -04:00
https://cloudywindows.io/post/winrm-for-provisioning-close-the-door-on-the-way-out-eh/
2019-04-19 20:03:20 -04:00
2018-08-17 06:41:37 -04:00
This build can take up to 15 min.
2018-02-03 16:56:29 -05:00
### Nested Hypervisor Example
2018-10-26 20:02:51 -04:00
This is an example of using the `image_licenses` configuration option to create
a GCE image that has nested virtualization enabled. See [Enabling Nested
Virtualization for VM
Instances](https://cloud.google.com/compute/docs/instances/enable-nested-virtualization-vm-instances)
2018-02-03 16:56:29 -05:00
for details.
2020-03-12 10:05:08 -04:00
```json
2018-02-03 16:56:29 -05:00
{
"builders": [
{
"type": "googlecompute",
"account_file": "account.json",
"project_id": "my project",
"source_image_family": "centos-7",
"ssh_username": "packer",
"zone": "us-central1-a",
"image_licenses": ["projects/vm-options/global/licenses/enable-vmx"]
}
]
2017-03-28 11:27:57 -04:00
}
```
2013-12-08 18:02:03 -05:00
## Configuration Reference
2015-07-28 18:30:32 -04:00
Configuration options are organized below into two categories: required and
optional. Within each category, the available options are alphabetized and
described.
2013-12-08 18:02:03 -05:00
2015-06-23 17:44:57 -04:00
In addition to the options listed here, a
2020-03-31 17:40:07 -04:00
[communicator](/docs/templates/communicator) can be configured for this
2015-07-28 18:30:32 -04:00
builder.
2015-06-23 17:44:57 -04:00
2014-05-04 13:47:40 -04:00
### Required:
2013-12-08 18:02:03 -05:00
2020-03-23 20:02:12 -04:00
@include 'builder/googlecompute/Config-required.mdx'
2013-12-08 18:02:03 -05:00
2014-05-04 13:47:40 -04:00
### Optional:
2013-12-08 18:02:03 -05:00
2020-03-23 20:02:12 -04:00
@include 'builder/googlecompute/Config-not-required.mdx'
2016-10-22 15:06:07 -04:00
2020-04-14 13:28:07 -04:00
@include 'builder/googlecompute/IAPConfig-not-required.mdx'
2016-05-24 20:13:36 -04:00
## Startup Scripts
2018-10-26 20:02:51 -04:00
Startup scripts can be a powerful tool for configuring the instance from which
the image is made. The builder will wait for a startup script to terminate. A
startup script can be provided via the `startup_script_file` or
`startup-script` instance creation `metadata` field. Therefore, the build time
will vary depending on the duration of the startup script. If
`startup_script_file` is set, the `startup-script` `metadata` field will be
overwritten. In other words, `startup_script_file` takes precedence.
2016-05-24 20:13:36 -04:00
2018-10-26 20:02:51 -04:00
The builder does not check for a pass/fail/error signal from the startup
script, at this time. Until such support is implemented, startup scripts should
be robust, as an image will still be built even when a startup script fails.
2016-05-24 20:13:36 -04:00
### Windows
2017-03-28 11:27:57 -04:00
2018-10-26 20:02:51 -04:00
A Windows startup script can only be provided via the
`windows-startup-script-cmd` instance creation `metadata` field. The builder
2020-03-18 18:46:47 -04:00
will _not_ wait for a Windows startup script to terminate. You have to ensure
2018-10-26 20:02:51 -04:00
that it finishes before the instance shuts down.
2016-05-24 20:13:36 -04:00
### Logging
2017-06-14 21:04:16 -04:00
2018-10-26 20:02:51 -04:00
Startup script logs can be copied to a Google Cloud Storage (GCS) location
specified via the `startup-script-log-dest` instance creation `metadata` field.
The GCS location must be writeable by the credentials provided in the builder
config's `account_file`.
2015-07-27 22:32:21 -04:00
2013-12-08 18:02:03 -05:00
## Gotchas
2018-10-26 20:02:51 -04:00
CentOS and recent Debian images have root ssh access disabled by default. Set
`ssh_username` to any user, which will be created by packer with sudo access.
2013-12-08 18:02:03 -05:00
2015-07-28 18:30:32 -04:00
The machine type must have a scratch disk, which means you can't use an
`f1-micro` or `g1-small` to build images.