YAML: YAML Ain't Markup Language
I spend a heck of a lot of time coding and, like many devops guys, love Coffeescript, Jade, Stylus and YAML. No chasing missing semicolons, commas and curly braces. I just write clean code how it should be and, at least twice as fast.
JSON, like plain javascript, is a lot cleaner, quicker and easier to read when you remove all those curly braces, commas etc. YAML does just that!
AWS just announced support for YAML with CloudFormation templates. I would thoroughly recommend you check it out and start using YAML. It will make big difference to your productivity and, your templates will be much easier to read understand.
YAML, like Coffeescript, Jade and Stylus, makes use of indenting in code to eliminate the need for braces and commas. When you're learning YAML, you can use a JSON to YAML converter (eg http://www.json2yaml.com) to convert your existing JSON to YAML.
(Very) Basics of YAML
Collections using Indentation eliminate the need for braces and commas with Objects:JSON
"WebsiteConfiguration": {
"IndexDocument": "index.html",
"ErrorDocument": "error.html"
}
YAML
WebsiteConfiguration:
IndexDocument: index.html
ErrorDocument: error.html
Sequences with Dashes eliminate the need for square brackets and commas with Arrays:
JSON
[
"S3Bucket",
"DomainName"
]
YAML
- S3Bucket
- DomainName
Full Example
Here is a full example I created for S3. I'll let you be the judge which one is better!JSON:
{"AWSTemplateFormatVersion": "2010-09-09",
"Description": "AWS CloudFormation Sample Template",
"Resources": {
"S3Bucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"AccessControl": "PublicRead",
"WebsiteConfiguration": {
"IndexDocument": "index.html",
"ErrorDocument": "error.html"
}
},
"DeletionPolicy": "Retain"
}
},
"Outputs": {
"WebsiteURL": {
"Value": {
"Fn::GetAtt": [
"S3Bucket",
"WebsiteURL"
]
},
"Description": "URL for website hosted on S3"
},
"S3BucketSecureURL": {
"Value": {
"Fn::Join": [
"",
[
"https://",
{
"Fn::GetAtt": [
"S3Bucket",
"DomainName"
]
}
]
]
},
"Description": "Name of S3 bucket to hold website content"
}
}
}
YAML:
---AWSTemplateFormatVersion: '2010-09-09'
Description: AWS CloudFormation Sample Template
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
AccessControl: PublicRead
WebsiteConfiguration:
IndexDocument: index.html
ErrorDocument: error.html
DeletionPolicy: Retain
Outputs:
WebsiteURL:
Value:
Fn::GetAtt:
- S3Bucket
- WebsiteURL
Description: URL for website hosted on S3
S3BucketSecureURL:
Value:
Fn::Join:
- ''
- - https://
- Fn::GetAtt:
- S3Bucket
- DomainName
Description: Name of S3 bucket to hold website content
Try replacing with this even easier to read syntax:
ReplyDeleteValue: !GetAtt S3Bucket.WebsiteURL
...and
ReplyDeleteValue: !Join [ "", [ "https://", !GetAtt S3Bucket.DomainName ]]
Nice!
ReplyDeleteDefinitely shorter although probably not as readable. The starting JSON was from the AWS templates.