集成协同存储EOS

协同存储 EOS 提供了 API,您可以通过编程方式,在您的应用里进行文件上传、下载等操作。

集成流程

用户身份

建议您选择RAM用户或者RAM角色进行接口调用。更多关于用户身份介绍请参见身份

授权

调用前,您需要为对应的身份授予权限策略,更多关于授权请参见授权管理

AliyunEnsFullAccess

该系统策略为ENS产品的读写策略,具有ENS产品下所有服务的操作权限,请谨慎使用。

AliyunEnsEOSFullAccess

该系统策略为ENS边缘协同存储服务的读写权限,仅可操作ENS协同存储服务。

调用方式

协同存储EOS的大部分接口与OSS兼容,同时EOS接入点和 OSS 稍有不同,使用的是固定域名eos.aliyuncs.com,无需关注地域,同时也无需区分内网或外网(在内网访问会自动切换到内网链路,不产生公网流量费用)。

由于EOS是非Region化的,极少数接口无法完全兼容OSS,通过EOS OpenAPI的形式提供,关于EOS OpenAPI调用方式请参见集成概览

下表列举了EOS兼容OSS API的情况,其中

  • 兼容OSS的部分API,可以直接使用OSS SDK进行调用。

  • 不兼容OSS的部分API,可以使用ENS SDK进行调用。

OpenAPI

描述

EOS OpenAPI

兼容OSS API

存储空间

ListBuckets

返回请求者拥有的所有存储空间

✔️

PutBucket

创建Bucket

✔️

DeleteBucket

删除Bucket

✔️

✔️

GetBucketInfo

获取Bucket的信息

✔️

✔️

PutBucketLifecycle

设置Bucket中Object的生命周期规则

✔️

✔️

GetBucketLifecycle

查看Bucket中Object的生命周期规则

✔️

✔️

DeleteBucketLifecycle

删除Bucket中Object的生命周期规则

✔️

✔️

PutBucketAcl

设置Bucket访问权限

✔️

✔️

GetBucketAcl

获取Bucket访问权限

✔️

✔️

文件对象

DeleteObject

删除单个文件

✔️

✔️

PutObject

上传Object

✔️

GetObject

获取(下载)Object

✔️

AppendObject

以追加写的方式上传Object

✔️

DeleteMultipleObjects

删除多个Object

✔️

CopyObject

复制Object(仅支持同一bucket之内的文件拷贝)

✔️

PutObjectTagging

设置或更新对象的标签信息

✔️

GetObjectTagging

获取对象的标签信息

✔️

DeleteObjectTagging

删除指定对象的标签信息

✔️

HeadObject

只返回某个Object的meta信息,不返回文件内容

✔️

GetObjectMeta

返回Object的基本meta信息,包括该Object的ETag、Size(文件大小)以及LastModified等,不返回文件内容

✔️

分片上传

InitiateMultipartUpload

初始化MultipartUpload事件

✔️

UploadPart

分块上传文件

✔️

CompleteMultipartUpload

完成整个文件的MultipartUpload上传

✔️

AbortMultipartUpload

取消MultipartUpload事件

✔️

参考示例

创建存储空间

EOS的OpenAPI暂时只能通过Common模式进行调用。

package com.aliyun.sample;

import com.aliyun.tea.*;

public class Sample {

    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.teaopenapi.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 必填,您的 AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 必填,您的 AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // Endpoint 请参考 https://api.aliyun.com/product/Ens
        config.endpoint = "ens.aliyuncs.com";
        return new com.aliyun.teaopenapi.Client(config);
    }

    /**
     * API 相关
     * @param path params
     * @return OpenApi.Params
     */
    public static com.aliyun.teaopenapi.models.Params createApiInfo() throws Exception {
        com.aliyun.teaopenapi.models.Params params = new com.aliyun.teaopenapi.models.Params()
                // 接口名称
                .setAction("PutBucket")
                // 接口版本
                .setVersion("2017-11-10")
                // 接口协议
                .setProtocol("HTTPS")
                // 接口 HTTP 方法
                .setMethod("POST")
                .setAuthType("AK")
                .setStyle("RPC")
                // 接口 PATH
                .setPathname("/")
                // 接口请求体内容格式
                .setReqBodyType("json")
                // 接口响应体内容格式
                .setBodyType("json");
        return params;
    }

    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
        com.aliyun.teaopenapi.Client client = Sample.createClient(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        com.aliyun.teaopenapi.models.Params params = Sample.createApiInfo();

        // body params
        java.util.Map<String, Object> body = new java.util.HashMap<>();
        // bucket名称
        body.put("BucketName", "global-eos-test1");
        // bucket权限类型
        body.put("BucketAcl", "private");
        // runtime options
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        com.aliyun.teaopenapi.models.OpenApiRequest request = new com.aliyun.teaopenapi.models.OpenApiRequest().setBody(body);
        // 复制代码运行请自行打印 API 的返回值
        // 返回值为 Map 类型,可从 Map 中获得三类数据:响应体 body、响应头 headers、HTTP 返回的状态码 statusCode。
        java.util.Map<String, ?> resp = client.callApi(params, request, runtime);
        com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(resp));
    }
}

上传文件

文件对象API完全兼容OSS API,可以直接使用OSS SDK进行调用。

示例代码

package com.aliyun.sample;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import com.aliyuncs.ens.model.v20171110.*;

import java.io.ByteArrayInputStream;

public class Demo {

    public static void main(String[] args) throws Exception {
        String endpoint = "http://eos.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 初始化 OSS Cilent
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);   

        try {
            // 填写Bucket名称。
            String bucketName = "global-eos-test1";
            String objectName = "demoTestObject.txt";
            String content = "this is demo";    // 创建PutObjectRequest对象。
            // 上传字符串。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
            ossClient.putObject(putObjectRequest);

            // 关闭OSSClient
            ossClient.shutdown();

        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason: ", e.);
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

详情请参见OSS文档:简单上传

下载文件

下载文件请参见OSS文档:下载文件概述。您也可通过使用生成授权的URL下载文件,详情请参见:授权访问