From a96e7a03e1018fb7f878975ac0ec155f9b0496dd Mon Sep 17 00:00:00 2001 From: Maxime de Roucy Date: Fri, 7 Jul 2023 14:50:23 +0200 Subject: [PATCH 1/5] add AWSRetry.jittered_backoff on client.describe_instance_attribute (fix InvalidInstanceID.NotFound) --- plugins/modules/ec2_instance.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/plugins/modules/ec2_instance.py b/plugins/modules/ec2_instance.py index a857ee58c4f..00f9ce89622 100644 --- a/plugins/modules/ec2_instance.py +++ b/plugins/modules/ec2_instance.py @@ -1443,7 +1443,13 @@ def value_wrapper(v): continue try: - value = client.describe_instance_attribute(aws_retry=True, Attribute=mapping.attribute_name, InstanceId=id_) + value = AWSRetry.jittered_backoff( + catch_extra_error_codes=["InvalidInstanceID.NotFound"], + )(client.describe_instance_attribute)( + aws_retry=True, + Attribute=mapping.attribute_name, + InstanceId=id_ + ) except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: module.fail_json_aws(e, msg=f"Could not describe attribute {mapping.attribute_name} for instance {id_}") if value[mapping.instance_key]["Value"] != params.get(mapping.param_key): @@ -1456,7 +1462,13 @@ def value_wrapper(v): if params.get("security_group") or params.get("security_groups"): try: - value = client.describe_instance_attribute(aws_retry=True, Attribute="groupSet", InstanceId=id_) + value = AWSRetry.jittered_backoff( + catch_extra_error_codes=["InvalidInstanceID.NotFound"], + )(client.describe_instance_attribute)( + aws_retry=True, + Attribute="groupSet", + InstanceId=id_ + ) except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: module.fail_json_aws(e, msg=f"Could not describe attribute groupSet for instance {id_}") # managing security groups From 56c942a06e2ef416ac92e41f686bed7dac32686a Mon Sep 17 00:00:00 2001 From: Maxime de Roucy Date: Sat, 12 Aug 2023 19:05:44 +0200 Subject: [PATCH 2/5] add InvalidInstanceID.NotFound to the list of error codes that should trigger a retry (catch_extra_error_codes) --- .../1650-fix-invalidinstanceid-notfound.yml | 3 +++ plugins/modules/ec2_instance.py | 24 ++++--------------- 2 files changed, 7 insertions(+), 20 deletions(-) create mode 100644 changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml diff --git a/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml b/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml new file mode 100644 index 00000000000..397e0036207 --- /dev/null +++ b/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml @@ -0,0 +1,3 @@ +--- +bugfixes: + ec2_instance - retry API call if we get `InvalidGroup.NotFound` error. diff --git a/plugins/modules/ec2_instance.py b/plugins/modules/ec2_instance.py index 00f9ce89622..fb7263952cb 100644 --- a/plugins/modules/ec2_instance.py +++ b/plugins/modules/ec2_instance.py @@ -1443,13 +1443,7 @@ def value_wrapper(v): continue try: - value = AWSRetry.jittered_backoff( - catch_extra_error_codes=["InvalidInstanceID.NotFound"], - )(client.describe_instance_attribute)( - aws_retry=True, - Attribute=mapping.attribute_name, - InstanceId=id_ - ) + value = client.describe_instance_attribute(aws_retry=True, Attribute=mapping.attribute_name, InstanceId=id_) except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: module.fail_json_aws(e, msg=f"Could not describe attribute {mapping.attribute_name} for instance {id_}") if value[mapping.instance_key]["Value"] != params.get(mapping.param_key): @@ -1462,13 +1456,7 @@ def value_wrapper(v): if params.get("security_group") or params.get("security_groups"): try: - value = AWSRetry.jittered_backoff( - catch_extra_error_codes=["InvalidInstanceID.NotFound"], - )(client.describe_instance_attribute)( - aws_retry=True, - Attribute="groupSet", - InstanceId=id_ - ) + value = client.describe_instance_attribute(aws_retry=True, Attribute="groupSet", InstanceId=id_) except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: module.fail_json_aws(e, msg=f"Could not describe attribute groupSet for instance {id_}") # managing security groups @@ -1962,12 +1950,7 @@ def ensure_present(existing_matches, desired_module_state, current_count=None): for ins in instances: # Wait for instances to exist (don't check state) try: - AWSRetry.jittered_backoff( - catch_extra_error_codes=["InvalidInstanceID.NotFound"], - )(client.describe_instance_status)( - InstanceIds=[ins["InstanceId"]], - IncludeAllInstances=True, - ) + client.describe_instance_status(InstanceIds=[ins["InstanceId"]], IncludeAllInstances=True) except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: module.fail_json_aws(e, msg="Failed to fetch status of new EC2 instance") changes = diff_instance_and_params(ins, module.params, skip=["UserData", "EbsOptimized"]) @@ -2177,6 +2160,7 @@ def main(): catch_extra_error_codes=[ "IncorrectState", "InsuffienctInstanceCapacity", + "InvalidInstanceID.NotFound", ] ) client = module.client("ec2", retry_decorator=retry_decorator) From cbcffab16d1fcf5dd9777a7748f6c0de2f0c141b Mon Sep 17 00:00:00 2001 From: Maxime de Roucy Date: Sun, 27 Aug 2023 12:31:03 +0200 Subject: [PATCH 3/5] add InvalidInstanceID.NotFound to the list of error codes that should trigger a retry (catch_extra_error_codes) --- changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml b/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml index 397e0036207..4a45a9645d8 100644 --- a/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml +++ b/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml @@ -1,3 +1,3 @@ --- bugfixes: - ec2_instance - retry API call if we get `InvalidGroup.NotFound` error. + ec2_instance - retry API call if we get `InvalidGroup.NotFound` error (https://github.com/ansible-collections/amazon.aws/pull/1650). From 1e24a474d628328be77eb81b7d55755a32682584 Mon Sep 17 00:00:00 2001 From: Helen Bailey Date: Fri, 1 Sep 2023 11:41:22 -0400 Subject: [PATCH 4/5] Update changelog fragment --- changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml b/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml index 4a45a9645d8..7ffe218892b 100644 --- a/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml +++ b/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml @@ -1,3 +1,3 @@ --- bugfixes: - ec2_instance - retry API call if we get `InvalidGroup.NotFound` error (https://github.com/ansible-collections/amazon.aws/pull/1650). + - ec2_instance - retry API call if we get ``InvalidGroup.NotFound`` error (https://github.com/ansible-collections/amazon.aws/pull/1650). From a9854c3c9c508123c800beb7ce873b4e54c52a85 Mon Sep 17 00:00:00 2001 From: Maxime de Roucy Date: Sun, 15 Oct 2023 13:20:53 +0200 Subject: [PATCH 5/5] add InvalidInstanceID.NotFound to the list of error codes that should trigger a retry (catch_extra_error_codes) --- .../fragments/1650-fix-invalidinstanceid-notfound.yml | 2 +- plugins/modules/ec2_instance.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml b/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml index 7ffe218892b..8953b2390a1 100644 --- a/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml +++ b/changelogs/fragments/1650-fix-invalidinstanceid-notfound.yml @@ -1,3 +1,3 @@ --- bugfixes: - - ec2_instance - retry API call if we get ``InvalidGroup.NotFound`` error (https://github.com/ansible-collections/amazon.aws/pull/1650). + - ec2_instance - retry API call if we get ``InvalidInstanceID.NotFound`` error (https://github.com/ansible-collections/amazon.aws/pull/1650). diff --git a/plugins/modules/ec2_instance.py b/plugins/modules/ec2_instance.py index fb7263952cb..0dc9b9be856 100644 --- a/plugins/modules/ec2_instance.py +++ b/plugins/modules/ec2_instance.py @@ -1950,7 +1950,12 @@ def ensure_present(existing_matches, desired_module_state, current_count=None): for ins in instances: # Wait for instances to exist (don't check state) try: - client.describe_instance_status(InstanceIds=[ins["InstanceId"]], IncludeAllInstances=True) + AWSRetry.jittered_backoff( + catch_extra_error_codes=["InvalidInstanceID.NotFound"], + )(client.describe_instance_status)( + InstanceIds=[ins["InstanceId"]], + IncludeAllInstances=True, + ) except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: module.fail_json_aws(e, msg="Failed to fetch status of new EC2 instance") changes = diff_instance_and_params(ins, module.params, skip=["UserData", "EbsOptimized"])