Fix: aliyun oss need to use s3 signature_version (#12766)

### What problem does this PR solve?

Aliyun OSS do not support boto s4 signature_version which will lead to
an error:

```
botocore.exceptions.ClientError: An error occurred (InvalidArgument) when calling the PutObject operation: aws-chunked encoding is not supported with the specified x-amz-content-sha256 value
```

According to aliyun oss docs, oss_conn need to use s3 signature_version.

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
会敲代码的喵
2026-01-22 11:43:55 +08:00
committed by GitHub
parent 6f3f69b62e
commit 2d9e7b4acd
4 changed files with 18 additions and 3 deletions

View File

@ -68,9 +68,11 @@ user_default_llm:
# oss: # oss:
# access_key: 'access_key' # access_key: 'access_key'
# secret_key: 'secret_key' # secret_key: 'secret_key'
# endpoint_url: 'http://oss-cn-hangzhou.aliyuncs.com' # endpoint_url: 'https://s3.oss-cn-hangzhou.aliyuncs.com'
# region: 'cn-hangzhou' # region: 'cn-hangzhou'
# bucket: 'bucket_name' # bucket: 'bucket_name'
# signature_version: 's3'
# addressing_style: 'virtual'
# azure: # azure:
# auth_type: 'sas' # auth_type: 'sas'
# container_url: 'container_url' # container_url: 'container_url'

View File

@ -227,6 +227,7 @@ EMBEDDING_BATCH_SIZE=${EMBEDDING_BATCH_SIZE:-16}
# ENDPOINT=http://oss-cn-hangzhou.aliyuncs.com # ENDPOINT=http://oss-cn-hangzhou.aliyuncs.com
# REGION=cn-hangzhou # REGION=cn-hangzhou
# BUCKET=ragflow65536 # BUCKET=ragflow65536
#
# A user registration switch: # A user registration switch:
# - Enable registration: 1 # - Enable registration: 1

View File

@ -81,6 +81,8 @@ user_default_llm:
# region: '${REGION}' # region: '${REGION}'
# bucket: '${BUCKET}' # bucket: '${BUCKET}'
# prefix_path: '${OSS_PREFIX_PATH}' # prefix_path: '${OSS_PREFIX_PATH}'
# signature_version: 's3'
# addressing_style: 'virtual'
# azure: # azure:
# auth_type: 'sas' # auth_type: 'sas'
# container_url: 'container_url' # container_url: 'container_url'

View File

@ -16,7 +16,6 @@
import logging import logging
import boto3 import boto3
from botocore.exceptions import ClientError from botocore.exceptions import ClientError
from botocore.config import Config
import time import time
from io import BytesIO from io import BytesIO
from common.decorator import singleton from common.decorator import singleton
@ -34,6 +33,8 @@ class RAGFlowOSS:
self.region = self.oss_config.get('region', None) self.region = self.oss_config.get('region', None)
self.bucket = self.oss_config.get('bucket', None) self.bucket = self.oss_config.get('bucket', None)
self.prefix_path = self.oss_config.get('prefix_path', None) self.prefix_path = self.oss_config.get('prefix_path', None)
self.signature_version = self.oss_config.get('signature_version', None)
self.addressing_style = self.oss_config.get('addressing_style', None)
self.__open__() self.__open__()
@staticmethod @staticmethod
@ -62,6 +63,15 @@ class RAGFlowOSS:
pass pass
try: try:
config_kwargs = {}
if self.signature_version:
config_kwargs['signature_version'] = self.signature_version
if self.addressing_style:
config_kwargs['s3'] = {
'addressing_style': self.addressing_style
}
# Referencehttps://help.aliyun.com/zh/oss/developer-reference/use-amazon-s3-sdks-to-access-oss # Referencehttps://help.aliyun.com/zh/oss/developer-reference/use-amazon-s3-sdks-to-access-oss
self.conn = boto3.client( self.conn = boto3.client(
's3', 's3',
@ -69,7 +79,7 @@ class RAGFlowOSS:
aws_access_key_id=self.access_key, aws_access_key_id=self.access_key,
aws_secret_access_key=self.secret_key, aws_secret_access_key=self.secret_key,
endpoint_url=self.endpoint_url, endpoint_url=self.endpoint_url,
config=Config(s3={"addressing_style": "virtual"}, signature_version='v4') config=config_kwargs
) )
except Exception: except Exception:
logging.exception(f"Fail to connect at region {self.region}") logging.exception(f"Fail to connect at region {self.region}")