是否有办法获取AWS CDK创建的新(或现有)实例的公共IP或公共DNS(或两者)?
我想针对新实例进行SSH或运行ansible脚本,并且不想每次都转到AWS Console。
这就是我所拥有的:
class WebsiteStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
self.vpc = aws_ec2.Vpc.from_lookup(self, 'default_vpc', is_default=True)
self.sg_ssh = aws_ec2.SecurityGroup(
self,
'ssh',
vpc=self.vpc,
description="Allow SSH from anywhere",
security_group_name="SSH from anywhere"
)
self.sg_ssh.add_ingress_rule(aws_ec2.Peer.any_ipv4(), aws_ec2.Port.tcp(22))
ami = aws_ec2.LookupMachineImage(
name="ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*",
owners=["099720109477"],
)
ec2 = aws_ec2.Instance(
self,
'website',
instance_type=aws_ec2.InstanceType('t3a.micro'),
machine_image=ami,
vpc=self.vpc,
security_group=self.sg_ssh,
key_name="autoscaled",
user_data=self.change_ssh_port,
)
print(ec2.instance_public_dns_name)
但是cdk deploy
,cdk synth
或cdk diff
的输出总是这样:
${Token[TOKEN.41]}
这甚至可能吗?有人成功了吗?
答案 0 :(得分:1)
一种方法是为您要获取的每个值创建一个CloudFormation输出。
您可以使用aws_cdk.aws_ec2.Instance
类的以下属性。
core.CfnOutput(
scope=self,
id="PublicIp",
value=my_instance.instance_public_ip,
description="public ip of my instance",
export_name="ec2-public-ip")
CDK deploy命令在成功运行时会输出堆栈输出。
# cdk deploy
...
Outputs:
mystack.PublicDns = ec2-19-174-49-175.eu-west-1.compute.amazonaws.com
mystack.PublicIp = 19.174.49.175
您还需要根据文档在实例定义中指定一个公共子网。默认情况下,CDK选择一个专用子网。
vpc_subnets (可选[SubnetSelection])–在VPC中放置实例的位置。默认值:-专用子网。
ec2 = aws_ec2.Instance(self,
...
vpc_subnets=aws_ec2.SubnetSelection(subnet_type=aws_ec2.SubnetType.PUBLIC)
)