diff --git a/changelogs/fragments/857-lambda-wait-before.yml b/changelogs/fragments/857-lambda-wait-before.yml new file mode 100644 index 00000000000..87116dfe916 --- /dev/null +++ b/changelogs/fragments/857-lambda-wait-before.yml @@ -0,0 +1,3 @@ +bugfixes: + - execute_lambda - Wait for Lambda function State = Active before executing (https://github.com/ansible-collections/community.aws/pull/857) + - lambda - Wait for Lambda function State = Active & LastUpdateStatus = Successful before updating (https://github.com/ansible-collections/community.aws/pull/857) diff --git a/plugins/modules/execute_lambda.py b/plugins/modules/execute_lambda.py index 7af644810a8..b4cbb4a53de 100644 --- a/plugins/modules/execute_lambda.py +++ b/plugins/modules/execute_lambda.py @@ -202,6 +202,9 @@ def main(): elif name: invoke_params['FunctionName'] = name + if not module.check_mode: + wait_for_lambda(client, module, name) + try: response = client.invoke(**invoke_params) except is_boto3_error_code('ResourceNotFoundException') as nfe: @@ -255,5 +258,15 @@ def main(): module.exit_json(changed=True, result=results) +def wait_for_lambda(client, module, name): + try: + waiter = client.get_waiter('function_active') + waiter.wait(FunctionName=name) + except botocore.exceptions.WaiterError as e: + module.fail_json_aws(e, msg='Timeout while waiting on lambda to be Active') + except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e: + module.fail_json_aws(e, msg='Failed while waiting on lambda to be Active') + + if __name__ == '__main__': main() diff --git a/plugins/modules/lambda.py b/plugins/modules/lambda.py index 1605d6497db..923b1646c3d 100644 --- a/plugins/modules/lambda.py +++ b/plugins/modules/lambda.py @@ -216,7 +216,7 @@ import re try: - from botocore.exceptions import ClientError, BotoCoreError + from botocore.exceptions import ClientError, BotoCoreError, WaiterError except ImportError: pass # protected by AnsibleAWSModule @@ -320,6 +320,18 @@ def set_tag(client, module, tags, function): return changed +def wait_for_lambda(client, module, name): + try: + client_active_waiter = client.get_waiter('function_active') + client_updated_waiter = client.get_waiter('function_updated') + client_active_waiter.wait(FunctionName=name) + client_updated_waiter.wait(FunctionName=name) + except WaiterError as e: + module.fail_json_aws(e, msg='Timeout while waiting on lambda to finish updating') + except (ClientError, BotoCoreError) as e: + module.fail_json_aws(e, msg='Failed while waiting on lambda to finish updating') + + def main(): argument_spec = dict( name=dict(required=True), @@ -453,6 +465,9 @@ def main(): # Upload new configuration if configuration has changed if len(func_kwargs) > 1: + if not check_mode: + wait_for_lambda(client, module, name) + try: if not check_mode: response = client.update_function_configuration(aws_retry=True, **func_kwargs) @@ -494,6 +509,9 @@ def main(): # Upload new code if needed (e.g. code checksum has changed) if len(code_kwargs) > 2: + if not check_mode: + wait_for_lambda(client, module, name) + try: if not check_mode: response = client.update_function_code(aws_retry=True, **code_kwargs)