Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change instance profile if the instance is stopped #11104

Merged
merged 4 commits into from
Jan 8, 2020

Conversation

ryndaniels
Copy link
Contributor

Community Note

  • Please vote on this pull request by adding a 👍 reaction to the original pull request comment to help the community and maintainers prioritize this request
  • Please do not leave "+1" comments, they generate extra noise for pull request followers and do not help prioritize the request

Closes #8262

Release note for CHANGELOG:

* resource/aws_iam_instance: Allows for instance profiles to be changed when instances are in stopped state

Output from acceptance testing:

  • Updated test, before the fix:
$ make testacc TESTARGS="-run=TestAccAWSInstance_instanceProfileChange"
==> Checking that code complies with gofmt requirements...
TF_ACC=1 go test ./... -v -count 1 -parallel 20 -run=TestAccAWSInstance_instanceProfileChange -timeout 120m
?       github.com/terraform-providers/terraform-provider-aws   [no test files]
=== RUN   TestAccAWSInstance_instanceProfileChange
=== PAUSE TestAccAWSInstance_instanceProfileChange
=== CONT  TestAccAWSInstance_instanceProfileChange
--- FAIL: TestAccAWSInstance_instanceProfileChange (288.59s)
    testing.go:635: Step 4 error: After applying this step, the plan was not empty:
        
        DIFF:
        
        UPDATE: aws_instance.test
          ami:                                       "ami-054a6c7ab667eefef" => "ami-054a6c7ab667eefef"
          arn:                                       "arn:aws:ec2:us-west-2:187416307283:instance/i-01556051a498e2f46" => "arn:aws:ec2:us-west-2:187416307283:instance/i-01556051a498e2f46"
          associate_public_ip_address:               "false" => "false"
          availability_zone:                         "us-west-2c" => "us-west-2c"
          cpu_core_count:                            "1" => "1"
          cpu_threads_per_core:                      "1" => "1"
          credit_specification.#:                    "0" => "0"
          disable_api_termination:                   "false" => "false"
          ebs_block_device.#:                        "0" => "0"
          ebs_optimized:                             "false" => "false"
          ephemeral_block_device.#:                  "0" => "0"
          get_password_data:                         "false" => "false"
          iam_instance_profile:                      "tf-testacc-instance-okvewpoey3sq" => "tf-testacc-instance-btxxqxelrysv"
          id:                                        "i-01556051a498e2f46" => "i-01556051a498e2f46"
          instance_state:                            "stopped" => "stopped"
          instance_type:                             "m1.small" => "m1.small"
          ipv6_address_count:                        "0" => "0"
          ipv6_addresses.#:                          "0" => "0"
          key_name:                                  "" => ""
          monitoring:                                "false" => "false"
          network_interface.#:                       "0" => "0"
          password_data:                             "" => ""
          placement_group:                           "" => ""
          primary_network_interface_id:              "eni-0c28c1cd080d3da24" => "eni-0c28c1cd080d3da24"
          private_dns:                               "ip-172-31-39-108.us-west-2.compute.internal" => "ip-172-31-39-108.us-west-2.compute.internal"
          private_ip:                                "172.31.39.108" => "172.31.39.108"
          public_dns:                                "" => ""
          public_ip:                                 "" => ""
          root_block_device.#:                       "1" => "1"
          root_block_device.0.delete_on_termination: "true" => "true"
          root_block_device.0.encrypted:             "false" => "false"
          root_block_device.0.iops:                  "0" => "0"
          root_block_device.0.kms_key_id:            "" => ""
          root_block_device.0.volume_id:             "vol-070f787eef52c226b" => "vol-070f787eef52c226b"
          root_block_device.0.volume_size:           "2" => "2"
          root_block_device.0.volume_type:           "standard" => "standard"
          security_groups.#:                         "1" => "1"
          security_groups.0:                         "default" => "default"
          source_dest_check:                         "true" => "true"
          subnet_id:                                 "subnet-0ba7e7e3b57ece13c" => "subnet-0ba7e7e3b57ece13c"
          tags.Name:                                 "tf-testacc-instance-btxxqxelrysv" => "tf-testacc-instance-btxxqxelrysv"
          tenancy:                                   "default" => "default"
          vpc_security_group_ids.#:                  "1" => "1"
          vpc_security_group_ids.0:                  "sg-1ca59078" => "sg-1ca59078"
        
        
        
        STATE:
...
FAIL
FAIL    github.com/terraform-providers/terraform-provider-aws/aws       290.088s
testing: warning: no tests to run
PASS
ok      github.com/terraform-providers/terraform-provider-aws/aws/internal/flatmap      0.031s [no tests to run]
testing: warning: no tests to run
PASS
ok      github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags 0.579s [no tests to run]
FAIL
make: *** [testacc] Error 1
  • Updated test, after the fix:
make testacc TESTARGS="-run=TestAccAWSInstance_instanceProfileChange"
==> Checking that code complies with gofmt requirements...
TF_ACC=1 go test ./... -v -count 1 -parallel 20 -run=TestAccAWSInstance_instanceProfileChange -timeout 120m
?       github.com/terraform-providers/terraform-provider-aws   [no test files]
=== RUN   TestAccAWSInstance_instanceProfileChange
=== PAUSE TestAccAWSInstance_instanceProfileChange
=== CONT  TestAccAWSInstance_instanceProfileChange
--- PASS: TestAccAWSInstance_instanceProfileChange (318.98s)
PASS
  • The other tests, after the fix:
--- SKIP: TestAccAWSInstance_inEc2Classic (2.07s)
--- PASS: TestAccAWSInstance_ipv6AddressCountAndSingleAddressCausesError (16.07s)
--- PASS: TestAccAWSInstance_GP2IopsDevice (65.05s)
--- PASS: TestAccAWSInstance_placementGroup (67.97s)
--- PASS: TestAccAWSInstance_GP2WithIopsValue (70.74s)
--- PASS: TestAccAWSInstance_vpc (80.24s)
--- PASS: TestAccAWSInstance_rootInstanceStore (81.31s)
--- PASS: TestAccAWSInstance_NetworkInstanceSecurityGroups (90.12s)
--- PASS: TestAccAWSInstance_inDefaultVpcBySgId (93.18s)
--- PASS: TestAccAWSInstance_blockDevices (95.52s)
--- PASS: TestAccAWSInstance_inDefaultVpcBySgName (98.72s)
--- PASS: TestAccAWSInstance_ipv6_supportAddressCountWithIpv4 (99.08s)
--- PASS: TestAccAWSInstance_ipv6_supportAddressCount (107.67s)
--- PASS: TestAccAWSInstance_NetworkInstanceRemovingAllSecurityGroups (92.95s)
--- PASS: TestAccAWSInstance_EbsBlockDevice_KmsKeyArn (109.97s)
--- PASS: TestAccAWSInstance_userDataBase64 (118.29s)
--- PASS: TestAccAWSInstance_basic (129.89s)
--- PASS: TestAccAWSInstance_disableApiTermination (130.68s)
--- PASS: TestAccAWSInstance_sourceDestCheck (137.17s)
--- PASS: TestAccAWSInstance_NetworkInstanceVPCSecurityGroupIDs (76.32s)
--- PASS: TestAccAWSInstance_volumeTags (90.72s)
--- PASS: TestAccAWSInstance_noAMIEphemeralDevices (179.26s)
--- PASS: TestAccAWSInstance_associatePublicIPAndPrivateIP (88.74s)
--- PASS: TestAccAWSInstance_volumeTagsComputed (108.70s)
--- PASS: TestAccAWSInstance_keyPairCheck (95.22s)
--- PASS: TestAccAWSInstance_primaryNetworkInterfaceSourceDestCheck (76.21s)
--- PASS: TestAccAWSInstance_withIamInstanceProfile (107.46s)
--- PASS: TestAccAWSInstance_primaryNetworkInterface (96.54s)
--- PASS: TestAccAWSInstance_associatePublic_defaultPrivate (77.07s)
--- PASS: TestAccAWSInstance_associatePublic_defaultPublic (75.99s)
--- PASS: TestAccAWSInstance_forceNewAndTagsDrift (115.70s)
--- PASS: TestAccAWSInstance_associatePublic_explicitPublic (74.58s)
--- PASS: TestAccAWSInstance_multipleRegions (238.53s)
--- PASS: TestAccAWSInstance_addSecurityGroupNetworkInterface (113.65s)
--- PASS: TestAccAWSInstance_addSecondaryInterface (120.36s)
--- PASS: TestAccAWSInstance_associatePublic_overridePublic (76.59s)
--- PASS: TestAccAWSInstance_associatePublic_explicitPrivate (86.12s)
--- PASS: TestAccAWSInstance_associatePublic_overridePrivate (77.82s)
--- PASS: TestAccAWSInstance_CreditSpecification_UnspecifiedToEmpty_NonBurstable (68.90s)
--- PASS: TestAccAWSInstance_rootBlockDeviceMismatch (176.78s)
--- PASS: TestAccAWSInstance_creditSpecification_unspecifiedDefaultsToStandard (74.60s)
--- PASS: TestAccAWSInstance_privateIP (198.91s)
--- PASS: TestAccAWSInstance_creditSpecification_standardCpuCredits (86.54s)
--- PASS: TestAccAWSInstance_creditSpecification_unlimitedCpuCredits (84.30s)
--- PASS: TestAccAWSInstance_creditSpecificationT3_standardCpuCredits (68.74s)
--- PASS: TestAccAWSInstance_RootBlockDevice_KmsKeyArn (335.06s)
--- PASS: TestAccAWSInstance_creditSpecification_updateCpuCredits (102.64s)
--- PASS: TestAccAWSInstance_getPasswordData_falseToTrue (148.22s)
--- PASS: TestAccAWSInstance_getPasswordData_trueToFalse (158.78s)
--- PASS: TestAccAWSInstance_UserData_EmptyStringToUnspecified (81.09s)
--- PASS: TestAccAWSInstance_tags (308.18s)
--- PASS: TestAccAWSInstance_creditSpecificationT3_unlimitedCpuCredits (115.30s)
--- PASS: TestAccAWSInstance_creditSpecificationT3_updateCpuCredits (120.05s)
--- PASS: TestAccAWSInstance_UserData_UnspecifiedToEmptyString (91.32s)
--- PASS: TestAccAWSInstance_creditSpecification_isNotAppliedToNonBurstable (209.05s)
--- PASS: TestAccAWSInstance_changeInstanceType (349.25s)
--- PASS: TestAccAWSInstance_disappears (211.16s)
--- PASS: TestAccAWSInstance_CreditSpecification_Empty_NonBurstable (309.21s)
--- PASS: TestAccAWSInstance_creditSpecification_unknownCpuCredits_t3 (299.62s)
--- PASS: TestAccAWSInstance_creditSpecificationT3_unspecifiedDefaultsToUnlimited (299.65s)
--- PASS: TestAccAWSInstance_creditSpecification_unknownCpuCredits_t2 (357.64s)
--- PASS: TestAccAWSInstance_creditSpecification_standardCpuCredits_t2Tot3Taint (367.62s)
--- PASS: TestAccAWSInstance_creditSpecification_unlimitedCpuCredits_t2Tot3Taint (391.93s)

@ryndaniels ryndaniels requested a review from a team December 3, 2019 12:37
@ghost ghost added needs-triage Waiting for first response or review from a maintainer. size/L Managed by automation to categorize the size of a PR. service/ec2 Issues and PRs that pertain to the ec2 service. tests PRs: expanded test coverage. Issues: expanded coverage, enhancements to test infrastructure. labels Dec 3, 2019
@ryndaniels ryndaniels self-assigned this Dec 3, 2019
@ryndaniels ryndaniels removed the needs-triage Waiting for first response or review from a maintainer. label Dec 3, 2019
Copy link
Contributor

@bflad bflad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should optimize this a little by removing the extra API calls and prefer using SDK constants, but looks good overall, so I'm going to optimistically approve assuming the updated test passes on any additional changes to the IAM profile logic. 😄 🚀

Output from acceptance testing:

--- PASS: TestAccAWSInstance_addSecondaryInterface (121.25s)
--- PASS: TestAccAWSInstance_addSecurityGroupNetworkInterface (110.40s)
--- PASS: TestAccAWSInstance_associatePublic_defaultPrivate (94.60s)
--- PASS: TestAccAWSInstance_associatePublic_defaultPublic (125.64s)
--- PASS: TestAccAWSInstance_associatePublic_explicitPrivate (84.26s)
--- PASS: TestAccAWSInstance_associatePublic_explicitPublic (74.33s)
--- PASS: TestAccAWSInstance_associatePublic_overridePrivate (246.11s)
--- PASS: TestAccAWSInstance_associatePublic_overridePublic (106.04s)
--- PASS: TestAccAWSInstance_associatePublicIPAndPrivateIP (74.08s)
--- PASS: TestAccAWSInstance_basic (258.75s)
--- PASS: TestAccAWSInstance_blockDevices (89.83s)
--- PASS: TestAccAWSInstance_changeInstanceType (365.43s)
--- PASS: TestAccAWSInstance_CreditSpecification_Empty_NonBurstable (299.15s)
--- PASS: TestAccAWSInstance_creditSpecification_isNotAppliedToNonBurstable (217.43s)
--- PASS: TestAccAWSInstance_creditSpecification_standardCpuCredits (98.31s)
--- PASS: TestAccAWSInstance_creditSpecification_standardCpuCredits_t2Tot3Taint (359.00s)
--- PASS: TestAccAWSInstance_creditSpecification_unknownCpuCredits_t2 (177.94s)
--- PASS: TestAccAWSInstance_creditSpecification_unknownCpuCredits_t3 (295.26s)
--- PASS: TestAccAWSInstance_creditSpecification_unlimitedCpuCredits (85.03s)
--- PASS: TestAccAWSInstance_creditSpecification_unlimitedCpuCredits_t2Tot3Taint (521.95s)
--- PASS: TestAccAWSInstance_creditSpecification_unspecifiedDefaultsToStandard (85.24s)
--- PASS: TestAccAWSInstance_CreditSpecification_UnspecifiedToEmpty_NonBurstable (114.62s)
--- PASS: TestAccAWSInstance_creditSpecification_updateCpuCredits (122.95s)
--- PASS: TestAccAWSInstance_creditSpecificationT3_standardCpuCredits (86.40s)
--- PASS: TestAccAWSInstance_creditSpecificationT3_unlimitedCpuCredits (113.26s)
--- PASS: TestAccAWSInstance_creditSpecificationT3_unspecifiedDefaultsToUnlimited (300.85s)
--- PASS: TestAccAWSInstance_creditSpecificationT3_updateCpuCredits (134.87s)
--- PASS: TestAccAWSInstance_disableApiTermination (109.61s)
--- PASS: TestAccAWSInstance_disappears (230.29s)
--- PASS: TestAccAWSInstance_EbsBlockDevice_KmsKeyArn (88.29s)
--- PASS: TestAccAWSInstance_forceNewAndTagsDrift (131.89s)
--- PASS: TestAccAWSInstance_getPasswordData_falseToTrue (169.17s)
--- PASS: TestAccAWSInstance_getPasswordData_trueToFalse (180.36s)
--- PASS: TestAccAWSInstance_GP2IopsDevice (79.60s)
--- PASS: TestAccAWSInstance_GP2WithIopsValue (134.66s)
--- PASS: TestAccAWSInstance_inDefaultVpcBySgId (83.03s)
--- PASS: TestAccAWSInstance_inDefaultVpcBySgName (112.97s)
--- PASS: TestAccAWSInstance_instanceProfileChange (281.48s)
--- PASS: TestAccAWSInstance_ipv6_supportAddressCount (89.97s)
--- PASS: TestAccAWSInstance_ipv6_supportAddressCountWithIpv4 (77.15s)
--- PASS: TestAccAWSInstance_ipv6AddressCountAndSingleAddressCausesError (10.52s)
--- PASS: TestAccAWSInstance_keyPairCheck (73.68s)
--- PASS: TestAccAWSInstance_multipleRegions (293.55s)
--- PASS: TestAccAWSInstance_NetworkInstanceRemovingAllSecurityGroups (86.56s)
--- PASS: TestAccAWSInstance_NetworkInstanceSecurityGroups (75.29s)
--- PASS: TestAccAWSInstance_NetworkInstanceVPCSecurityGroupIDs (119.89s)
--- PASS: TestAccAWSInstance_noAMIEphemeralDevices (174.36s)
--- PASS: TestAccAWSInstance_placementGroup (64.55s)
--- PASS: TestAccAWSInstance_primaryNetworkInterface (87.87s)
--- PASS: TestAccAWSInstance_primaryNetworkInterfaceSourceDestCheck (77.44s)
--- PASS: TestAccAWSInstance_privateIP (74.14s)
--- PASS: TestAccAWSInstance_RootBlockDevice_KmsKeyArn (181.73s)
--- PASS: TestAccAWSInstance_rootBlockDeviceMismatch (174.44s)
--- PASS: TestAccAWSInstance_rootInstanceStore (99.73s)
--- PASS: TestAccAWSInstance_sourceDestCheck (121.28s)
--- PASS: TestAccAWSInstance_tags (236.26s)
--- PASS: TestAccAWSInstance_UserData_EmptyStringToUnspecified (288.32s)
--- PASS: TestAccAWSInstance_UserData_UnspecifiedToEmptyString (83.88s)
--- PASS: TestAccAWSInstance_userDataBase64 (232.03s)
--- PASS: TestAccAWSInstance_volumeTags (100.32s)
--- PASS: TestAccAWSInstance_volumeTagsComputed (134.06s)
--- PASS: TestAccAWSInstance_vpc (186.42s)
--- PASS: TestAccAWSInstance_withIamInstanceProfile (215.41s)

--- PASS: TestAccAWSInstanceDataSource_AzUserData (240.93s)
--- PASS: TestAccAWSInstanceDataSource_basic (241.75s)
--- PASS: TestAccAWSInstanceDataSource_blockDevices (87.17s)
--- PASS: TestAccAWSInstanceDataSource_creditSpecification (107.65s)
--- PASS: TestAccAWSInstanceDataSource_EbsBlockDevice_KmsKeyId (86.02s)
--- PASS: TestAccAWSInstanceDataSource_getPasswordData_falseToTrue (152.66s)
--- PASS: TestAccAWSInstanceDataSource_getPasswordData_trueToFalse (213.82s)
--- PASS: TestAccAWSInstanceDataSource_GetUserData (126.47s)
--- PASS: TestAccAWSInstanceDataSource_GetUserData_NoUserData (292.59s)
--- PASS: TestAccAWSInstanceDataSource_gp2IopsDevice (66.24s)
--- PASS: TestAccAWSInstanceDataSource_keyPair (195.61s)
--- PASS: TestAccAWSInstanceDataSource_PlacementGroup (77.10s)
--- PASS: TestAccAWSInstanceDataSource_privateIP (100.23s)
--- PASS: TestAccAWSInstanceDataSource_RootBlockDevice_KmsKeyId (122.02s)
--- PASS: TestAccAWSInstanceDataSource_rootInstanceStore (95.99s)
--- PASS: TestAccAWSInstanceDataSource_SecurityGroups (130.19s)
--- PASS: TestAccAWSInstanceDataSource_tags (238.29s)
--- PASS: TestAccAWSInstanceDataSource_VPC (197.20s)
--- PASS: TestAccAWSInstanceDataSource_VPCSecurityGroups (100.23s)

--- PASS: TestAccAWSInstancesDataSource_basic (269.25s)
--- PASS: TestAccAWSInstancesDataSource_instance_state_names (201.45s)
--- PASS: TestAccAWSInstancesDataSource_tags (233.30s)


// If the instance is running, we can replace the instance profile association.
// If it is stopped, the association must be removed and the new one attached separately. (GH-8262)
resp, err := conn.DescribeInstances(&ec2.DescribeInstancesInput{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Potential optimization: we can save this extra API call by reading d.Get("instance_state").(string) for the instance state. 👍

instance := resp.Reservations[0].Instances[0]

if instance.State != nil {
if *instance.State.Name == "running" {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prefer AWS Go SDK conversion functions and constants here and below 😄

Suggested change
if *instance.State.Name == "running" {
if aws.StringValue(instance.State.Name) == ec2.InstanceStateNameRunning {

Does this also need to handle other instance states such as shutting-down and stopping?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point - it looks like before, those cases would have fallen into the "running" behavior in the code. I suspect that shutting-down and stopping probably ought to fall into the stopped state, so I think I'll group those together and have every other state fall through to the old behavior. That way we'll keep things as consistent as possible, and if people run into issues with other state edge cases, we can address those as they come up. 👍

Comment on lines 1002 to 1006
resp2, err := conn.DescribeIamInstanceProfileAssociations(request)
if err != nil {
return err
}
if len(resp2.IamInstanceProfileAssociations) > 0 {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This extra API call and conditional seem extraneous since we already check the number of associations on line 955 and get here by the length not being equal to 0.

Comment on lines 1345 to 1348
if err != nil {
return err
}
return nil
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: If we are not going to return context with the error, e.g.

if err != nil {
  return fmt.Errorf("error disassociating instance with instance profile: %w", err)
}

We should just directly return err 👍

_, err = conn.AssociateIamInstanceProfile(input)
}
if err != nil {
return fmt.Errorf("Error associating instance with instance profile: %s", err)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Go 1.13 allows us to return the wrapped error along with our context (e.g. an underlying InvalidInstanceID.NotFound error) by using the %w format verb. Going forward, we should likely switch to using that verb when returning error context with helper functions like these, so any consumers of these helper functions that want to check for specific error codes with isAWSErr() will work as expected.

Suggested change
return fmt.Errorf("Error associating instance with instance profile: %s", err)
return fmt.Errorf("error associating instance with instance profile: %w", err)

This is a problem we'll want to address more globally going forward, but just noting here for additional visibility.

@bflad bflad added the bug Addresses a defect in current functionality. label Jan 7, 2020
@ryndaniels
Copy link
Contributor Author

Updated test still passing after changes: 🙂

make testacc TESTARGS="-run=TestAccAWSSSMDocument_package"==> Checking that code complies with gofmt requirements...
TF_ACC=1 go test ./... -v -count 1 -parallel 20 -run=TestAccAWSSSMDocument_package -timeout 120m
?       github.com/terraform-providers/terraform-provider-aws   [no test files]
=== RUN   TestAccAWSSSMDocument_package
=== PAUSE TestAccAWSSSMDocument_package
=== CONT  TestAccAWSSSMDocument_package
--- PASS: TestAccAWSSSMDocument_package (140.09s)
PASS
ok      github.com/terraform-providers/terraform-provider-aws/aws       140.936s

@ryndaniels ryndaniels added this to the v2.44.0 milestone Jan 8, 2020
@ryndaniels ryndaniels merged commit 7a6a14e into master Jan 8, 2020
@ghost
Copy link

ghost commented Jan 10, 2020

This has been released in version 2.44.0 of the Terraform AWS provider. Please see the Terraform documentation on provider versioning or reach out if you need any assistance upgrading.

For further feature requests or bug reports with this functionality, please create a new GitHub issue following the template for triage. Thanks!

@ghost
Copy link

ghost commented Mar 27, 2020

I'm going to lock this issue because it has been closed for 30 days ⏳. This helps our maintainers find and focus on the active issues.

If you feel this issue should be reopened, we encourage creating a new issue linking back to this one for added context. Thanks!

@ghost ghost locked and limited conversation to collaborators Mar 27, 2020
@bflad bflad deleted the rfd-instance-role-change branch April 23, 2020 03:38
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Addresses a defect in current functionality. service/ec2 Issues and PRs that pertain to the ec2 service. size/L Managed by automation to categorize the size of a PR. tests PRs: expanded test coverage. Issues: expanded coverage, enhancements to test infrastructure.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Error on EC2 instance role change
2 participants