Python 堆垛机AWSVPCC配置作为yaml传入,作为str接收
我正试图让一个项目(在幕后使用)启动并运行,我已经能够创建多个资源,但无法找出子网部分。我尝试了几种不同的方法将它们传递到blueprint类中,但我认为这是最接近的方法,它与其他不会完全爆炸的实现类似。这样做的目的是为这样的子网接受一些配置 在myPython 堆垛机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:
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中成功创建的其他资源一样。如果你能给我指出错误,我将不胜感激,并肯定会告诉圣诞老人你有多好。对流层维护者/堆叠者作者。所以有几件事:
变量:
网络:
-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`包含自动缩放组,该组引用网络
堆栈的输出5cluster
只是一个ecs.cluster()。谢谢这修正了那个错误,现在我正在处理其他问题。再次感谢您为我指明了正确的方向,网络配置的yaml锚可能比创建堆栈并引用它要好得多,就像我尝试的那样。祝你节日快乐,朋友!顺便说一句,到目前为止,你对Stacker的了解给我留下了深刻的印象。谢谢你的好工作!谢谢你,亚当!很高兴你又走了。一般来说,当我们(@emild)计算出我们的堆栈时,我们倾向于考虑以下几件事:-多久更新一次?将经常更新的内容(如安全组规则)与不经常更新的内容(安全组本身)分开—意外更新有多危险?保护模式和锁定有助于在堆垛机中保护您,但这仍然是一个好主意。意外更新安全组规则比修改子网更安全。祝你好运,有时间一定要去松弛频道:)