There are three ways data can be made accessible to a machine created by the CreateInstances step:
Metadata field.StartupScript field.Sources field.Metadata can be thought of as “Cloud environment variables”. Metadata is a
simple mapping between a key string and a value string. You can supply metadata
to your instance using the Metadata field of the CreateInstances step, like
so:
{
...
"Steps": {
"my-step": {
"CreateInstances": [ {
"Name": "my-instance",
"Disks": [ ... ],
"Metadata": {
"key1": "value1",
"key2": "value2"
}
} ]
}
}
...
}
Information passed to instances using the Metadata field can be retrieved by
querying (i.e. sending an HTTP GET request with something like wget or curl
to)
http://metadata.google.internal/computeMetadata/v1/instance/attributes/{key}
from the instance. You must use the special header Metadata-Flavor: Google.
See here
for documentation on working with metadata.
The “Sources” field in your Daisy workflow can contain links to local files, or
files in a Google Cloud Storage bucket using the URL scheme
gs://bucket-name/file-name. Everything listed in Sources is copied to a
scratch bucket created by Daisy. Daisy sets the special metadata key
daisy-sources-path to a gs:// path to the Sources bucket.
Once you have retrieved the path to the Daisy Sources bucket, you can use
gsutil (which
should come pre-installed on all Compute Engine VMs) to download files to the
instance.
An example:
Given a Daisy workflow like this:
{
...
"Sources": {
"file.txt": "gs://my-bucket/some-file.txt",
"startup-script.ps1": "./dostuff.ps1"
},
...
"Steps": {
...
"create-my-instance": {
"CreateInstances": [ {
...
"StartupScript": "startup-script.ps1",
...
} ]
},
...
}
}
The script startup-script.ps1 can do the following to download file.txt from
the Sources bucket:
$client = New-Object Net.WebClient
$client.Headers.Add('Metadata-Flavor', 'Google')
$url_to_query = 'http://metadata.google.internal/computeMetadata/v1/instance/attributes/daisy-sources-path'
$daisy_sources_path = ($client.DownloadString($url_to_query)).Trim()
& gsutil cp "${daisy_sources_path}/file.txt" file.txt
This approach can be used to quickly and reliably download other scripts, installers, and even very large files. Any instance created by Daisy will automatically be given access to the appropriate Sources bucket.