@@ -100,6 +100,23 @@ def _tls_ca_chain_filename(self) -> str:
100
100
return f"{ self .charm ._storage_path } /pgbackrest-tls-ca-chain.crt"
101
101
return ""
102
102
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
+
103
120
def _are_backup_settings_ok (self ) -> tuple [bool , str | None ]:
104
121
"""Validates whether backup settings are OK."""
105
122
if self .model .get_relation (self .relation_name ) is None :
@@ -258,18 +275,9 @@ def _create_bucket_if_not_exists(self) -> None:
258
275
259
276
bucket_name = s3_parameters ["bucket" ]
260
277
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
- )
266
278
267
279
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 )
273
281
except ValueError as e :
274
282
logger .exception ("Failed to create a session '%s' in region=%s." , bucket_name , region )
275
283
raise e
@@ -1372,17 +1380,7 @@ def _upload_content_to_s3(
1372
1380
processed_s3_path = os .path .join (s3_parameters ["path" ], s3_path ).lstrip ("/" )
1373
1381
try :
1374
1382
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 )
1386
1384
bucket = s3 .Bucket (bucket_name )
1387
1385
1388
1386
with tempfile .NamedTemporaryFile () as temp_file :
@@ -1415,16 +1413,7 @@ def _read_content_from_s3(self, s3_path: str, s3_parameters: dict) -> str | None
1415
1413
processed_s3_path = os .path .join (s3_parameters ["path" ], s3_path ).lstrip ("/" )
1416
1414
try :
1417
1415
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 )
1428
1417
bucket = s3 .Bucket (bucket_name )
1429
1418
with BytesIO () as buf :
1430
1419
bucket .download_fileobj (processed_s3_path , buf )
0 commit comments