以往部署在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的样例代码)。具体分为以下几个步骤:
通过RAM创建角色,并配置授权策略指定RAM角色创建ECS实例在实例内部访问实例元数据URL获取STS临时凭证基于临时凭证,使用Python SDK访问OSS注:OpenAPI Explorer通过已登录用户信息获取当前账号临时AK,对当前账号线上资源发起线上资源操作,请小心操作。同时创建实例操作也会产生一定的费用!操作完成后请及时释放实例。
{ "Statement": [
{ "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } }], "Version": "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" } 为角色附加授权。找到AttachPolicyToRole API。其中PolicyType填“Custom”,PolicyName填第2步创建的“RamRolePolicyTest”,RoleName填第1步创建的“RamRoleTest”。从ECS控制台远程连接实例,并登陆到实例中。访问http://100.100.100.200/latest/meta-data/ram/security-credentials/RamRoleTest获取STS临时凭证,其中路径最后为实例名。