Link Search Menu Expand Document

Table of contents

Metadata

You can use the metadata section to provide arbitrary YAML or JSON

Info on Metadata from AWS can be found here

The metadata() function can take a JsonNode or you can make use of the json() function.

metadata(json(mapOf(
        "Instances" to mapOf("Description" to "Information about the instances"),
        "Databases" to mapOf("Description" to "Information about the databases")
)))

Produces

Metadata:
  Instances:
    Description: "Information about the instances"
  Databases:
    Description: "Information about the databases"

Metadata on Resources

To add metadata json to resources you can set the metatdata property on ResourceProperties passed to any resource.

val instanceProperties = ResourceProperties(
    metadata = json(mapOf(
        . . .
    ))
)
instance(resourceProperties = instanceProperties) { 
    imageId("ami-1232131")
}

Some resources have special metadata keys that can be applied. For example the instance resource can be supplied with AWS::Cloudformation::Init to provide initialisation information to the instance.

AWS::CloudFormation::Init

Info on AWS::CloudFormation::Init from AWS can be found here

Inside the map passed to the json function you can invoke the cfnInitMetadata { } function.

val instanceProperties = ResourceProperties(
    metadata = json(mapOf(
        cfnInitMetadata { 
            . . .
        }
    ))
)
instance(resourceProperties = instanceProperties) {
    imageId("ami-1232131")
}
ConfigSets
cfnInitMetadata {
    // Config Set with one config named 1
    configSet("test1", +"1")
    // Config Set with one config set named test1 and one config named 2
    configSet("test2", configSetRef("test1"), +"2")
    // A default Config Set referencing Config Set named test2
    defaultConfigSet(configSetRef("test2"))
}
Config
cfnInitMetadata { 
    . . .
    // Config named 1
    config("1") { . . . }
    // Default Config
    defaultConfig { . . . }
}
Commands
cfnInitMetadata {
    defaultConfig {
        command(name = "test", command = +"echo \"${'$'}MAGIC\" > test.txt") {
            env("MAGIC" to +"I come from the environment!")
            cwd("~")
            test("test ! -e ~/test.txt")
            ignoreErrors(false)
        }
    }
}
Files
defaultConfig {
    files { 
        "/tmp/setup.mysql"(
                content = +"CREATE DATABASE " + dbName.ref() + ";\n" +
                        "CREATE USER '" + dbUsername.ref() + "'@'localhost' IDENTIFIED BY '" + dbPassword.ref() + "';\n"
        ){ 
            mode("000644")
            owner("root")
            group("root")
        }
    }
}
Groups
defaultConfig {
    groups { 
        "groupOne" { }
        "groupTwo" { gid("45") }
    }
}
Packages
defaultConfig {
    packages {
        PackageManager.rpm {
            "epel"("http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm")
        }
        PackageManager.yum {
            "httpd"(emptyList())
            "php"(emptyList())
            "wordpress"(emptyList())
        }
        PackageManager.rubygems {
            "chef"(listOf("0.10.2"))
        }
        "other" {
            "package"("location")
        }
    }
}
Services
defaultConfig {
    services {
        "sysvinit" {
            "nginx" {
                enabled(true)
                ensureRunning(true)
                files(listOf(+"/etc/nginx/nginx.conf"))
                sources(listOf(+"/var/www/html"))
            }
        }
    }
}
Sources
defaultConfig {
    source("/etc/puppet", "https://github.com/user1/cfn-demo/tarball/master")
}
Users
defaultConfig {
    users {
        "myUser"(
            uid = +"50g",
            groups = +listOf(+"groupOne", +"groupTwo"),
            homeDir = +"/tmp"
        )
    }
}