全部产品
Search
文档中心

云服务器 ECS:通过实例RAM角色控制资源访问

更新时间:Mar 05, 2024

实例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角色。

通过控制台创建和授予

  1. 登录RAM控制台,创建实例RAM角色并为其授权。

    1. 创建可信实体为阿里云服务的RAM角色。

      选择身份管理 > 角色,单击创建角色,按照界面提示完成角色创建。注意以下参数(其他参数按需填写,可参见创建可信实体为阿里云服务的RAM角色):

      • 可信实体类型:选择阿里云服务

      • 角色类型:选择普通服务角色

      • 受信服务:选择云服务器

    2. 为已创建的RAM角色授权。

      角色列表页,找到已创建的RAM角色,单击操作列的新增授权,为已创建的RAM角色添加所需权限。例如RAM角色授予访问OSS的权限:AliyunOSSReadOnlyAccessOSS。

      说明

      支持添加系统策略自定义策略。新建自定义策略,可参见创建自定义权限策略

  2. 授予实例RAM角色给ECS实例。

    1. 登录ECS管理控制台

    2. 在左侧导航栏,选择实例与镜像 > 实例

    3. 在页面左侧顶部,选择目标资源所在的资源组和地域。地域

    4. 找到要操作的ECS实例,选择图标 > 实例设置 > 授予/收回RAM角色

    5. 在对话框中,选择创建好的实例RAM角色,单击确定完成授予。

通过API创建和授予

  1. 创建并配置实例RAM角色

    1. 调用CreateRole接口创建实例RAM角色。

      按如下策略设置参数AssumeRolePolicyDocument

      {
           "Statement": [
           {
               "Action": "sts:AssumeRole",
               "Effect": "Allow",
               "Principal": {
               "Service": [
               "ecs.aliyuncs.com"
               ]
               }
           }
           ],
           "Version": "1"
       }
    2. (可选)调用CreatePolicy接口新建权限策略。

      如果您已有可用权限策略,可跳过该步骤。

      PolicyDocument(权限策略)需按如下设置:

      {
           "Statement": [
               {
               "Action": [
                   "oss:Get*",
                   "oss:List*"
               ],
               "Effect": "Allow",
               "Resource": "*"
               }
           ],
           "Version": "1"
       }
    3. 调用AttachPolicyToRole接口为实例RAM角色授权。

  2. 调用AttachInstanceRamRole接口将实例RAM角色授予给ECS实例。

收回/更改实例RAM角色

通过控制台收回/更改

  1. 登录ECS管理控制台

  2. 在左侧导航栏,选择实例与镜像 > 实例

  3. 在页面左侧顶部,选择目标资源所在的资源组和地域。地域

  4. 找到要操作的ECS实例,选择图标 > 实例设置 > 授予/收回RAM角色

    • 收回实例RAM角色:操作类型选择收回,单击确定

    • 更改实例RAM角色:操作类型选择授予,选择所需的实例RAM角色,单击确定完成更改。

      image.png

通过API收回/更改

应用示例:使用实例RAM角色访问其他云资源

下文以部署在Linux ECS实例上的Python应用程序访问OSS为例,为您介绍实例内部的应用程序如何通过实例RAM角色访问OSS并下载图片。

  1. 准备工作。

    1. 已创建ECS实例RAM角色,授予OSS访问权限(AliyunOSSReadOnlyAccessOSS),并将该RAM角色授予给ECS实例。

      具体操作,可参见创建实例RAM角色并授予给ECS

    2. ECS实例所在的地域已创建了存储空间(Bucket),并已获取Bucket的名称和Endpoint。

      具体操作,请参见创建存储空间

  2. 远程连接ECS实例,安装OSS Python SDK和alibabacloud_credentials。

    说明

    下文以Linux实例为例,如果您使用的是Windows ECS实例,请参见安装OSS Python SDK

    pip install alibabacloud_credentials
    pip install oss2
  3. 基于临时凭证使用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角色的临时授权访问凭证