Comments (8)
cfndsl implements a very crude templating system through its FnFormat call. It takes a string, followed by a hash of key-value pairs, and it takes care of generating cfn json templates that contain the replacements.
For instance...
FnFormat( <<<EOF,
#!/bin/bash
echo "%{greeting} world!"
EOF
{ :greeting => 'hello' } )
will actually generate template json that looks like this
{"Fn::Join": [ "", "#!/bin/bash\necho \", "hello", "\" world"\n"]]}
which ends up resolving at template invocation time to the script you want.
Note that if you are using Resource(...) { Property(...) } you are missing out on some of the coolness that cfndsl provides. Instead you could say:
CloudFormation {
Instance(:instance1) {
UserData FnBase64("userdata here")
}
Instance(:instance2) {
UserData FnBase64( FnFormat( <<EOF,
#!/bin/sh
cat
echo "instance1 has instance id %{instance1}" > %{file}
EOF
{ :file => '/tmp/inst1_id'})
}
}
Ok, so there is a lot going on here. First, you are invoking the deeper part of the dsl, where the
"Instance(:resource_name)" method takes care declaring a resource of type AWS::EC2::Instance. The block you pass to it gets evaluated in the context of an object representing the resource, and it has setter methods for all of the things declared as Parameters for the AWS::EC2::Instance type. There is some other syntactic sugar for doing this. You can pass a symbol like :instance1 to FnRef, and it will actually check to see that you declared such a resource when you try to compile the template json. Also, if you use resource names as template variables in an FnFormat call, they get resolved to an FnRef in the giant Fn::Join that cfndsl generates.
from cfndsl.
I guess if you have a specific way to improve on what cfndsl already does, we would love to hear about it, but for now I am marking this issue closed.
from cfndsl.
Hi Chris, thanks for taking the time to write such a good reply. I didn't know about FnFormat(). I was achieving the same thing by calling FnBase64(FnJoin(...)) in order to get the Ref() values.
I didn't know about Instance() syntax either. There is no example using that (nor FnFormat() ) in the examples, or Readme. When I'm done with this, I'll make a pull request with some more examples if you don't mind.
Thanks again
Fede
from cfndsl.
Where can I find the different resource types (such as Instance() ) that are supported by cfndsl ?
thanks
from cfndsl.
How would you write an Instance type, when it has metadata "AWS::CloudFormation::Init " ?
from cfndsl.
In my development, I address the Metadata as one of properties of
resources, so I use Property method with parameter "
AWS::CloudFormation::Init" and some json data to specify metadata.
On Mon, Jul 14, 2014 at 11:39 AM, Federico Czerwinski <
[email protected]> wrote:
How would you write an Instance type, when it has metadata
"AWS::CloudFormation::Init " ?—
Reply to this email directly or view it on GitHub
#57 (comment).
from cfndsl.
Thanks Allinwonder, I do the same thing. My question was actually how do you specify a Cloudformatio::init parameter using the 'instance()' syntax. (not using resource() )
cheers
Fede.
from cfndsl.
Hi Fede, I think to use "AWS::Cloudformation::Init" inside "Instance()"
method is the same way as you use in other resources.
I prefer to declare resource using the "Resource()" method with resource
name and use "Type()" method inside to define the resource type.
For example
Resource("MyInstance") do
Type("AWS::EC2::Instance")
# add more properties ...
MetaData("AWS::CloudFormation::Init",
{ :config => {
:packages => {
:yum => {
'ruby-devel' => []
}
}
}
})
end
from cfndsl.
Related Issues (20)
- gitter.im link is broken (gives 404 not found) HOT 2
- Where should we define custom helper methods? HOT 1
- Possible regressions 0.17.5 -> 1.0.0 HOT 8
- Resources ["Foo"] refer to unknown Reference AWS::Partition HOT 4
- Typo in README examples
- CloudFrontOriginAccessIdentity is an undefined method HOT 4
- Issue with DSL generation from cli arguments HOT 1
- unknown type AWSResourceGroupsGroupJson HOT 1
- Shorthand method of accessing resource attributes via FnSub fails reference checks HOT 1
- Outdated assertion in Readme HOT 1
- SecurityGroupIngress is always an array - 1.1.1 HOT 2
- Task: Generate types from CloudFormation resource registry schemas
- Freeze specifications version HOT 2
- Allow ruby versions until eol
- Missing Support for the TimeZone property of AWS::AutoScaling::ScheduledAction HOT 1
- List ItemType in the specification file breaking template generation with spec version 69.0.0 HOT 1
- AWS::CloudFormation::Interface HOT 4
- Missing AWS::ElasticLoadBalancingV2::LoadBalancer SubnetMapping HOT 2
- Undefined method `Name' for `CfnDsl::AWS::Types::AWS_SSM_Association` HOT 8
- Jsonable calls System.exit instead of raising exception
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cfndsl.