使用CDK创建AWS EC2实例后如何获得公共DNS?

时间:2019-11-29 12:20:32

标签: aws-cdk

是否有办法获取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 deploycdk synthcdk diff的输出总是这样:

${Token[TOKEN.41]}

这甚至可能吗?有人成功了吗?

1 个答案:

答案 0 :(得分:1)

一种方法是为您要获取的每个值创建一个CloudFormation输出。 您可以使用aws_cdk.aws_ec2.Instance类的以下属性。

  • instance_public_ip
  • instance_public_dns_name
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)
)