mirror of https://github.com/scrapy/scrapy.git
Lazy initialization for S3 clients since credentials expire with time
This commit is contained in:
parent
870803b7fb
commit
70a9762d52
|
|
@ -15,6 +15,7 @@ import warnings
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from collections.abc import Callable, Coroutine
|
from collections.abc import Callable, Coroutine
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
|
from functools import cached_property
|
||||||
from pathlib import Path, PureWindowsPath
|
from pathlib import Path, PureWindowsPath
|
||||||
from tempfile import NamedTemporaryFile
|
from tempfile import NamedTemporaryFile
|
||||||
from typing import IO, TYPE_CHECKING, Any, Protocol, TypeAlias, cast
|
from typing import IO, TYPE_CHECKING, Any, Protocol, TypeAlias, cast
|
||||||
|
|
@ -197,10 +198,6 @@ class S3FeedStorage(BlockingFeedStorage):
|
||||||
session_token: str | None = None,
|
session_token: str | None = None,
|
||||||
region_name: str | None = None,
|
region_name: str | None = None,
|
||||||
):
|
):
|
||||||
try:
|
|
||||||
import boto3.session # noqa: PLC0415
|
|
||||||
except ImportError:
|
|
||||||
raise NotConfigured("missing boto3 library") from None
|
|
||||||
u = urlparse(uri)
|
u = urlparse(uri)
|
||||||
assert u.hostname
|
assert u.hostname
|
||||||
self.bucketname: str = u.hostname
|
self.bucketname: str = u.hostname
|
||||||
|
|
@ -212,16 +209,6 @@ class S3FeedStorage(BlockingFeedStorage):
|
||||||
self.endpoint_url: str | None = endpoint_url
|
self.endpoint_url: str | None = endpoint_url
|
||||||
self.region_name: str | None = region_name
|
self.region_name: str | None = region_name
|
||||||
|
|
||||||
boto3_session = boto3.session.Session()
|
|
||||||
self.s3_client = boto3_session.client(
|
|
||||||
"s3",
|
|
||||||
aws_access_key_id=self.access_key,
|
|
||||||
aws_secret_access_key=self.secret_key,
|
|
||||||
aws_session_token=self.session_token,
|
|
||||||
endpoint_url=self.endpoint_url,
|
|
||||||
region_name=self.region_name,
|
|
||||||
)
|
|
||||||
|
|
||||||
if feed_options and feed_options.get("overwrite", True) is False:
|
if feed_options and feed_options.get("overwrite", True) is False:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
"S3 does not support appending to files. To "
|
"S3 does not support appending to files. To "
|
||||||
|
|
@ -248,6 +235,27 @@ class S3FeedStorage(BlockingFeedStorage):
|
||||||
feed_options=feed_options,
|
feed_options=feed_options,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# We use lazy initialization for the S3 client because some S3
|
||||||
|
# credentials expire with time, so delaying their first use to the first
|
||||||
|
# time we start uploading data significantly reduces the chance of those
|
||||||
|
# credentials expiring too early.
|
||||||
|
@cached_property
|
||||||
|
def s3_client(self):
|
||||||
|
try:
|
||||||
|
import boto3.session # noqa: PLC0415
|
||||||
|
except ImportError:
|
||||||
|
raise NotConfigured("missing boto3 library") from None
|
||||||
|
|
||||||
|
boto3_session = boto3.session.Session()
|
||||||
|
return boto3_session.client(
|
||||||
|
"s3",
|
||||||
|
aws_access_key_id=self.access_key,
|
||||||
|
aws_secret_access_key=self.secret_key,
|
||||||
|
aws_session_token=self.session_token,
|
||||||
|
endpoint_url=self.endpoint_url,
|
||||||
|
region_name=self.region_name,
|
||||||
|
)
|
||||||
|
|
||||||
def _store_in_thread(self, file: IO[bytes]) -> None:
|
def _store_in_thread(self, file: IO[bytes]) -> None:
|
||||||
file.seek(0)
|
file.seek(0)
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue