Python 堆垛机AWSVPCC配置作为yaml传入,作为str接收

Python 堆垛机AWSVPCC配置作为yaml传入,作为str接收,python,yaml,troposphere,Python,Yaml,Troposphere,我正试图让一个项目(在幕后使用)启动并运行,我已经能够创建多个资源,但无法找出子网部分。我尝试了几种不同的方法将它们传递到blueprint类中,但我认为这是最接近的方法,它与其他不会完全爆炸的实现类似。这样做的目的是为这样的子网接受一些配置 在mymy_cluster.yaml中,我有: stacks: ... - name: cluster-networks description: "Networks for an ECS cluster" class_path:

我正试图让一个项目(在幕后使用)启动并运行,我已经能够创建多个资源,但无法找出子网部分。我尝试了几种不同的方法将它们传递到blueprint类中,但我认为这是最接近的方法,它与其他不会完全爆炸的实现类似。这样做的目的是为这样的子网接受一些配置

在my
my_cluster.yaml
中,我有:

 stacks:
 ...
  - name: cluster-networks
    description: "Networks for an ECS cluster"
    class_path: blueprints.networks.Networks
    variables:
      Networks: 
        InternalComms:
          AssignPublicIp: False
          SecurityGroups: 
            - sg-id
          Subnets: 
            - subnet-id1
            - subnet-id2
为了阅读该配置,我有一个名为
blueprints/networks.py
的蓝图,其中包含以下内容:

class Networks(Blueprint):
"""Manages creation of networks for ECS clusters"""

# Variables that are passed from the my_cluster.yaml
VARIABLES = {
    "Networks": {
        "type": TroposphereType(ecs.AwsvpcConfiguration, many=True),
        "description": "Dictionary for ECS cluster networks"
    }
}

def create_template(self):
    """method that Stacker calls to manipulate the template(s)"""
    variables = self.get_variables()
    for config in variables['Networks']:
        network = ecs.NetworkConfiguration(config)
        t.add_resource(network)
        # do other useful stuff like set outputs
如果您想知道为什么我要创建一个
AwsvpcConfiguration
对象,然后从中创建一个
NetworkConfiguration
对象,原因是在采用
AwsvpcConfiguration
对象之前,我试图使用
NetworkConfiguration
对象传递此信息,但它也不起作用。我用它来指导我,因为它是定义这些对象的地方。下一步是
构建
资源,因此,当我通过运行以下命令执行此操作时:

stacker build path/to/my.env path/to/my_cluster.yaml
我得到一个错误,上面写着:

stacker.exceptions.ValidatorError: Validator 'AwsvpcConfiguration.create' 
failed for variable 'Networks' with value 
'{'InternalComms': {'AssignPublicIp': False, 'SecurityGroups': ['sg-id'], 'Subnets': ['subnet-id1', 'subnet-id2']}}': 
TypeError: _from_dict() argument after ** must be a mapping, not str
这可能是我在stacker、yaml和python方面缺乏技能的原因,但我被难住了,已经呆了一天左右


我不知道如何将yaml中的配置作为字典传递到蓝图中,就像我在AWS land中成功创建的其他资源一样。如果你能给我指出错误,我将不胜感激,并肯定会告诉圣诞老人你有多好。

对流层维护者/堆叠者作者。所以有几件事:

  • 您需要使用TroposphereType(ecs.NetworkConfiguration,many=True),因为这是您想要创建的对象类型
  • ecs.NetworkConfiguration()是AWSProperty类型,这意味着其中的值,如果使用“many”,则需要是每个的字典列表:
  • 所以我认为你想要的是你的配置

    
    变量:
    网络:
    -AWSVPCC配置:
    分配公共IP:错误
    安全组:
    -sg id
    子网:
    -子网id1
    -子网id2
    

    这是因为
    TroposphereType
    希望您传入该类型所需的确切参数。
    NetworkConfiguration
    需要一个键,
    AwsvpcConfiguration
    ,您传递的值是
    AwsvpcConfiguration
    对象所需的值


    现在更大的问题是您希望如何使用这些对象。在Cloudformation/troposphere中,属性类型不是自己创建的-它们用作实际资源的属性-在本例中是
    ecs.Service
    类型。您是否不打算在同一蓝图中包含该服务?如果没有,您计划如何与这些服务所在的其他蓝图共享这些财产

    更合适的做法可能是有一个蓝图,该蓝图将构建服务及其
    网络配置
    。然后,如果您希望使用该蓝图在多个堆栈之间轻松共享相同的网络配置,可以使用YAML锚点执行以下操作:

    
    公共网络配置:&公共网络配置
    -AWSVPCC配置:
    分配公共IP:错误
    安全组:
    -sg id
    子网:
    -子网id1
    -子网id2
    

    然后在任何需要的变量中使用它,如:

    
    变量:
    
    “现在更大的问题是你希望如何使用这些物体。”我仍在制定细节,但我上面展示的蓝图和yaml是优秀的。真正的蓝图或者说是一个集群。到目前为止,我有几个堆栈;1. <代码>权限
    包含角色、策略等2<代码>网络…有点明显3<代码>初始化'包含启动配置4run`包含自动缩放组,该组引用
    网络
    堆栈的输出5
    cluster
    只是一个
    ecs.cluster()。谢谢这修正了那个错误,现在我正在处理其他问题。再次感谢您为我指明了正确的方向,网络配置的yaml锚可能比创建堆栈并引用它要好得多,就像我尝试的那样。祝你节日快乐,朋友!顺便说一句,到目前为止,你对Stacker的了解给我留下了深刻的印象。谢谢你的好工作!谢谢你,亚当!很高兴你又走了。一般来说,当我们(@emild)计算出我们的堆栈时,我们倾向于考虑以下几件事:-多久更新一次?将经常更新的内容(如安全组规则)与不经常更新的内容(安全组本身)分开—意外更新有多危险?保护模式和锁定有助于在堆垛机中保护您,但这仍然是一个好主意。意外更新安全组规则比修改子网更安全。祝你好运,有时间一定要去松弛频道:)