使用Python:Cloudformation Template创建YAML



嗨,我正在尝试使用Python创建一个Cloudformation模板。我正在使用yaml库来完成此操作。

这是我的代码:

import yaml
dict_file =     {
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "ding dong",
"Parameters": {
"Environment":{
"Description": "Environment for Deployment",
"Type": "String"
}
},
"Resources":{
"Queue": {
"Type": "AWS::SQS::Queue",
"Properties":{
"DelaySeconds": 0,
"MaximumMessageSize": 262144,
"MessageRetentionPeriod": 1209600,
"QueueName": '!Sub "${Environment}-Queue"',
"ReceiveMessageWaitTimeSeconds": 0,
"VisibilityTimeout": 150
}
}
}
}
with open(r'TopicName.yml', 'w') as file:
documents = yaml.dump(dict_file, file, sort_keys=False)

问题在于像!Sub这样的Cloudformation标签,正如您在密钥"QueueName"中看到的那样。!Sub需要在生成的yaml中位于引号之外。由此产生的yaml看起来像QueueName: '!Sub "${LSQRegion}-TelephonyLogCall-Distributor"'

我该如何解决这个问题?知道吗?请帮忙!!

在YAML中,以!开头的未加引号的值表示自定义类型。使用yaml.dump,您永远无法从一个简单的字符串值中生成它。您将需要创建一个自定义类和一个关联的representer来获得您想要的输出。例如:

import yaml

class Sub(object):
def __init__(self, content):
self.content = content
@classmethod
def representer(cls, dumper, data):
return dumper.represent_scalar('!Sub', data.content)

dict_file = {
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "ding dong",
"Parameters": {
"Environment": {
"Description": "Environment for Deployment",
"Type": "String"
}
},
"Resources": {
"Queue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"DelaySeconds": 0,
"MaximumMessageSize": 262144,
"MessageRetentionPeriod": 1209600,
"QueueName": Sub("${Environment}-Queue"),
"ReceiveMessageWaitTimeSeconds": 0,
"VisibilityTimeout": 150,
},
}
},
}

yaml.add_representer(Sub, Sub.representer)
print(yaml.dump(dict_file))

这将输出:

AWSTemplateFormatVersion: '2010-09-09'
Description: ding dong
Parameters:
Environment:
Description: Environment for Deployment
Type: String
Resources:
Queue:
Properties:
DelaySeconds: 0
MaximumMessageSize: 262144
MessageRetentionPeriod: 1209600
QueueName: !Sub '${Environment}-Queue'
ReceiveMessageWaitTimeSeconds: 0
VisibilityTimeout: 150
Type: AWS::SQS::Queue

您也可以尝试对流层库。它支持所有的AWS服务(由AWS CloudFormation支持(,并且在Python中创建CloudFormation模板更具Python性。

我已经为您的CloudFormation模板粘贴了对流层代码。你也可以试试:

from troposphere import Template, Parameter, Sub
from troposphere.sqs import Queue

def get_cfn_template():
template = Template()
template.set_version("2010-09-09")
template.set_description("ding dong")
template.add_parameter(Parameter(
"Environment",
Type="String",
Description="Environment for Deployment"
))
template.add_resource(
Queue(
'Queue',
DelaySeconds=0,
MaximumMessageSize=262144,
MessageRetentionPeriod=1209600,
QueueName=Sub("${Environment}-Queue"),
ReceiveMessageWaitTimeSeconds=0,
VisibilityTimeout=150
)
)
return template.to_json()

print get_cfn_template()

输出

{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "ding dong",
"Parameters": {
"Environment": {
"Description": "Environment for Deployment",
"Type": "String"
}
},
"Resources": {
"Queue": {
"Properties": {
"DelaySeconds": 0,
"MaximumMessageSize": 262144,
"MessageRetentionPeriod": 1209600,
"QueueName": {
"Fn::Sub": "${Environment}-Queue"
},
"ReceiveMessageWaitTimeSeconds": 0,
"VisibilityTimeout": 150
},
"Type": "AWS::SQS::Queue"
}
}
}

Troposphere也可以将您的代码转换为YAML。

最新更新