Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon ec2 无法使用Terraform获取spot实例的公共IP地址_Amazon Ec2_Terraform_Terraform Provider Aws_Spot Instances - Fatal编程技术网

Amazon ec2 无法使用Terraform获取spot实例的公共IP地址

Amazon ec2 无法使用Terraform获取spot实例的公共IP地址,amazon-ec2,terraform,terraform-provider-aws,spot-instances,Amazon Ec2,Terraform,Terraform Provider Aws,Spot Instances,我正在旋转一个spot实例,正如您在下面的配置中所看到的,然后尝试从spot获取IP地址。它似乎可以与常规ec2实例(即不是spot实例)配合使用 我得到的错误是: aws_route53_record.staging:资源 “aws\u spot\u instance\u request.app-ec2”没有属性 变量“aws_spot_instance_request.app-ec2.public_ip”的“public_ip” 以下是我正在使用的配置: resource "aws_spot

我正在旋转一个spot实例,正如您在下面的配置中所看到的,然后尝试从spot获取IP地址。它似乎可以与常规ec2实例(即不是spot实例)配合使用

我得到的错误是:

aws_route53_record.staging:资源 “aws\u spot\u instance\u request.app-ec2”没有属性 变量“aws_spot_instance_request.app-ec2.public_ip”的“public_ip”

以下是我正在使用的配置:

resource "aws_spot_instance_request" "app-ec2" {
    ami = "ami-1c999999"
    spot_price    = "0.008"
    instance_type = "t2.small"
    tags {
        Name = "${var.app_name}"
    }
    key_name = "mykeypair"
    associate_public_ip_address = true
    vpc_security_group_ids = ["sg-99999999"]
    subnet_id = "subnet-99999999"
    iam_instance_profile = "myInstanceRole"
    user_data = <<-EOF
#!/bin/bash
echo ECS_CLUSTER=APP-STAGING >> /etc/ecs/ecs.config
    EOF
}

resource "aws_route53_record" "staging" {
   zone_id = "XXXXXXXX"
   name = "staging.myapp.com"
   type = "A"
   ttl = "300"
   records = ["${aws_spot_instance_request.app-ec2.public_ip}"]
资源“aws现场实例请求”app-ec2{
ami=“ami-1C99999”
现货价格=“0.008”
实例_type=“t2.小”
标签{
Name=“${var.app_Name}”
}
key\u name=“mykeypair”
关联\u公共\u ip\u地址=真
专有网络安全组ID=[“sg-9999999”]
子网\u id=“子网-9999999”
iam_实例_profile=“myInstanceRole”
用户数据=/etc/ecs/ecs.config
EOF
}
资源“aws_路由53_记录”“暂存”{
区域id=“XXXXXXXX”
name=“staging.myapp.com”
type=“A”
ttl=“300”
记录=[“${aws\u spot\u instance\u request.app-ec2.public\u ip}”]
现场请求在AWS控制台上实现,如下所示:


非常感谢您的帮助!

我尝试了您随Terraform版本
0.12.10
提供的代码片段,但得到了相同的错误。我检查了
Terraform.tfstate
文件,发现字段尚未填充(例如,
private\u-ip
public\u-ip
public\u-dns
被设置为
null
)。我检查了“现场请求”在AWS控制台中查看以下状态:
价格过低:您的即期请求价格0.0075低于最低要求的即期请求履行价格0.008。
请求状态仍处于打开状态,这就是为什么状态文件中的所有变量都设置为
null

的原因,因此我一直在尝试计算从昨晚开始,我一直看到spot实例请求通过AWS控制台得到满足。同样,我可以看到spot的公共IP,这误导了我

事实证明,我的脚本中缺少一行(参数):

wait_for_fulfillment = true
默认情况下,它被设置为false,因此当我试图设置public_ip地址时,它当时根本不存在


现在Terraform将等待现货请求完成。根据文档,如果达到10米的超时时间,它将抛出一个错误。

感谢您对此的快速回复。我刚刚用Terraform脚本快速检查了一下,看到现货请求在我的AWS控制台中以现货价格0.008完成。我已经更新了上述内容在帖子中包括屏幕截图。对于我的原始问题,我仍然不确定如何无法获取public_ip?对于变量“aws_spot_instance_request.app-ec2.public_ip”的错误消息
属性“public_ip”。app-ec2.public_ip
表明您在尝试从变量
访问
public_ip>变量时出现语法错误>aws_spot_instance_request.app-ec2.public_ip
。您是否在变量中键入了两次
public_ip
?以下操作正常
“${aws_spot_instance_request.app-ec2.public_ip}”
如果spot实例请求已被批准。我也是这么想的,但我没有键入
public\u ip
两次,它只出现一次,感谢您的帮助。我刚刚发现了这一点,似乎需要等待完成。一旦我添加了它,public\u ip就会正常工作。这可能会有帮助: