全部产品
Search
文档中心

表格存储:使用RAM用户访问密钥访问表格存储

更新时间:Feb 28, 2025

访问控制RAM可以帮助您管理用户身份和资源访问权限,使用RAM用户访问表格存储资源比直接使用阿里云账号更加安全。本文介绍如何使用RAM用户的访问密钥发起请求访问表格存储资源。

背景信息

RAM用户即RAM账号,是访问控制RAM(Resource Access Management)的一种实体身份类型。您可以为阿里云账号(主账号)创建RAM用户并为其授权,实现不同RAM用户拥有不同资源访问权限的目的。更多信息,请参见RAM用户概览

操作步骤

使用RAM用户访问密钥访问表格存储,您需要创建一个RAM用户并授予其访问表格存储的权限,再用RAM用户的访问密钥发起请求,访问表格存储资源。

步骤一:创建RAM用户

  1. 使用阿里云账号(主账号)或RAM管理员登录RAM控制台

  2. 在左侧导航栏,选择身份管理 > 用户

  3. 用户页面,单击创建用户

  4. 创建用户页面的用户账号信息区域,设置用户基本信息。

    • 登录名称:可包含英文字母、数字、半角句号(.)、短划线(-)和下划线(_),最多64个字符。

    • 显示名称:最多包含128个字符或汉字。

    • 标签:单击edit,输入标签键和标签值。为RAM用户绑定标签,便于后续基于标签管理用户。

    说明

    通过单击添加用户,您可以批量创建多个RAM用户。

  5. 访问方式区域,选中使用永久AccessKey访问,单击确定

    说明

    如果需要使用RAM用户登录和访问阿里云控制台,请选中控制台访问

  6. 单击操作列的复制,保存RAM用户信息。您也可以单独复制AccessKey ID和AccessKey Secret。

    重要

    RAM用户的AccessKey Secret只在创建时显示,页面关闭后将无法查看,请及时保存并妥善保管。

步骤二:为RAM用户授予访问表格存储权限

创建RAM用户后,您需要为RAM用户授予表格存储的访问权限。

使用默认策略

AliyunOTSFullAccess 为例授予RAM用户访问表格存储的权限。

说明

AliyunOTSFullAccess 拥有表格存储的完全访问权限,您也可以选择以下方式进行授权。

  • 如果需要只读权限,请授予RAM用户 AliyunOTSReadOnlyAccess 权限。

  • 如果需要只写权限,请授予RAM用户 AliyunOTSWriteOnlyAccess 权限。

  1. 在左侧导航栏,选择身份管理 > 用户

  2. 用户页面,找到目标RAM用户。

  3. 单击RAM用户右侧的添加权限

  4. 新增授权面板的权限策略区域,搜索 AliyunOTSFullAccess 并选中。

  5. 单击确认新增授权

使用自定义策略

  1. 创建自定义权限策略。

    1. 在左侧导航栏,选择权限管理 > 权限策略

    2. 权限策略页面,单击创建权限策略

    3. 创建权限策略页面,单击脚本编辑,并在输入框中编写脚本,单击确定

      说明

      以下示例脚本授予RAM用户访问单个实例的权限,您可以根据需要自定义策略脚本,例如表和API级别的权限控制或基于场景(IP、访问时间限制等)的权限控制。关于RAM Policy的更多信息,请参见自定义RAM Policy

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "ots:*",
            "Resource": "acs:ots:*:*:instance/your_instance_name*"
          }
        ]
      }
    4. 创建权限策略对话框,填写策略名称,例如 TestRAMPolicy,单击确定

  2. 为RAM用户授予自定义权限策略。

    1. 在左侧导航栏,选择身份管理 > 用户

    2. 用户页面,找到目标RAM用户。

    3. 单击RAM用户右侧的添加权限

    4. 新增授权面板的权限策略区域,搜索并选中已创建的自定义权限策略。

    5. 单击确认新增授权

您可以在用户列表单击用户名称进入用户详情页,在权限管理页签下查看被授权的权限策略。

image

步骤三:使用RAM用户访问密钥访问表格存储

准备工作

  1. 表格存储控制台创建实例和数据表。

  2. 获取实例名称、实例访问地址、地域ID。地域列表请参见地域

  3. 根据不同的编程语言,安装对应的Tablestore SDK。

    Java

    如果您使用的是Maven项目,请在项目的pom.xml文件中添加如下依赖:

    <dependency>
        <groupId>com.aliyun.openservices</groupId>
        <artifactId>tablestore</artifactId>
        <version>5.17.4</version>
    </dependency>                 

    更多信息,请参见安装Tablestore Java SDK

    Go

    在项目目录中执行go mod init <DIRNAME>命令生成go.mod文件后,执行如下命令安装表格存储Go SDK。

    说明

    <DIRNAME>为项目目录路径,请以实际路径为准。

    go get github.com/aliyun/aliyun-tablestore-go-sdk/tablestore

    更多信息,请参见安装Tablestore Go SDK

    Python

    执行如下命令直接通过pip进行SDK安装。

    sudo pip install tablestore

    更多信息,请参见安装Tablestore Python SDK

    Node.js

    通过npm执行如下命令安装表格存储Node.js SDK。

    npm install tablestore

    更多信息,请参见安装Tablestore Node.js SDK

    .NET

    具体操作,请参见安装Tablestore .NET SDK

    PHP

    具体操作,请参见安装Tablestore PHP SDK

宽表模型

使用宽表模型时,您需要使用RAM用户的访问密钥初始化Tablestore Client并发起请求。

运行代码前请替换代码内的实例信息,并将RAM用户的AccessKey配置到系统环境变量,配置方法请参见配置环境变量
Java
V4签名(推荐)

以下Java示例代码使用V4签名初始化Tablestore Client,并获取实例中的所有数据表名称。

import com.alicloud.openservices.tablestore.ClientConfiguration;
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.V4Credentials;
import com.alicloud.openservices.tablestore.model.AlwaysRetryStrategy;
import com.alicloud.openservices.tablestore.model.ListTableResponse;

public class InitClientV4 {
    public static void main(String[] args) {
        // yourRegion 填写您的实例所在地域,如 cn-hangzhou
        final String region = "yourRegion";
        // yourInstanceName 填写您的实例名称
        final String instanceName = "yourInstanceName";
        // yourEndpoint 填写您的实例访问地址
        final String endpoint = "yourEndpoint";
        // 获取环境变量里的 AccessKey ID 和 AccessKey Secret
        final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
        final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");

        // 构造 V4 签名
        DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
        V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
        CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);

        // 初始化 Tablestore Client
        SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

        /*
        // 您可以通过指定 ClientConfiguration 修改默认配置项,以下示例为部分自定义配置项。
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setConnectionTimeoutInMillisecond(5000); // 设置建立连接的超时时间,单位为毫秒。
        clientConfiguration.setSocketTimeoutInMillisecond(5000); // 设置 socket 超时时间,单位为毫秒。
        clientConfiguration.setRetryStrategy(new AlwaysRetryStrategy()); // 设置重试策略,如果不设置,则采用默认的重试策略。
        SyncClient client = new SyncClient(endpoint, provider, instanceName, clientConfiguration, new ResourceManager(null, null));
         */

        // 列出实例中的数据表列表并打印到控制台
        ListTableResponse listTableResponse = client.listTable();
        listTableResponse.getTableNames().forEach(System.out::println);

        // 关闭 Tablestore Client
        client.shutdown();
    }
}
V2签名

以下Java示例代码使用V2签名初始化Tablestore Client,并获取实例中的所有数据表名称。

import com.alicloud.openservices.tablestore.ClientConfiguration;
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.model.AlwaysRetryStrategy;
import com.alicloud.openservices.tablestore.model.ListTableResponse;

public class InitClientV2 {
    public static void main(String[] args) {
        // yourInstanceName 填写您的实例名称
        final String instanceName = "yourInstanceName";
        // yourEndpoint 填写您的实例访问地址
        final String endpoint = "yourEndpoint";
        // 获取环境变量里的 AccessKey ID 和 AccessKey Secret
        final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
        final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");

        // 构造 V2 签名
        DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
        CredentialsProvider provider = new DefaultCredentialProvider(credentials);

        // 初始化 Tablestore Client
        SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

        /*
        // 您可以通过指定 ClientConfiguration 修改默认配置项,以下示例为部分自定义配置项。
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setConnectionTimeoutInMillisecond(5000); // 设置建立连接的超时时间,单位为毫秒。
        clientConfiguration.setSocketTimeoutInMillisecond(5000); // 设置 socket 超时时间,单位为毫秒。
        clientConfiguration.setRetryStrategy(new AlwaysRetryStrategy()); // 设置重试策略,如果不设置,则采用默认的重试策略。
        SyncClient client = new SyncClient(endpoint, provider, instanceName, clientConfiguration, new ResourceManager(null, null));
         */

        // 列出实例中的数据表列表并打印到控制台
        ListTableResponse listTableResponse = client.listTable();
        listTableResponse.getTableNames().forEach(System.out::println);

        // 关闭 Tablestore Client
        client.shutdown();
    }
}
Go

以下Go示例代码用于初始化Tablestore Client,并获取实例中的所有数据表名称。

package main

import (
	"fmt"
	"os"
	"github.com/aliyun/aliyun-tablestore-go-sdk/tablestore"
)

func main() {
	// yourInstanceName 填写您的实例名称
	instanceName := "yourInstanceName"
	// yourEndpoint 填写您的实例访问地址
	endpoint := "yourEndpoint"
	// 获取环境变量里的 AccessKey ID 和 AccessKey Secret
	accessKeyId := os.Getenv("TABLESTORE_ACCESS_KEY_ID")
	accessKeySecret := os.Getenv("TABLESTORE_ACCESS_KEY_SECRET")

	// 初始化 Tablestore Client
	client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)	

	// 列出实例中的数据表列表并打印到控制台
	tables, err := client.ListTable()
    if err != nil {
        fmt.Println("Failed to list table")
    } else {
        for _, table := range (tables.TableNames) {
            fmt.Println(table)
        }
    }
}
Python

以下Python示例代码用于初始化Tablestore Client,并获取实例中的所有数据表名称。

# -*- coding: utf-8 -*-
import os
from tablestore import OTSClient

# yourInstanceName 填写您的实例名称
instance_name = "yourInstanceName"
# yourEndpoint 填写您的实例访问地址
endpoint = "yourEndpoint"
# 获取环境变量里的 AccessKey ID 和 AccessKey Secret
access_key_id = os.getenv("TABLESTORE_ACCESS_KEY_ID")
access_key_secret = os.getenv("TABLESTORE_ACCESS_KEY_SECRET")

# 初始化 Tablestore Client
client = OTSClient(endpoint, access_key_id, access_key_secret, instance_name)

# 列出实例中的数据表列表并打印到控制台
resp = client.list_table()
for table_name in resp:
    print(table_name)
Node.js

以下Node.js示例代码用于初始化Tablestore Client,并获取实例中的所有数据表名称。

// 此处为相对路径,请根据实际情况进行调整。
var TableStore = require('../index.js');

// yourInstanceName 填写您的实例名称
var instancename = 'yourInstanceName';
// yourEndpoint 填写您的实例访问地址
var endpoint = 'yourEndpoint';
// 获取环境变量里的 AccessKey ID 和 AccessKey Secret
var accessKeyId = process.env.TABLESTORE_ACCESS_KEY_ID;
var secretAccessKey = process.env.TABLESTORE_ACCESS_KEY_SECRET;

// 初始化 Tablestore Client
var client = new TableStore.Client({
  accessKeyId: accessKeyId,
  secretAccessKey: secretAccessKey,
  endpoint: endpoint,
  instancename: instancename 
});

// 列出实例中的数据表列表并打印到控制台
client.listTable({}, function (err, data) {
    if (err) {
        console.log('error:', err);
        return;
    }
    console.log('success:', data);
});  
.NET

以下 .NET 示例代码用于初始化Tablestore Client,并获取实例中的所有数据表名称。

using Aliyun.OTS.Request;
using Aliyun.OTS.Response;
using System;

namespace Aliyun.OTS.Samples
{
    public class Sample
    {
        public static void Main()
        {
            // yourEndpoint 填写您的实例访问地址
            string endpoint = "yourEndpoint";
            // yourInstanceName 填写您的实例名称
            string instanceName = "yourInstanceName";
            // 获取环境变量里的 AccessKey ID 和 AccessKey Secret
            string accessKeyId = Environment.GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID");
            string accessKeySecret = Environment.GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET");
            OTSClientConfig config = new OTSClientConfig(endpoint, accessKeyId, accessKeySecret, instanceName)
            {
                OTSDebugLogHandler = null,
                OTSErrorLogHandler = null
            };

            try
            {
                // 初始化Tablestore Client
                OTSClient otsClient = new OTSClient(config);
                // 列出实例中的数据表列表并打印
                ListTableResponse response = otsClient.ListTable(new ListTableRequest());
                foreach (var tableName in response.TableNames)
                {
                    Console.WriteLine(tableName);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("List table failed, exception:{0}", ex.Message);
            }
        }
    }
}
PHP

以下PHP示例代码用于初始化Tablestore Client,并获取实例中的所有数据表名称。

<?php
// 此处为相对路径,请根据实际情况进行调整。
require (__DIR__ . '/../../vendor/autoload.php');

use Aliyun\OTS\OTSClient as OTSClient;

// yourInstanceName 填写您的实例名称
$instanceName = "yourInstanceName";
// yourEndpoint 填写您的实例访问地址
$endpoint = "yourEndpoint";
// 获取系统变量里的 AccessKey ID 和 AccessKey Secret
$accessKeyId = getenv('TABLESTORE_ACCESS_KEY_ID');
$accessKeySecret = getenv('TABLESTORE_ACCESS_KEY_SECRET');

// 初始化 Tablestore Client
$otsClient = new OTSClient(array(
    'EndPoint' => $endpoint,
    'AccessKeyID' => $accessKeyId,
    'AccessKeySecret' => $accessKeySecret,
    'InstanceName' => $instanceName,
));

# 列出实例中的数据表列表并打印到控制台
$response = $otsClient->listTable (array ());
print json_encode ($response);

时序模型

使用时序模型时,您需要使用RAM用户的访问密钥初始化Timeseries Client并发起请求。目前仅Java和Go语言支持操作时序模型。

运行代码前请替换代码内的实例信息,并将RAM用户的AccessKey配置到系统环境变量,配置方法请参见配置环境变量
Java
V4签名(推荐)

以下Java示例代码使用V4签名初始化Timeseries Client,并获取实例中的所有时序表名称。

import com.alicloud.openservices.tablestore.ClientConfiguration;
import com.alicloud.openservices.tablestore.TimeseriesClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.V4Credentials;
import com.alicloud.openservices.tablestore.model.AlwaysRetryStrategy;
import com.alicloud.openservices.tablestore.model.timeseries.ListTimeseriesTableResponse;

public class InitTimeseriesClientV4 {
    public static void main(String[] args) {
        // yourRegion 填写您的实例所在地域,如 cn-hangzhou
        final String region = "yourRegion";
        // yourInstanceName 填写您的实例名称
        final String instanceName = "yourInstanceName";
        // yourEndpoint 填写您的实例访问地址
        final String endpoint = "yourEndpoint";
        // 获取环境变量里的 AccessKey ID 和 AccessKey Secret
        final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
        final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");

        // 构造 V4 签名
        DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
        V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
        CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);

        // 初始化 Tablestore TimeSeries Client
        TimeseriesClient client = new TimeseriesClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

        /*
        // 您可以通过指定 ClientConfiguration 修改默认配置项,以下示例为部分自定义配置项。
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setConnectionTimeoutInMillisecond(5000); // 设置建立连接的超时时间,单位为毫秒。
        clientConfiguration.setSocketTimeoutInMillisecond(5000); // 设置 socket 超时时间,单位为毫秒。
        clientConfiguration.setRetryStrategy(new AlwaysRetryStrategy()); // 设置重试策略,如果不设置,则采用默认的重试策略。
        TimeseriesClient client = new TimeseriesClient(endpoint, provider, instanceName, clientConfiguration, new ResourceManager(null, null));
         */

        // 列出实例中的时序表列表并打印到控制台
        ListTimeseriesTableResponse listTimeseriesTableResponse = client.listTimeseriesTable();
        listTimeseriesTableResponse.getTimeseriesTableNames().forEach(System.out::println);

        // 关闭 Tablestore Client
        client.shutdown();
    }
}
V2签名

以下Java示例代码使用V2签名初始化Timeseries Client,并获取实例中的所有时序表名称。

import com.alicloud.openservices.tablestore.ClientConfiguration;
import com.alicloud.openservices.tablestore.TimeseriesClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.model.AlwaysRetryStrategy;
import com.alicloud.openservices.tablestore.model.timeseries.ListTimeseriesTableResponse;

public class InitTimeseriesClientV2 {
    public static void main(String[] args) {
        // yourInstanceName 填写您的实例名称
        final String instanceName = "yourInstanceName";
        // yourEndpoint 填写您的实例访问地址
        final String endpoint = "yourEndpoint";
        // 获取环境变量里的 AccessKey ID 和 AccessKey Secret
        final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
        final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");

        // 构造 V2 签名
        DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
        CredentialsProvider provider = new DefaultCredentialProvider(credentials);

        // 初始化 Tablestore TimeSeries Client
        TimeseriesClient client = new TimeseriesClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

        /*
        // 您可以通过指定 ClientConfiguration 修改默认配置项,以下示例为部分自定义配置项。
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setConnectionTimeoutInMillisecond(5000); // 设置建立连接的超时时间,单位为毫秒。
        clientConfiguration.setSocketTimeoutInMillisecond(5000); // 设置 socket 超时时间,单位为毫秒。
        clientConfiguration.setRetryStrategy(new AlwaysRetryStrategy()); // 设置重试策略,如果不设置,则采用默认的重试策略。
        TimeseriesClient client = new TimeseriesClient(endpoint, provider, instanceName, clientConfiguration, new ResourceManager(null, null));
         */

        // 列出实例中的时序表列表并打印到控制台
        ListTimeseriesTableResponse listTimeseriesTableResponse = client.listTimeseriesTable();
        listTimeseriesTableResponse.getTimeseriesTableNames().forEach(System.out::println);

        // 关闭 Tablestore Client
        client.shutdown();
    }
}
Go

以下Go示例代码用于初始化Timeseries Client,并获取实例中的所有时序表名称。

package main

import (
	"fmt"
	"os"
	"github.com/aliyun/aliyun-tablestore-go-sdk/tablestore"
)

func main() {
	// yourInstanceName 填写您的实例名称
	instanceName := "yourInstanceName"
	// yourEndpoint 填写您的实例访问地址
	endpoint := "yourEndpoint"
	// 获取环境变量里的 AccessKey ID 和 AccessKey Secret
	accessKeyId := os.Getenv("TABLESTORE_ACCESS_KEY_ID")
	accessKeySecret := os.Getenv("TABLESTORE_ACCESS_KEY_SECRET")

	// 初始化 Tablestore Client
	client := tablestore.NewTimeseriesClient(endpoint, instanceName, accessKeyId, accessKeySecret)	

	// 列出实例下的时序表列表并打印到控制台
	timeseriesTables, err := client.ListTimeseriesTable()
    if err != nil {
        fmt.Println("Failed to list table")
    } else {
        for _, timeseriesTablesMeta := range (timeseriesTables.GetTimeseriesTableMeta()) {
            fmt.Println(timeseriesTablesMeta.GetTimeseriesTableName())
        }
    }
}

配置环境变量

直接在代码中保存访问凭证容易导致信息泄露,建议您按以下操作将访问凭证保存在系统环境变量中。

Windows

以管理员身份运行命令提示符,执行以下命令。

# 配置 RAM 用户的 AccessKey ID
setx TABLESTORE_ACCESS_KEY_ID your_access_key_id /m
# 配置 RAM 用户的 AccessKey Secret
setx TABLESTORE_ACCESS_KEY_SECRET your_access_key_secret /m
macOS/Linux/Unix
# 配置 RAM 用户的 AccessKey ID
export TABLESTORE_ACCESS_KEY_ID=your_access_key_id
# 配置 RAM 用户的 AccessKey Secret
export TABLESTORE_ACCESS_KEY_SECRET=your_access_key_secret

常见问题

问:如果未复制AccessKey信息就关闭了页面,或者遗失了AccessKey信息该怎么办?

您可以创建用于轮转的第二个AccessKey,验证后再删除原来的AccessKey。具体操作,请参见轮转RAM用户的AccessKey

问:如何让RAM用户能自主管理AccessKey?

您需要在RAM控制台设置页面的全局安全区域启用允许用户管理AccessKey设置,设置后RAM用户可以自行创建、禁用和删除AccessKey。具体操作,请参见管理RAM用户安全设置创建AccessKey

问:使用SDK访问表格存储时出现Request denied by instance ACL policies异常该怎么办?

客户端所用的网络类型不符合实例的网络访问要求。您需要在表格存储控制台的实例管理页面的网络管理页签设置允许网络类型。更多信息,请参见使用SDK访问表格存储时出现Request denied by instance ACL policies异常