diff --git a/.changelog/37002.txt b/.changelog/37002.txt new file mode 100644 index 000000000000..b6795a33d3a6 --- /dev/null +++ b/.changelog/37002.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +data-source/aws_instance: Add `launch_time` attribute +``` \ No newline at end of file diff --git a/internal/service/ec2/ec2_instance_data_source.go b/internal/service/ec2/ec2_instance_data_source.go index c382443ba122..42d9c2dfe7f6 100644 --- a/internal/service/ec2/ec2_instance_data_source.go +++ b/internal/service/ec2/ec2_instance_data_source.go @@ -208,6 +208,10 @@ func DataSourceInstance() *schema.Resource { Type: schema.TypeString, Computed: true, }, + "launch_time": { + Type: schema.TypeString, + Computed: true, + }, "maintenance_options": { Type: schema.TypeList, Computed: true, @@ -479,6 +483,7 @@ func instanceDescriptionAttributes(ctx context.Context, d *schema.ResourceData, d.Set("ami", instance.ImageId) d.Set(names.AttrInstanceType, instanceType) d.Set("key_name", instance.KeyName) + d.Set("launch_time", instance.LaunchTime.Format(time.RFC3339)) d.Set("outpost_arn", instance.OutpostArn) d.Set("private_dns", instance.PrivateDnsName) d.Set("private_ip", instance.PrivateIpAddress) diff --git a/internal/service/ec2/ec2_instance_data_source_test.go b/internal/service/ec2/ec2_instance_data_source_test.go index 84e223a0ac4c..d8b31d377b50 100644 --- a/internal/service/ec2/ec2_instance_data_source_test.go +++ b/internal/service/ec2/ec2_instance_data_source_test.go @@ -33,6 +33,7 @@ func TestAccEC2InstanceDataSource_basic(t *testing.T) { resource.TestCheckResourceAttrPair(datasourceName, names.AttrARN, resourceName, names.AttrARN), resource.TestCheckNoResourceAttr(datasourceName, "user_data_base64"), resource.TestCheckResourceAttr(datasourceName, "outpost_arn", ""), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), ), }, }, @@ -56,6 +57,7 @@ func TestAccEC2InstanceDataSource_tags(t *testing.T) { resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, "tags.%", resourceName, "tags.%"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), ), }, }, @@ -81,6 +83,7 @@ func TestAccEC2InstanceDataSource_azUserData(t *testing.T) { resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), resource.TestCheckResourceAttrPair(datasourceName, names.AttrAvailabilityZone, resourceName, names.AttrAvailabilityZone), resource.TestCheckResourceAttrPair(datasourceName, "user_data", resourceName, "user_data"), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), ), }, }, @@ -103,6 +106,7 @@ func TestAccEC2InstanceDataSource_gp2IopsDevice(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "root_block_device.#", resourceName, "root_block_device.#"), resource.TestCheckResourceAttrPair(datasourceName, "root_block_device.0.volume_size", resourceName, "root_block_device.0.volume_size"), resource.TestCheckResourceAttrPair(datasourceName, "root_block_device.0.volume_type", resourceName, "root_block_device.0.volume_type"), @@ -130,6 +134,7 @@ func TestAccEC2InstanceDataSource_gp3ThroughputDevice(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "root_block_device.#", resourceName, "root_block_device.#"), resource.TestCheckResourceAttrPair(datasourceName, "root_block_device.0.volume_size", resourceName, "root_block_device.0.volume_size"), resource.TestCheckResourceAttrPair(datasourceName, "root_block_device.0.volume_type", resourceName, "root_block_device.0.volume_type"), @@ -157,6 +162,7 @@ func TestAccEC2InstanceDataSource_blockDevices(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "root_block_device.#", resourceName, "root_block_device.#"), resource.TestCheckResourceAttrPair(datasourceName, "root_block_device.0.volume_size", resourceName, "root_block_device.0.volume_size"), resource.TestCheckResourceAttrPair(datasourceName, "root_block_device.0.volume_type", resourceName, "root_block_device.0.volume_type"), @@ -220,6 +226,7 @@ func TestAccEC2InstanceDataSource_rootInstanceStore(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "ebs_block_device.#", resourceName, "ebs_block_device.#"), resource.TestCheckResourceAttrPair(datasourceName, "ebs_optimized", resourceName, "ebs_optimized"), resource.TestCheckResourceAttrPair(datasourceName, "root_block_device.#", resourceName, "root_block_device.#"), @@ -245,6 +252,7 @@ func TestAccEC2InstanceDataSource_privateIP(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "private_dns_name_options.#", resourceName, "private_dns_name_options.#"), resource.TestCheckResourceAttrPair(datasourceName, "private_dns_name_options.0.enable_resource_name_dns_aaaa_record", resourceName, "private_dns_name_options.0.enable_resource_name_dns_aaaa_record"), resource.TestCheckResourceAttrPair(datasourceName, "private_dns_name_options.0.enable_resource_name_dns_a_record", resourceName, "private_dns_name_options.0.enable_resource_name_dns_a_record"), @@ -272,6 +280,7 @@ func TestAccEC2InstanceDataSource_secondaryPrivateIPs(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "secondary_private_ips", resourceName, "secondary_private_ips"), ), }, @@ -295,6 +304,7 @@ func TestAccEC2InstanceDataSource_ipv6Addresses(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "ipv6_addresses.#", resourceName, "ipv6_address_count"), ), }, @@ -324,6 +334,7 @@ func TestAccEC2InstanceDataSource_keyPair(t *testing.T) { resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, "tags.%", resourceName, "tags.%"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "key_name", resourceName, "key_name"), ), }, @@ -347,6 +358,7 @@ func TestAccEC2InstanceDataSource_vpc(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "user_data", resourceName, "user_data"), resource.TestCheckResourceAttrPair(datasourceName, "associate_public_ip_address", resourceName, "associate_public_ip_address"), resource.TestCheckResourceAttrPair(datasourceName, "tenancy", resourceName, "tenancy"), @@ -393,6 +405,7 @@ func TestAccEC2InstanceDataSource_securityGroups(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "user_data", resourceName, "user_data"), resource.TestCheckResourceAttrPair(datasourceName, "vpc_security_group_ids.#", resourceName, "vpc_security_group_ids.#"), resource.TestCheckResourceAttrPair(datasourceName, "security_groups.#", resourceName, "security_groups.#"), @@ -418,6 +431,7 @@ func TestAccEC2InstanceDataSource_vpcSecurityGroups(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "vpc_security_group_ids.#", resourceName, "vpc_security_group_ids.#"), resource.TestCheckResourceAttrPair(datasourceName, "security_groups.#", resourceName, "security_groups.#"), ), @@ -610,6 +624,7 @@ func TestAccEC2InstanceDataSource_creditSpecification(t *testing.T) { Config: testAccInstanceDataSourceConfig_creditSpecification(rName), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, "credit_specification.#", resourceName, "credit_specification.#"), resource.TestCheckResourceAttrPair(datasourceName, "credit_specification.0.cpu_credits", resourceName, "credit_specification.0.cpu_credits"), ), @@ -681,6 +696,7 @@ func TestAccEC2InstanceDataSource_blockDeviceTags(t *testing.T) { Config: testAccInstanceDataSourceConfig_blockDeviceTags(rName), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), ), }, }, @@ -731,6 +747,7 @@ func TestAccEC2InstanceDataSource_timeout(t *testing.T) { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(datasourceName, "ami", resourceName, "ami"), resource.TestCheckResourceAttrPair(datasourceName, "tags.%", resourceName, "tags.%"), + resource.TestCheckResourceAttrSet(datasourceName, "launch_time"), resource.TestCheckResourceAttrPair(datasourceName, names.AttrInstanceType, resourceName, names.AttrInstanceType), resource.TestCheckResourceAttrPair(datasourceName, names.AttrARN, resourceName, names.AttrARN), ), diff --git a/website/docs/d/instance.html.markdown b/website/docs/d/instance.html.markdown index 38071202494c..9b685f5eebca 100644 --- a/website/docs/d/instance.html.markdown +++ b/website/docs/d/instance.html.markdown @@ -88,6 +88,7 @@ interpolation. * `instance_type` - Type of the Instance. * `ipv6_addresses` - IPv6 addresses associated to the Instance, if applicable. **NOTE**: Unlike the IPv4 address, this doesn't change if you attach an EIP to the instance. * `key_name` - Key name of the Instance. +* `launch_time` - Time the instance was launched. * `maintenance_options` - Maintenance and recovery options for the instance. * `auto_recovery` - Automatic recovery behavior of the instance. * `metadata_options` - Metadata options of the Instance.