ECS实例RAM角色实践

ECS实例RAM角色快速入门

概述

以往部署在ECS实例中的应用程序如果需要访问阿里云其他云产品的API,通常需要借助于AccessKeyId和AccessKeySecret(下文简称AK)来实现。AK是用户访问阿里云API的密钥,具有相应账户的完整权限。但是为了方便应用程序对AK的管理,用户通常需要将AK保存在应用程序的配置文件中或以其他方式保存在实例中。这在一定程度上增加了AK管理上的复杂性且降低了AK的保密性,尤其是对有多地域一致性部署需求的用户,AK将随着镜像及镜像创建的实例扩散出去。在需要更换AK时,也需要逐台实例(和镜像)进行更新和重新部署。此外,使用AK虽然简单,但AK的权限过大,无法做到精细的权限控制。

现在借助于ECS实例RAM角色,我们可以将RAM角色和ECS实例关联起来,实例内部的应用程序则通过STS临时凭证访问其他云产品的API。其中临时凭证由系统自动生成和更新,应用程序可以通过访问实例元数据的指定URL获取临时凭证,而无须特别的管理。同时借助于RAM,用户可以通过对角色和授权策略的管理,达到不同实例对不同云产品或相同云产品具有各自访问权限的目的。

本文接下来将详细介绍ECS实例使用RAM角色的正确姿势,为了方便读者随本篇样例快速入门,全文将基于OpenAPI Explorer操作(OpenAPI Explorer将各产品的API及参数以可视化的方式展现出来,并能自动生成Java,Python等SDK的样例代码)。具体分为以下几个步骤:

  1. 通过RAM创建角色,并配置授权策略
  2. 指定RAM角色创建ECS实例
  3. 在实例内部访问实例元数据URL获取STS临时凭证
  4. 基于临时凭证,使用Python SDK访问OSS

注:OpenAPI Explorer通过已登录用户信息获取当前账号临时AK,对当前账号线上资源发起线上资源操作,请小心操作。同时创建实例操作也会产生一定的费用!操作完成后请及时释放实例。

创建RAM角色&配置策略

  1. 创建RAM角色。找到OpenAPI Explorer RAM产品下CreateRole API。其中RoleName参数可以根据自己的需要填写,如本文填“RamRoleTest”。AssumeRolePolicyDocument填如下内容,表示该角色为一个服务角色,受信云服务(此处为ECS)可以扮演该角色:
    
    

{
"Statement": [

{
  "Action": "sts:AssumeRole",
  "Effect": "Allow",
  "Principal": {
    "Service": [
      "ecs.aliyuncs.com"
    ]
  }
}

],
"Version": "1"
}

ECS实例RAM角色实践

  1. 创建授权策略。找到CreatePolicy API。其中PolicyName本文填“RamRolePolicyTest”。PolicyDocument填以下内容,表示该角色具有OSS只读权限。
    
    

{
"Statement": [

{
  "Action": [
    "oss:Get\*",
    "oss:List\*"
  ],
  "Effect": "Allow",
  "Resource": "\*"
}

],
"Version": "1"
}

当希望通过子账号创建指定RAM角色的ECS实例时,还需要在上述“Statement”节点中额外增加ECS相关的权限和PassRole权限,如下所示。其中“...”需要替换成具体的ECS RAM Action,或替换成“ecs:*”表示所有Action。


{
  "Action": ...,
  "Resource": "\*",
  "Effect": "Allow"
},
{
  "Action": "ram:PassRole",
  "Resource": "\*",
  "Effect": "Allow"
}


ECS实例RAM角色实践
  1. 为角色附加授权。找到AttachPolicyToRole API。其中PolicyType填“Custom”,PolicyName填第2步创建的“RamRolePolicyTest”,RoleName填第1步创建的“RamRoleTest”。
    ECS实例RAM角色实践

指定角色创建实例

  1. 创建实例。找到OpenAPI Explorer ECS产品下的CreateInstance API,参数可根据实际情况进行填写,主要需要填写的参数有:RegionId、ImageId、ecs.n1.tiny、VSwitchId和RamRoleName。由于ECS实例RAM角色目前只支持VPC实例,所以VSwitchId是必须的,RamRoleName则填之前创建的RamRoleTest。
    ECS实例RAM角色实践
  2. 设置密码和启动实例。从ECS控制台“实例标签页”重置实例密码,并启动实例。

获取STS临时凭证

从ECS控制台远程连接实例,并登陆到实例中。访问http://100.100.100.200/latest/meta-data/ram/security-credentials/RamRoleTest获取STS临时凭证,其中路径最后为实例名。
ECS实例RAM角色实践

基于临时凭证访问OSS

  1. 命令行输入pip install oss2安装OSS python SDK
  2. 执行下述命令进行测试,其中oss2.StsAuth中的前三个参数分别对应于上述URL返回的AccessKeyId、AccessKeySecret和SecurityToken。
import oss2
from itertools import islice

auth = oss2.StsAuth(<AccessKeyId>, <AccessKeySecret>, <SecurityToken>)
bucket = oss2.Bucket(auth, "oss-cn-qingdao.aliyuncs.com", "bozhi-qd")

for b in islice(oss2.ObjectIterator(bucket), 10):
    print(b.key)

ECS实例RAM角色实践

相关文档

  1. 支持RAM的云服务列表
  2. RAM产品文档
  3. RAM中可对ECS资源进行授权的Action
  4. ECS实例元数据
  5. OSS STS授权访问
  6. OSS python SDK管理文件
上一篇:ECS运维神器 之 阿里云云助手


下一篇:阿里云迁云方式大汇总