我正在尝试启动并运行一个Stacker项目(在幕后使用对流层),并且我已经能够创建多个资源,但无法弄清楚子网部分。我尝试以几种不同的方式将它们传递到我的蓝图类中,但我认为这是最接近的,它类似于其他不会彻底爆炸的实现。这个想法是接受这样的子网的一些配置。
在我的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
对象,原因是我在采用NetworkConfiguration
对象之前尝试在使用对象时传递此信息,AwsvpcConfiguration
但它也不起作用。我使用这个文件来指导我,因为它是定义这些对象的地方。下一步是build
资源,所以当我通过运行以下命令执行此操作时:
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 中成功创建的其他资源以相同的方式做的那样。如果您能指出错误,我将非常感激,并且肯定会告诉圣诞老人您有多好。