# Aliyun OSS

This guide describes how to configure [Aliyun OSS](https://intl.aliyun.com/product/oss) as Alluxio's under storage system.

Aliyun Object Storage Service (OSS) is a massive, secure and highly reliable cloud storage service provided by Alibaba Cloud. OSS provides multiple storage classes to help you manage and reduce storage costs.

For more information about Aliyun OSS, please read its [documentation](https://www.alibabacloud.com/help/en/oss/)

## Prerequisites

Before you get started, please ensure you have the required information listed below:

| `<OSS_BUCKET>`            | [Create a new bucket in the OSS console](<https://www.alibabacloud.com/help/en/oss/getting-started/create-buckets-6#task-2013189 >) or use an existing bucket                                            |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `<OSS_DIRECTORY>`         | The directory you want to use in the bucket, either by creating a new directory or using an existing one                                                                                                 |
| `<OSS_ACCESS_KEY_ID>`     | ID used to identify a user. See [How to Obtain AccessKey Pair](https://www.alibabacloud.com/help/en/sls/developer-reference/accesskey-pair)                                                              |
| `<OSS_ACCESS_KEY_SECRET>` | Secret used to verify the identity of the user. See [How to Obtain AccessKey Pair](https://www.alibabacloud.com/help/en/sls/developer-reference/accesskey-pair)                                          |
| `<OSS_ENDPOINT>`          | Endpoints are the domain names that other services can use to access OSS. See [Regions and OSS Endpoints in the Public Cloud](https://www.alibabacloud.com/help/en/oss/user-guide/regions-and-endpoints) |

## Basic Setup

Use the [mount table operations](/ee-ai-en/ai-3.5/architecture/namespace.md#mount-table-operations) to add a new mount point, specifying the Alluxio path to create the mount on and the OSS path as the UFS URI. Credentials and configuration options can also be specified as part of the mount command by specifying the `--option` flag as described by [configuring mount points](/ee-ai-en/ai-3.5/architecture/namespace.md#use-different-configurations-for-different-mount-points).

An example command to mount `oss://<OSS_BUCKET>/<OSS_DIRECTORY>` to `/oss`:

```shell
bin/alluxio mount add --path /oss/ --ufs-uri oss://<OSS_BUCKET>/<OSS_DIRECTORY> \
  --option fs.oss.accessKeyId=<OSS_ACCESS_KEY> --option fs.oss.accessKeySecret=<OSS_ACCESS_KEY_SECRET> \
  --option fs.oss.endpoint=<OSS_ENDPOINT>
```

Note that if you want to mount the root of the OSS bucket, add a trailing slash after the bucket name (e.g. `oss://OSS_BUCKET/`).

## Advanced Setup

Note that configuration options can be specified as mount options or as configuration properties in `conf/alluxio-site.properties`. The following sections will describe how to set configurations as properties, but they can also be set as mount options via `--option <key>=<value>`.

### Enabling HTTPS

To enable the use of the HTTPS protocol for secure communication with OSS with an additional layer of security for data transfers, configure the following setting in conf/alluxio-site.properties:

```properties
alluxio.underfs.oss.secure.http.enabled=true
```

### \[Experimental] OSS multipart upload

The default upload method uploads one file completely from start to end in one go. We use multipart-upload method to upload one file by multiple parts, every part will be uploaded in one thread. It won't generate any temporary files while uploading.

To enable OSS multipart upload, you need to modify `conf/alluxio-site.properties` to include:

```properties
alluxio.underfs.oss.multipart.upload.enabled=true
```

There are other parameters you can specify in `conf/alluxio-site.properties` to potentially speed up the upload.

```properties
# Timeout for uploading part when using multipart upload.
alluxio.underfs.object.store.multipart.upload.timeout
```

```properties
# Thread pool size for OSS multipart upload.
alluxio.underfs.oss.multipart.upload.threads
```

```properties
# Multipart upload partition size for OSS. The default partition size is 64MB. 
alluxio.underfs.oss.multipart.upload.partition.size
```

### Setting Request Retry Policy

Sometimes there may be an error in accessing UFS because the server is temporarily unable to respond. You can configure a retry policy for UFS requests.

Each I/O request sent to UnderFS like getObject, putObject, MultipartUpload, Alluxio will check the response. If the response is an error, and the error code suggests it may be retryable, the request will be resubmitted according to the retry policy in configuration. Alluxio will keep trying until the request is successful or reaches the maximum number of retries. The wait interval between successive retries will gradually increase from the configured base sleep time to the maximum sleep time.

The following error codes are categorized as retryable: `500 HTTP_INTERNAL_ERROR`, `502 HTTP_BAD_GATEWAY`, `503 HTTP_UNAVAILABLE`, `503 Slow Down`, and `504 HTTP_GATEWAY_TIMEOUT`.

**Note:**

* 4xx status code usually represents client errors, such as NOT\_FOUND, PERMISSION\_DENIED, UNAUTHENTICATED, etc. Such errors should never be retried since the issue is on the client side.
* 5xx status code usually represents server errors, but not all 5xx error should be retried. For example, `501 HTTP_NOT_IMPLEMENTED` should not be retried.

If you want to set the retry policy for the UFS accessing request, you need to modify `conf/alluxio-site.properties` to include:

```properties
# the max number of retry in one UnderFS accessing request.
alluxio.underfs.business.retry.max.num=10

# the sleep time between the two retries after the initial failure
alluxio.underfs.business.retry.base.sleep=30ms

# the max sleep time between two retries
alluxio.underfs.business.retry.max.sleep=30s
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentation.alluxio.io/ee-ai-en/ai-3.5/ufs/aliyun-oss.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
