@@ -100,6 +100,23 @@ def _tls_ca_chain_filename(self) -> str:
100100 return f"{ self .charm ._storage_path } /pgbackrest-tls-ca-chain.crt"
101101 return ""
102102
103+ def _get_s3_session_resource (self , s3_parameters : dict ):
104+ session = boto3 .session .Session (
105+ aws_access_key_id = s3_parameters ["access-key" ],
106+ aws_secret_access_key = s3_parameters ["secret-key" ],
107+ region_name = s3_parameters ["region" ],
108+ )
109+ return session .resource (
110+ "s3" ,
111+ endpoint_url = self ._construct_endpoint (s3_parameters ),
112+ verify = (self ._tls_ca_chain_filename or None ),
113+ config = botocore .client .Config (
114+ # https://github.com/boto/boto3/issues/4400#issuecomment-2600742103
115+ request_checksum_calculation = "when_required" ,
116+ response_checksum_validation = "when_required" ,
117+ ),
118+ )
119+
103120 def _are_backup_settings_ok (self ) -> tuple [bool , str | None ]:
104121 """Validates whether backup settings are OK."""
105122 if self .model .get_relation (self .relation_name ) is None :
@@ -258,18 +275,9 @@ def _create_bucket_if_not_exists(self) -> None:
258275
259276 bucket_name = s3_parameters ["bucket" ]
260277 region = s3_parameters .get ("region" )
261- session = boto3 .session .Session (
262- aws_access_key_id = s3_parameters ["access-key" ],
263- aws_secret_access_key = s3_parameters ["secret-key" ],
264- region_name = s3_parameters ["region" ],
265- )
266278
267279 try :
268- s3 = session .resource (
269- "s3" ,
270- endpoint_url = self ._construct_endpoint (s3_parameters ),
271- verify = (self ._tls_ca_chain_filename or None ),
272- )
280+ s3 = self ._get_s3_session_resource (s3_parameters )
273281 except ValueError as e :
274282 logger .exception ("Failed to create a session '%s' in region=%s." , bucket_name , region )
275283 raise e
@@ -1372,17 +1380,7 @@ def _upload_content_to_s3(
13721380 processed_s3_path = os .path .join (s3_parameters ["path" ], s3_path ).lstrip ("/" )
13731381 try :
13741382 logger .info (f"Uploading content to bucket={ bucket_name } , path={ processed_s3_path } " )
1375- session = boto3 .session .Session (
1376- aws_access_key_id = s3_parameters ["access-key" ],
1377- aws_secret_access_key = s3_parameters ["secret-key" ],
1378- region_name = s3_parameters ["region" ],
1379- )
1380-
1381- s3 = session .resource (
1382- "s3" ,
1383- endpoint_url = self ._construct_endpoint (s3_parameters ),
1384- verify = (self ._tls_ca_chain_filename or None ),
1385- )
1383+ s3 = self ._get_s3_session_resource (s3_parameters )
13861384 bucket = s3 .Bucket (bucket_name )
13871385
13881386 with tempfile .NamedTemporaryFile () as temp_file :
@@ -1415,16 +1413,7 @@ def _read_content_from_s3(self, s3_path: str, s3_parameters: dict) -> str | None
14151413 processed_s3_path = os .path .join (s3_parameters ["path" ], s3_path ).lstrip ("/" )
14161414 try :
14171415 logger .info (f"Reading content from bucket={ bucket_name } , path={ processed_s3_path } " )
1418- session = boto3 .session .Session (
1419- aws_access_key_id = s3_parameters ["access-key" ],
1420- aws_secret_access_key = s3_parameters ["secret-key" ],
1421- region_name = s3_parameters ["region" ],
1422- )
1423- s3 = session .resource (
1424- "s3" ,
1425- endpoint_url = self ._construct_endpoint (s3_parameters ),
1426- verify = (self ._tls_ca_chain_filename or None ),
1427- )
1416+ s3 = self ._get_s3_session_resource (s3_parameters )
14281417 bucket = s3 .Bucket (bucket_name )
14291418 with BytesIO () as buf :
14301419 bucket .download_fileobj (processed_s3_path , buf )
0 commit comments