boto / boto3

AWS SDK for Python
https://aws.amazon.com/sdk-for-python/
Apache License 2.0
8.99k stars 1.86k forks source link

Error while using upload_fileobj() #4167

Closed EkanshZetaGlobal closed 3 months ago

EkanshZetaGlobal commented 3 months ago

Describe the bug

While using upload_fileobj I receive this error:

expires_in = timedelta(seconds=response["expiresIn"])
KeyError: 'expiresIn'

coming from botocore/tokens.py line number 262

Expected Behavior

It should successfully upload the object to designated s3 bucket

Current Behavior

While using upload_fileobj I receive this error:

expires_in = timedelta(seconds=response["expiresIn"])
KeyError: 'expiresIn'

coming from botocore/tokens.py line number 262

Reproduction Steps

import io import boto3

Create a small in-memory file

file_content = b"Hello, this is a test file content." in_memory_file = io.BytesIO(file_content) in_memory_file.seek(0) # Ensure the file pointer is at the start

Create a boto3 session (use your AWS profile)

session = boto3.Session(profile_name=os.environ.get("AWS_SSO_PROFILE")) s3 = session.client("s3")

s3.upload_fileobj(in_memory_file, bucket_name, s3_key_name) print(f"File uploaded successfully to {bucket_name}/{s3_key_name}")

Possible Solution

No response

Additional Information/Context

Complete traceback here:

KeyError Traceback (most recent call last) File ~/git_repos/project-repo/zh_assistants_service/utils/s3.py:100, in upload_file_content_to_s3(file_data, bucket_name, s3_key, endpoint_url) 99 s3 = boto3.client("s3", endpoint_url=endpoint_url) --> 100 s3.upload_fileobj(in_memory_file, bucket_name, s3_key) 102 except Exception as e:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/boto3/s3/inject.py:642, in upload_fileobj(self, Fileobj, Bucket, Key, ExtraArgs, Callback, Config) 635 future = manager.upload( 636 fileobj=Fileobj, 637 bucket=Bucket, (...) 640 subscribers=subscribers, 641 ) --> 642 return future.result()

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/s3transfer/futures.py:103, in TransferFuture.result(self) 99 try: 100 # Usually the result() method blocks until the transfer is done, 101 # however if a KeyboardInterrupt is raised we want want to exit 102 # out of this and propagate the exception. --> 103 return self._coordinator.result() 104 except KeyboardInterrupt as e:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/s3transfer/futures.py:266, in TransferCoordinator.result(self) 265 if self._exception: --> 266 raise self._exception 267 return self._result

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/s3transfer/tasks.py:139, in Task.call(self) 138 if not self._transfer_coordinator.done(): --> 139 return self._execute_main(kwargs) 140 except Exception as e:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/s3transfer/tasks.py:162, in Task._execute_main(self, kwargs) 160 logger.debug(f"Executing task {self} with kwargs {kwargs_to_display}") --> 162 return_value = self._main(**kwargs) 163 # If the task is the final task, then set the TransferFuture's 164 # value to the return value from main().

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/s3transfer/upload.py:764, in PutObjectTask._main(self, client, fileobj, bucket, key, extra_args) 763 with fileobj as body: --> 764 client.put_object(Bucket=bucket, Key=key, Body=body, **extra_args)

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/client.py:565, in ClientCreator._create_api_method.._api_call(self, *args, **kwargs) 564 # The "self" in this scope is referring to the BaseClient. --> 565 return self._make_api_call(operation_name, kwargs)

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/client.py:1001, in BaseClient._make_api_call(self, operation_name, api_params) 1000 apply_request_checksum(request_dict) -> 1001 http, parsed_response = self._make_request( 1002 operation_model, request_dict, request_context 1003 ) 1005 self.meta.events.emit( 1006 'after-call.{service_id}.{operation_name}'.format( 1007 service_id=service_id, operation_name=operation_name (...) 1012 context=request_context, 1013 )

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/client.py:1027, in BaseClient._make_request(self, operation_model, request_dict, request_context) 1026 try: -> 1027 return self._endpoint.make_request(operation_model, request_dict) 1028 except Exception as e:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/endpoint.py:119, in Endpoint.make_request(self, operation_model, request_dict) 114 logger.debug( 115 "Making request for %s with params: %s", 116 operation_model, 117 request_dict, 118 ) --> 119 return self._send_request(request_dict, operation_model)

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/endpoint.py:198, in Endpoint._send_request(self, request_dict, operation_model) 197 self._update_retries_context(context, attempts) --> 198 request = self.create_request(request_dict, operation_model) 199 success_response, exception = self._get_response( 200 request, operation_model, context 201 )

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/endpoint.py:134, in Endpoint.create_request(self, params, operation_model) 131 event_name = 'request-created.{service_id}.{op_name}'.format( 132 service_id=service_id, op_name=operation_model.name 133 ) --> 134 self._event_emitter.emit( 135 event_name, 136 request=request, 137 operation_name=operation_model.name, 138 ) 139 prepared_request = self.prepare_request(request)

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/hooks.py:412, in EventAliaser.emit(self, event_name, kwargs) 411 aliased_event_name = self._alias_event_name(event_name) --> 412 return self._emitter.emit(aliased_event_name, kwargs)

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/hooks.py:256, in HierarchicalEmitter.emit(self, event_name, **kwargs) 246 """ 247 Emit an event by name with arguments passed as keyword args. 248 (...) 254 handlers. 255 """ --> 256 return self._emit(event_name, kwargs)

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/hooks.py:239, in HierarchicalEmitter._emit(self, event_name, kwargs, stop_on_response) 238 logger.debug('Event %s: calling handler %s', event_name, handler) --> 239 response = handler(**kwargs) 240 responses.append((handler, response))

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/signers.py:105, in RequestSigner.handler(self, operation_name, request, kwargs) 100 def handler(self, operation_name=None, request=None, kwargs): 101 # This is typically hooked up to the "request-created" event 102 # from a client's event emitter. When a new request is created 103 # this method is invoked to sign the request. 104 # Don't call this method directly. --> 105 return self.sign(operation_name, request)

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/signers.py:190, in RequestSigner.sign(self, operation_name, request, region_name, signing_type, expires_in, signing_name) 189 try: --> 190 auth = self.get_auth_instance(**kwargs) 191 except UnknownSignatureVersionError as e:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/signers.py:310, in RequestSigner.get_auth_instance(self, signing_name, region_name, signature_version, request_credentials, **kwargs) 309 if credentials is not None: --> 310 frozen_credentials = credentials.get_frozen_credentials() 311 kwargs['credentials'] = frozen_credentials

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/credentials.py:634, in RefreshableCredentials.get_frozen_credentials(self) 601 """Return immutable credentials. 602 603 The access_key, secret_key, and token properties (...) 632 633 """ --> 634 self._refresh() 635 return self._frozen_credentials

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/credentials.py:522, in RefreshableCredentials._refresh(self) 519 is_mandatory_refresh = self.refresh_needed( 520 self._mandatory_refresh_timeout 521 ) --> 522 self._protected_refresh(is_mandatory=is_mandatory_refresh) 523 return

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/credentials.py:538, in RefreshableCredentials._protected_refresh(self, is_mandatory) 537 try: --> 538 metadata = self._refresh_using() 539 except Exception:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/credentials.py:685, in CachedCredentialFetcher.fetch_credentials(self) 684 def fetch_credentials(self): --> 685 return self._get_cached_credentials()

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/credentials.py:695, in CachedCredentialFetcher._get_cached_credentials(self) 694 if response is None: --> 695 response = self._get_credentials() 696 self._write_to_cache(response)

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/credentials.py:2150, in SSOCredentialFetcher._get_credentials(self) 2149 initial_token_data = self._token_provider.load_token() -> 2150 token = initial_token_data.get_frozen_token().token 2151 else:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/tokens.py:82, in DeferredRefreshableToken.get_frozen_token(self) 81 def get_frozen_token(self): ---> 82 self._refresh() 83 return self._frozen_token

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/tokens.py:95, in DeferredRefreshableToken._refresh(self) 94 try: ---> 95 self._protected_refresh() 96 finally:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/tokens.py:109, in DeferredRefreshableToken._protected_refresh(self) 108 self._next_refresh = now + timedelta(seconds=self._attempt_timeout) --> 109 self._frozen_token = self._refresh_using() 110 except Exception:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/tokens.py:312, in SSOTokenProvider._refresher(self) 311 if remaining < self._REFRESH_WINDOW: --> 312 new_token_dict = self._refresh_access_token(token_dict) 313 if new_token_dict is not None:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/tokens.py:297, in SSOTokenProvider._refresh_access_token(self, token) 296 try: --> 297 return self._attempt_create_token(token) 298 except ClientError:

File ~/.pyenv/versions/3.10.2/envs/project-repo/lib/python3.10/site-packages/botocore/tokens.py:262, in SSOTokenProvider._attempt_create_token(self, token) 256 response = self._client.create_token( 257 grantType=self._GRANT_TYPE, 258 clientId=token["clientId"], 259 clientSecret=token["clientSecret"], 260 refreshToken=token["refreshToken"], 261 ) --> 262 expires_in = timedelta(seconds=response["expiresIn"]) 263 new_token = { 264 "startUrl": self._sso_config["sso_start_url"], 265 "region": self._sso_config["sso_region"], (...) 271 "registrationExpiresAt": token["registrationExpiresAt"], 272 }

KeyError: 'expiresIn'

SDK version used

boto3 version: 1.34.127 botocore version: 1.34.127

Environment details (OS name and version, etc.)

14.1.1 (23B81)

mohit975 commented 3 months ago

Hi, Did you check if S3 bucket have object lock enabled ?

github-actions[bot] commented 3 months ago

This issue is now closed. Comments on closed issues are hard for our team to see. If you need more assistance, please open a new issue that references this one.