2014-07-23 18:40:15 +02:00
---
layout: "docs"
page_title: "Provisioner: file"
sidebar_current: "docs-provisioners-file"
2014-10-22 05:21:56 +02:00
description: |-
2015-05-08 13:45:31 +02:00
The `file` provisioner is used to copy files or directories from the machine executing Terraform to the newly created resource. The `file` provisioner supports both `ssh` and `winrm` type connections.
2014-07-23 18:40:15 +02:00
---
# File Provisioner
The `file` provisioner is used to copy files or directories from the machine
2015-04-10 21:28:28 +02:00
executing Terraform to the newly created resource. The `file` provisioner
supports both `ssh` and `winrm` type [connections ](/docs/provisioners/connection.html ).
2014-07-23 18:40:15 +02:00
## Example usage
```
resource "aws_instance" "web" {
...
# Copies the myapp.conf file to /etc/myapp.conf
provisioner "file" {
source = "conf/myapp.conf"
destination = "/etc/myapp.conf"
}
# Copies the configs.d folder to /etc/configs.d
provisioner "file" {
source = "conf/configs.d"
destination = "/etc"
}
2015-04-10 21:28:28 +02:00
# Copies all files and folders in apps/app1 to D:/IIS/webapp1
provisioner "file" {
source = "apps/app1/"
destination = "D:/IIS/webapp1"
}
2014-07-23 18:40:15 +02:00
}
```
## Argument Reference
2014-07-29 08:51:24 +02:00
The following arguments are supported:
2014-07-23 18:40:15 +02:00
* `source` - (Required) This is the source file or folder. It can be specified as relative
to the current working directory or as an absolute path.
* `destination` - (Required) This is the destination path. It must be specified as an
absolute path.
## Directory Uploads
The file provisioner is also able to upload a complete directory to the remote machine.
When uploading a directory, there are a few important things you should know.
2015-04-10 21:28:28 +02:00
First, when using the `ssh` connection type the destination directory must already exist.
If you need to create it, use a remote-exec provisioner just prior to the file provisioner
in order to create the directory. When using the `winrm` connection type the destination
directory will be created for you if it doesn't already exist.
2014-07-23 18:40:15 +02:00
Next, the existence of a trailing slash on the source path will determine whether the
directory name will be embedded within the destination, or whether the destination will
be created. An example explains this best:
If the source is `/foo` (no trailing slash), and the destination is `/tmp` , then the contents
of `/foo` on the local machine will be uploaded to `/tmp/foo` on the remote machine. The
`foo` directory on the remote machine will be created by Terraform.
If the source, however, is `/foo/` (a trailing slash is present), and the destination is
`/tmp` , then the contents of `/foo` will be uploaded directly into `/tmp` directly.
This behavior was adopted from the standard behavior of rsync. Note that under the covers,
rsync may or may not be used.