如果借助ECS实例RAM角色,则无需配置AccessKey(AK)即可访问ACM,从而提高安全性。

迁移到MSE Nacos

ACM进入下线状态,所有配置管理相关的需求由MSE中的Nacos承接(ACM独享版,更好的安全和稳定性)。您需要在ACM控制台导出配置,然后在MSE控制台导入之前导出的配置即可完成迁移。具体操作,请参见将应用配置从ACM迁移到MSE Nacos

背景信息

以往,如果部署在ECS实例中的应用程序需要访问ACM,必须将AccessKey以配置文件或其他形式保存在ECS实例中,这在一定程度上增加了AccessKey管理的复杂性,并且降低了AccessKey的保密性。创建AccessKey的具体操作,请参见获取AccessKey

现在,借助ECS实例RAM角色,您可以将RAM角色和ECS实例关联起来,然后将RAM角色名称告知ACM SDK(1.0.8及以上版本),此后无需配置AccessKey即可访问ACM。另外,借助RAM(访问控制),您可以通过角色和授权策略实现不同实例对ACM具有不同访问权限的目的。例如,如果配置只读策略,关联了该角色的ECS就只能读取ACM的配置,而无法新增或修改ACM配置。

前提条件

您已成功创建ECS实例,且ECS实例的网络环境为专有网络(VPC)。

步骤一:创建RAM角色并配置授权策略

  1. 在左侧导航栏,单击RAM角色管理
  2. 单击创建RAM角色,选择可信实体类型为阿里云服务,单击下一步
  3. 选择角色类型,输入角色名称备注,选择受信服务为云服务器,然后单击完成
  4. RAM角色名称列,找到刚创建的RAM角色。
  5. 操作列单击添加权限
  6. 添加权限对话框中,通过关键词搜索授权策略AliyunACMFullAccess,并单击该授权策略将其添加至右侧的已选授列表,然后单击确定
    说明 如果需要用到加解密配置功能,则还要添加AliyunKMSCryptoAdminAccess授权策略。
    此时,该角色已具备ACM的所有操作权限。

步骤二:为ECS实例授予该RAM角色

  1. 登录ECS控制台,单击左侧导航栏的实例
  2. 单击实例列表中目标ECS实例操作栏的更多 > 实例设置 > 授予/收回RAM角色
    实例配置
  3. 授予/收回RAM角色对话框中选择RAM角色步骤一创建的RAM角色。
    说明 若您还未创建RAM角色,请单击创建RAM角色进行创建。
    RAM实例角色授权

步骤三:将RAM角色名称告知ACM SDK并访问配置

将RAM角色名称告知ACM SDK(版本1.0.8及以上)方法有两种:通过JVM参数设置和通过代码传参设置。

说明 JVM参数设置方式优先级高于代码传参方式。
  • 通过JVM参数设置:

    • 格式:-Dram.role.name=$ramRoleName

    • 示例:-Dram.role.name=ECS-RAM

  • 通过代码传参设置:

    import java.util.Properties;
    import com.alibaba.edas.acm.ConfigService;
    import com.alibaba.edas.acm.exception.ConfigException;
    // 示例代码,仅用于示例测试public class ACMTest {
        public static void main(String[] args) {
            try {
                Properties properties = new Properties();
                // endpoint可以从ACM控制台“命名空间详情”或“示例代码”中获取properties.put("endpoint", "$endpoint");
                // namespace可以从ACM控制台“命名空间详情”或“示例代码”中获取properties.put("namespace", "$namespace");
                // 刚刚新建并绑定到ECS实例的RAM角色名称,如“ECS-RAM”properties.put("ramRoleName", "$ramRoleName");
                ConfigService.init(properties);
                // 主动获取配置String content = ConfigService.getConfig("${dataId}", "${group}", 6000);
                System.out.println(content);
            } catch (ConfigException e) {
                e.printStackTrace();
            }
        }
    }

更多信息