我正在尝试使用内联规则在pulumi中创建安全组,特别是引用另一个安全组作为源的规则。这些组都还不存在,需要从变量的循环中创建,因为可能有相当多的组。
下面是变量的示例:
compute:security_groups:
- name: load-balancer
inbound:
- cidr_blocks: null
from_port: 80
protocol: tcp
source_security_group: cache
to_port: 80
- cidr_blocks: null
from_port: 22
protocol: tcp
source_security_group: logging
to_port: 22
- name: cache
inbound:
- cidr_blocks: null
from_port: 6379
protocol: tcp
source_security_group: load-balancer
to_port: 6379
- name: logging
inbound:
- cidr_blocks: null
from_port: 22
protocol: tcp
source_security_group: cache
to_port: 22
- cidr_blocks: null
from_port: 5044
protocol: tcp
source_security_group: load-balancer
to_port: 5044我们应该创建一个名为name的安全组,并为inbound下的每个项目包含一个内联规则。源安全组需要指向source_security_group中引用的组
我得到的最接近的方法是先用SecurityGroupIngressArgs创建规则,然后将它们添加到单独创建的组中。类似于:
env_name = pulumi.get_stack()
default_tags = {'resource-group': env_name, 'environment': env_name, 'managed-by': "pulumi"}
### Securty groups
# Create groups
sg_list = []
for sg in config.require_object('security_groups'):
# create rules
inbound_list = []
for item in sg['inbound']:
source_group_name = env_name + '-' + item['source_security_group']
inbound_list.append(aws.ec2.SecurityGroupIngressArgs(
from_port = item['from_port'],
to_port = item['to_port'],
protocol = item['protocol'],
security_groups = sg_list[source_group_name.id]
))
# create groups
sg_name = env_name + '-' + sg.get('name')
sg_list.append(aws.ec2.SecurityGroup(sg_name,
description = sg.get('description'),
vpc_id = kv_vpc['id'],
ingress = inbound_list,
egress = outbound_list,
tags = {**default_tags,**{'Name': sg_name}}
)
)这种方法适用于cidr块,但是使用安全组作为源时,我不能引用尚未创建的安全组id。我不确定如何用pulumi来构建这个结构。
发布于 2020-11-25 22:54:08
要记住的关键一点是,当你写这篇文章的时候,当它运行的时候,一些资源还没有被创建(要么是因为AWS需要一段时间来创建东西,要么是因为它还没有达到代码中的那个位置)。
Pulumi通过使用我们所说的"inputs" and "outputs"来处理这个问题(如果您知道javascript/typescript,那么您就会知道我所说的promise是什么意思了),更具体地说,您会希望查看apply示例,其中它使用了一个lambda来获取变量。
在某些情况下,您可以直接使用安全组数组。下面是文档中的一个示例:
import pulumi
import pulumi_aws as aws
size = 't2.micro'
ami = aws.get_ami(most_recent="true",
owners=["137112412989"],
filters=[{"name":"name","values":["amzn-ami-hvm-*"]}])
group = aws.ec2.SecurityGroup('webserver-secgrp',
description='Enable HTTP access',
ingress=[
{ 'protocol': 'tcp', 'from_port': 22, 'to_port': 22, 'cidr_blocks': ['0.0.0.0/0'] }
])
server = aws.ec2.Instance('webserver-www',
instance_type=size,
vpc_security_group_ids=[group.id], # reference security group from above
ami=ami.id)
pulumi.export('publicIp', server.public_ip)
pulumi.export('publicHostName', server.public_dns)https://stackoverflow.com/questions/65005424
复制相似问题