2 回答

TA貢獻1810條經驗 獲得超4個贊
在 YAML 中,以 開頭的不帶引號的值!
表示自定義類型。您永遠無法yaml.dump
使用簡單的字符串值生成它。您將需要創建一個自定義類和一個關聯的表示器才能獲得您想要的輸出。例如:
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

TA貢獻1854條經驗 獲得超8個贊
您也可以嘗試對流層庫。它支持所有 AWS 服務(由 AWS CloudFormation 支持),并且在 Python 中創建 CloudFormation 模板確實更加 Pythonic。
我已為您的 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。
添加回答
舉報