通过实例RAM角色控制资源访问
实例RAM角色是RAM角色的一种,它让ECS实例扮演具有某些权限的角色,ECS实例可以使用该角色的临时访问凭证来访问指定的阿里云服务,例如OSS、RDS等,实现ECS实例与其他阿里云服务之间的安全通信。本文介绍了如何创建实例RAM角色并授予RAM角色给ECS,及其应用示例。
功能介绍
ECS实例上部署的应用程序在云产品通信中,通过云账号或者RAM用户的AccessKey访问阿里云其他云产品(例如OSS、VPC、RDS等)的API。为了方便和快速地调用,部分用户直接把AccessKey固化在实例中,如写在配置文件中。这种方式存在权限过高、泄露信息和难以维护等问题。通过为ECS实例授予RAM角色能避免此类问题,例如在ECS实例中使用STS临时凭证访问阿里云的其他云服务,为不同的实例赋予包含不同授权策略的角色,使它们对不同的云资源具有不同的访问权限,实现更精细粒度的权限控制。
ECS实例RAM(Resource Access Management)角色可以让ECS实例扮演具有某些权限的角色,从而赋予ECS实例一定的访问权限。
使用限制
为ECS实例授予RAM角色存在如下限制:
ECS实例的网络类型必须是专有网络VPC。
一台ECS实例只能授予一个RAM角色。
配置实例RAM角色
若您的账户为RAM用户(子账号),请先联系阿里云账号(主账号)获取配置实例RAM角色的权限。具体操作,请参见授权RAM用户使用实例RAM角色。
创建实例RAM角色并授予给ECS
一台ECS实例只能授予一个RAM角色。
通过控制台创建和授予
登录RAM控制台,创建实例RAM角色并为其授权。
创建可信实体为阿里云服务的RAM角色。
选择身份管理 > 角色,单击创建角色,按照界面提示完成角色创建。注意以下参数(其他参数按需填写,可参见创建可信实体为阿里云服务的RAM角色):
可信实体类型:选择阿里云服务。
角色类型:选择普通服务角色。
受信服务:选择云服务器。
为已创建的RAM角色授权。
在角色列表页,找到已创建的RAM角色,单击操作列的新增授权,为已创建的RAM角色添加所需权限。例如RAM角色授予访问OSS的权限:AliyunOSSReadOnlyAccessOSS。
说明支持添加系统策略或自定义策略。新建自定义策略,可参见创建自定义权限策略。
授予实例RAM角色给ECS实例。
登录ECS管理控制台。
在左侧导航栏,选择 。
在页面左侧顶部,选择目标资源所在的资源组和地域。
找到要操作的ECS实例,选择
。在对话框中,选择创建好的实例RAM角色,单击确定完成授予。
通过API创建和授予
创建并配置实例RAM角色
调用CreateRole接口创建实例RAM角色。
按如下策略设置参数AssumeRolePolicyDocument:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
(可选)调用CreatePolicy接口新建权限策略。
如果您已有可用权限策略,可跳过该步骤。
PolicyDocument
(权限策略)需按如下设置:{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
调用AttachPolicyToRole接口为实例RAM角色授权。
调用AttachInstanceRamRole接口将实例RAM角色授予给ECS实例。
收回/更改实例RAM角色
通过控制台收回/更改
登录ECS管理控制台。
在左侧导航栏,选择 。
在页面左侧顶部,选择目标资源所在的资源组和地域。
找到要操作的ECS实例,选择
。收回实例RAM角色:操作类型选择收回,单击确定。
更改实例RAM角色:操作类型选择授予,选择所需的实例RAM角色,单击确定完成更改。
通过API收回/更改
收回实例RAM角色:调用DetachInstanceRamRole接口收回实例RAM角色。
更改实例RAM角色:
调用DetachInstanceRamRole接口收回实例RAM角色。
调用AttachInstanceRamRole接口重新为实例授予新的RAM角色。
应用示例:使用实例RAM角色访问其他云资源
下文以部署在Linux ECS实例上的Python应用程序访问OSS为例,为您介绍实例内部的应用程序如何通过实例RAM角色访问OSS并下载图片。
准备工作。
已创建ECS实例RAM角色,授予OSS访问权限(AliyunOSSReadOnlyAccessOSS),并将该RAM角色授予给ECS实例。
具体操作,可参见创建实例RAM角色并授予给ECS。
ECS实例所在的地域已创建了存储空间(Bucket),并已获取Bucket的名称和Endpoint。
具体操作,请参见创建存储空间。
远程连接ECS实例,安装OSS Python SDK和alibabacloud_credentials。
说明下文以Linux实例为例,如果您使用的是Windows ECS实例,请参见安装OSS Python SDK。
pip install alibabacloud_credentials pip install oss2
基于临时凭证使用Python SDK访问OSS,下载图片。
示例代码如下(部分信息需按实际情况替换):
import oss2 from alibabacloud_credentials.client import Client from alibabacloud_credentials.models import Config from oss2 import CredentialsProvider from oss2.credentials import Credentials class CredentialProviderWarpper(CredentialsProvider): def __init__(self, client): self.client = client def get_credentials(self): access_key_id = self.client.get_access_key_id() access_key_secret = self.client.get_access_key_secret() security_token = self.client.get_security_token() return Credentials(access_key_id, access_key_secret, security_token) def download_image_using_instance_role(bucket_name, endpoint, object_key, local_file, role_name): config = Config( type='ecs_ram_role', # 访问凭证类型。固定为ecs_ram_role。 role_name=role_name # 为ECS授予的实例RAM角色的名称 ) cred = Client(config) credentials_provider = CredentialProviderWarpper(cred) auth = oss2.ProviderAuth(credentials_provider) # 初始化 OSS Bucket 对象 bucket = oss2.Bucket(auth, endpoint, bucket_name) # 下载图片到本地 bucket.get_object_to_file(object_key, local_file) print("Image downloaded successfully") if __name__ == "__main__": # 定义全局变量 role_name role_name = 'ECSRoleName' # 替换为实例RAM角色名称 bucket_name = 'bucket-name' # 替换为Bucket名称 endpoint = 'http://oss-cn-hangzhou.aliyuncs.com' # 替换为OSS外网节点 object_key = 'image.png' # 替换为你要下载的图片在OSS中的存储路径 local_file = '/home/image.png' # 替换为图片需要存储在ECS的路径 download_image_using_instance_role(bucket_name, endpoint, object_key, local_file, role_name)
相关文档
配置完ECS实例RAM角色后,通过实例RAM角色访问其他云资源之前,需要先获取该实例RAM角色的临时授权访问凭证:获取实例RAM角色的临时授权访问凭证。