Skip to content

Commit 4b089b5

Browse files
authored
Merge pull request #26631 from hashicorp/b-unsupported-instance-metadata-tags
resource/aws_instance: Handle regions where instance metadata tags are unsupported
2 parents 32c3ccc + a64bc83 commit 4b089b5

File tree

3 files changed

+47
-4
lines changed

3 files changed

+47
-4
lines changed

.changelog/26631.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
resource/aws_instance: No longer fails when setting `metadata_options.instance_metadata_tags`
3+
```

internal/service/ec2/ec2_instance.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ func ResourceInstance() *schema.Resource {
443443
"instance_metadata_tags": {
444444
Type: schema.TypeString,
445445
Optional: true,
446-
Default: ec2.InstanceMetadataTagsStateDisabled,
446+
Computed: true,
447447
ValidateFunc: validation.StringInSlice(ec2.InstanceMetadataTagsState_Values(), false),
448448
},
449449
},
@@ -1672,9 +1672,13 @@ func resourceInstanceUpdate(d *schema.ResourceData, meta interface{}) error {
16721672
input.InstanceMetadataTags = aws.String(tfMap["instance_metadata_tags"].(string))
16731673
}
16741674

1675-
log.Printf("[DEBUG] Modifying EC2 Instance metadata options: %s", input)
16761675
_, err := conn.ModifyInstanceMetadataOptions(input)
1676+
if tfawserr.ErrMessageContains(err, errCodeUnsupportedOperation, "InstanceMetadataTags") {
1677+
log.Printf("[WARN] updating EC2 Instance (%s) metadata options: %s. Retrying without instance metadata tags.", d.Id(), err)
1678+
input.InstanceMetadataTags = nil
16771679

1680+
_, err = conn.ModifyInstanceMetadataOptions(input)
1681+
}
16781682
if err != nil {
16791683
return fmt.Errorf("updating EC2 Instance (%s) metadata options: %w", d.Id(), err)
16801684
}

internal/service/ec2/ec2_instance_test.go

+38-2
Original file line numberDiff line numberDiff line change
@@ -4394,7 +4394,7 @@ func TestAccEC2Instance_metadataOptions(t *testing.T) {
43944394
Steps: []resource.TestStep{
43954395
{
43964396
Config: testAccInstanceConfig_metadataOptions(rName),
4397-
Check: resource.ComposeTestCheckFunc(
4397+
Check: resource.ComposeAggregateTestCheckFunc(
43984398
testAccCheckInstanceExists(resourceName, &v),
43994399
resource.TestCheckResourceAttr(resourceName, "metadata_options.#", "1"),
44004400
resource.TestCheckResourceAttr(resourceName, "metadata_options.0.http_endpoint", "disabled"),
@@ -4405,7 +4405,7 @@ func TestAccEC2Instance_metadataOptions(t *testing.T) {
44054405
},
44064406
{
44074407
Config: testAccInstanceConfig_metadataOptionsUpdated(rName),
4408-
Check: resource.ComposeTestCheckFunc(
4408+
Check: resource.ComposeAggregateTestCheckFunc(
44094409
testAccCheckInstanceExists(resourceName, &v),
44104410
resource.TestCheckResourceAttr(resourceName, "metadata_options.#", "1"),
44114411
resource.TestCheckResourceAttr(resourceName, "metadata_options.0.http_endpoint", "enabled"),
@@ -4414,6 +4414,17 @@ func TestAccEC2Instance_metadataOptions(t *testing.T) {
44144414
resource.TestCheckResourceAttr(resourceName, "metadata_options.0.instance_metadata_tags", "enabled"),
44154415
),
44164416
},
4417+
{
4418+
Config: testAccInstanceConfig_metadataOptionsUpdatedAgain(rName),
4419+
Check: resource.ComposeAggregateTestCheckFunc(
4420+
testAccCheckInstanceExists(resourceName, &v),
4421+
resource.TestCheckResourceAttr(resourceName, "metadata_options.#", "1"),
4422+
resource.TestCheckResourceAttr(resourceName, "metadata_options.0.http_endpoint", "enabled"),
4423+
resource.TestCheckResourceAttr(resourceName, "metadata_options.0.http_tokens", "optional"),
4424+
resource.TestCheckResourceAttr(resourceName, "metadata_options.0.http_put_response_hop_limit", "1"),
4425+
resource.TestCheckResourceAttr(resourceName, "metadata_options.0.instance_metadata_tags", "disabled"),
4426+
),
4427+
},
44174428
{
44184429
ResourceName: resourceName,
44194430
ImportState: true,
@@ -7691,6 +7702,31 @@ resource "aws_instance" "test" {
76917702
`, rName))
76927703
}
76937704

7705+
func testAccInstanceConfig_metadataOptionsUpdatedAgain(rName string) string {
7706+
return acctest.ConfigCompose(
7707+
acctest.ConfigLatestAmazonLinuxHVMEBSAMI(),
7708+
testAccInstanceVPCConfig(rName, false, 0),
7709+
acctest.AvailableEC2InstanceTypeForRegion("t3.micro", "t2.micro"),
7710+
fmt.Sprintf(`
7711+
resource "aws_instance" "test" {
7712+
ami = data.aws_ami.amzn-ami-minimal-hvm-ebs.id
7713+
instance_type = data.aws_ec2_instance_type_offering.available.instance_type
7714+
subnet_id = aws_subnet.test.id
7715+
7716+
tags = {
7717+
Name = %[1]q
7718+
}
7719+
7720+
metadata_options {
7721+
http_endpoint = "enabled"
7722+
http_tokens = "optional"
7723+
http_put_response_hop_limit = 1
7724+
instance_metadata_tags = "disabled"
7725+
}
7726+
}
7727+
`, rName))
7728+
}
7729+
76947730
func testAccInstanceConfig_enclaveOptions(rName string, enabled bool) string {
76957731
return acctest.ConfigCompose(
76967732
acctest.ConfigLatestAmazonLinuxHVMEBSAMI(),

0 commit comments

Comments
 (0)