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

背景信息

以往,如果部署在 ECS 实例中的应用程序需要访问 ACM,则必须将 Access Key(AK)以配置文件或其他形式保存在 ECS 实例中,这在一定程度上增加了 AK 管理的复杂性,并且降低了 AK 的保密性。

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

前提条件

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

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

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

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

  1. 登录ECS 控制台,单击左侧导航栏的实例
  2. 单击实例列表中目标 ECS 实例操作栏的 更多 > 实例设置 > 授予/收回 RAM 角色
  3. 授予/收回 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();
            }
        }
    }

相关文档