Codificar manualmente seu modelo json CloudFormation não é divertido, então você decide usar cfndsl . Ótimo. Mas cfndsl envia o modelo para o console, então você precisa contornar isso para enviar seu modelo para a AWS.
Um template cfndsl bastante básico ( template.rb )
CloudFormation {
AWSTemplateFormatVersion "2010-09-09"
Description "My Stack"
Parameter("InstanceType") {
Description "Type of EC2 instance to launch"
Type "String"
Default "m1.medium"
}
Resource("Ec2Instance") {
Type "AWS::EC2::Instance"
Property("InstanceType", "t1.micro")
...
}
}
… que você avalia com cfndsl e redireciona a saída para uma string em vez da saída padrão.
def generate_template
results = $stdout = StringIO.new
template = CfnDsl::CloudFormationTemplate.new
template.instance_eval(File.read('template.rb'), 'template.rb')
results.close_write
results.rewind
$stdout = STDOUT
results.read
end
Agora você pode enviar seu modelo json para AWS e ter sua pilha criada.
require 'cfndsl'
require 'aws-sdk'
require 'stringio'
def create_stack
client = AWS::CloudFormation::Client.new(region: 'ap-southeast-2')
client.create_stack(stack_name: 'MyStack', template_body: generate_template)
end