|
15 | 15 |
|
16 | 16 | from io import BytesIO
|
17 | 17 | import zipfile
|
| 18 | +import time |
18 | 19 | from botocore.exceptions import ClientError
|
19 | 20 | from sagemaker.session import Session
|
20 | 21 |
|
@@ -134,32 +135,35 @@ def update(self):
|
134 | 135 | Returns: boto3 response from Lambda's update_function method.
|
135 | 136 | """
|
136 | 137 | lambda_client = _get_lambda_client(self.session)
|
137 |
| - |
138 |
| - if self.script is not None: |
139 |
| - try: |
140 |
| - response = lambda_client.update_function_code( |
141 |
| - FunctionName=self.function_name, ZipFile=_zip_lambda_code(self.script) |
142 |
| - ) |
143 |
| - return response |
144 |
| - except ClientError as e: |
145 |
| - error = e.response["Error"] |
146 |
| - raise ValueError(error) |
147 |
| - else: |
| 138 | + retry_attempts = 7 |
| 139 | + for i in range(retry_attempts): |
148 | 140 | try:
|
149 |
| - response = lambda_client.update_function_code( |
150 |
| - FunctionName=(self.function_name or self.function_arn), |
151 |
| - S3Bucket=self.s3_bucket, |
152 |
| - S3Key=_upload_to_s3( |
153 |
| - s3_client=_get_s3_client(self.session), |
154 |
| - function_name=self.function_name, |
155 |
| - zipped_code_dir=self.zipped_code_dir, |
156 |
| - s3_bucket=self.s3_bucket, |
157 |
| - ), |
158 |
| - ) |
| 141 | + if self.script is not None: |
| 142 | + response = lambda_client.update_function_code( |
| 143 | + FunctionName=self.function_name, ZipFile=_zip_lambda_code(self.script) |
| 144 | + ) |
| 145 | + else: |
| 146 | + response = lambda_client.update_function_code( |
| 147 | + FunctionName=(self.function_name or self.function_arn), |
| 148 | + S3Bucket=self.s3_bucket, |
| 149 | + S3Key=_upload_to_s3( |
| 150 | + s3_client=_get_s3_client(self.session), |
| 151 | + function_name=self.function_name, |
| 152 | + zipped_code_dir=self.zipped_code_dir, |
| 153 | + s3_bucket=self.s3_bucket, |
| 154 | + ), |
| 155 | + ) |
159 | 156 | return response
|
160 | 157 | except ClientError as e:
|
161 | 158 | error = e.response["Error"]
|
162 |
| - raise ValueError(error) |
| 159 | + code = error["Code"] |
| 160 | + if code == "ResourceConflictException": |
| 161 | + if i == retry_attempts - 1: |
| 162 | + raise ValueError(error) |
| 163 | + # max wait time = 2**0 + 2**1 + .. + 2**6 = 127 seconds |
| 164 | + time.sleep(2**i) |
| 165 | + else: |
| 166 | + raise ValueError(error) |
163 | 167 |
|
164 | 168 | def upsert(self):
|
165 | 169 | """Method to create a lambda function or update it if it already exists
|
|
0 commit comments