すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:インスタンスの RAM ロール

最終更新日:Nov 19, 2024

ECS (Elastic Compute Service) では、インスタンスRAMロールはECSインスタンスにアタッチされた通常のサービスロールであり、インスタンスRAMロールの信頼できるエンティティはECSです。 インスタンスRAMロールを使用すると、AccessKeyペアを提供する必要なく、ECSインスタンス内から一時的なアクセス資格情報としてSecurity Token Service (STS) トークンを取得できます。 その後、一時的なアクセス資格情報を使用して、他のAlibaba CloudサービスのAPI操作を呼び出すことができます。 一時的なアクセス資格情報はECSインスタンス内からのみ取得でき、AccessKeyペアを提供する必要はありません。 これにより、Alibaba CloudアカウントのAccessKeyペアのセキュリティが確保され、RAMを使用してきめ細かいアクセス制御と権限管理を実装できます。

メリット

  • ECSインスタンス内の安全で便利なAPI操作呼び出し: プロジェクトがECSインスタンスにデプロイされている場合、ECSが提供する機能を使用して、コードでAccessKeyペアを設定することなく、一時的なアクセス資格情報としてSTSトークンを取得し、API操作を呼び出すことができます。 これにより、AccessKeyペアがリークするリスクが軽減されます。

  • RAM IDの切り替えの簡略化: サービスのアクセス資格情報としてRAM IDのAccessKeyペアを使用する場合、構成またはコードでAccessKeyペアを変更し、RAM IDを変更するときにサービスを再起動する必要があります。 インスタンスRAMロールを使用してサービスの一時的なアクセス資格情報としてSTSトークンを取得する場合、RAM IDを変更するときにのみインスタンスRAMロールを変更する必要があります。 追加の設定は必要ありません。

  • 詳細な権限管理: 特定のポリシーを含むインスタンスRAMロールを異なるECSインスタンスにアタッチできます。 これにより、ビジネス要件に基づいてきめ細かいアクセス制御を実装できます。

制限事項

インスタンスRAMロールをECSインスタンスにアタッチする場合、次の制限事項に注意してください。

  • インスタンスRAMロールをアタッチするECSインスタンスは、仮想プライベートクラウド (VPC) に存在する必要があります。

  • ECSインスタンスにアタッチできるインスタンスRAMロールは1つだけです。

手順

Alibaba Cloudアカウントを使用して後続の操作を実行する場合、インスタンスRAMロールを設定および使用するための追加の権限をアカウントに付与する必要はありません。 RAMユーザーまたはRAMロールを使用して後続の操作を実行する場合は、RAMユーザーまたはRAMロールに次の権限を付与します。

サンプル権限

次の権限を付与します。

  • インスタンスRAMロールの管理: インスタンスRAMロールを作成し、RAMロールに権限を付与する権限。

  • インスタンスRAMロールのアタッチまたはデタッチ: ECSインスタンスの [インスタンスの詳細] ページに移動し、インスタンスRAMロールをインスタンスにアタッチまたはインスタンスRAMロールからデタッチする権限。

  • RAMロールをクラウドサービスに転送: ram:PassRoleアクションを実行する権限。

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:Describe*",
                "ecs:List*",
                "ecs:AttachInstanceRamRole",
                "ecs:DetachInstanceRAMRole"
            ],
            "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "ram:Describe*",              
            "ram:List*",
            "ram:Get*",
            "ram:CreateRole", 
            "ram:CreatePolicy", 
            "ram:AttachPolicyToRole"
          ],
          "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ram:PassRole",
            "Resource": "*"
        }
    ]
}

インスタンスRAMロールを作成し、インスタンスRAMロールをECSインスタンスにアタッチする

コンソールを使用する

  1. RAMコンソールにログインし、インスタンスRAMロールを作成し、インスタンスRAMロールに権限を付与します。

    1. 信頼できるエンティティがAlibaba CloudサービスであるインスタンスRAMロールを作成します。

      左側のナビゲーションウィンドウで、[アイデンティティ]> [ロール] を選択します。 [ロール] ページで、[ロールの作成] をクリックします。 [ロールの作成] ページで、次のパラメーターを特定の値に設定し、ビジネス要件に基づいて他のパラメーターを設定します。 パラメーター設定の詳細については、「信頼できるAlibaba CloudサービスのRAMロールの作成」トピックの通常サービスロールの作成セクションをご参照ください。

      • 信頼できるエンティティの選択: Alibaba Cloudサービスを選択します。

      • ロールの種類: [通常のサービスロール] を選択します。

      • 信頼できるサービスの選択: Elastic Compute Serviceを選択します。

        image

        image

    2. インスタンスRAMロールに権限を付与します。

      作成したシステムポリシーまたはカスタムポリシーをインスタンスRAMロールにアタッチして、インスタンスRAMロールに特定のリソースにアクセスまたは管理する権限を付与します。 たとえば、AliyunOSSReadOnlyAccessポリシーをアタッチして、インスタンスRAMロールにObject Storage Service (OSS) からデータを読み取る権限を付与できます。

      説明

      インスタンスRAMロールにシステムポリシーまたはカスタムポリシーをアタッチできます。 システムポリシーがビジネス要件を満たしていない場合は、カスタムポリシーを作成できます。 詳細については、「カスタムポリシーの作成」をご参照ください。

  2. インスタンスRAMロールをECSインスタンスにアタッチします。

    1. にログインします。ECSコンソール.

    2. 左側のナビゲーションウィンドウで、インスタンス&画像 > インスタンス.

    3. 上部のナビゲーションバーで、リソースが属するリージョンとリソースグループを選択します。 地域

    4. インスタンスRAMロールをアタッチするECSインスタンスを見つけ、[操作] 列の 图标 > インスタンス設定] > [RAMロールのアタッチ /デタッチ] を選択します。

    5. [RAMロールのアタッチ /デタッチ] ダイアログボックスで、[RAMロール] ドロップダウンリストから作成したインスタンスRAMロールを選択し、[確認] をクリックします。

API操作の呼び出し

  1. インスタンスRAMロールを作成し、RAMロールに権限を付与します。

    1. CreateRole操作を呼び出して、インスタンスRAMロールを作成します。

      AssumeRolePolicyDocumentパラメーターを次のポリシーに設定します。

      {
           "Statement": [
             {
                 "Action": "sts:AssumeRole",
                 "Effect": "Allow",
                 "Principal": {
                   "Service": [
                     "ecs.aliyuncs.com"
                   ]
                 }
             }
           ],
           "Version": "1"
       }
    2. (オプション) CreatePolicy操作を呼び出してポリシーを作成します。

      インスタンスRAMロールにアタッチできるポリシーが既にある場合は、この手順をスキップしてください。

      PolicyDocumentパラメーターを次のポリシーに設定します。

      {
           "Statement": [
               {
               "Action": [
                   "oss:Get*",
                   "oss:List*"
               ],
               "Effect": "Allow",
               "Resource": "*"
               }
           ],
           "Version": "1"
       }
    3. AttachPolicyToRole操作を呼び出して、インスタンスRAMロールにポリシーをアタッチします。

  2. AttachInstanceRamRole操作を呼び出して、インスタンスRAMロールをECSインスタンスにアタッチします。

インスタンスRAMロールの一時的なアクセス資格情報の取得

メタデータサービスにアクセスすることで、ECSインスタンス内から一時的なアクセス資格情報を取得できます。 一時的なアクセス資格情報の有効性が保証される。 詳細については、「インスタンスメタデータの取得」をご参照ください。

方法1: Alibaba Cloud Credentialsツールの使用

Alibaba Cloud Credentialsツールは、ECSメタデータサービスを呼び出してSTSトークンを一時的なアクセス資格情報として取得するロジックをカプセル化し、一時的なアクセス資格情報の定期的な更新をサポートします。

次のセクションでは、SDK for PythonおよびSDK for JavaでAlibaba Cloud Credentialsツールを使用する方法の例を示します。

Python
  1. Alibaba Cloud Credentialsツールをインストールします。

    pip install alibabacloud_credentials
  2. インスタンスRAMロールを使用して一時的なアクセス資格情報を取得するようにECSインスタンスを設定します。

    from alibabacloud_credentials.client import Client as CredClient
    from alibabacloud_credentials.models import Config as CredConfig
    
    credentialConfig = CredConfig(
    	type='ecs_ram_role',
    	# Optional. Specify the name of the instance RAM role. If you do not specify this parameter, the system automatically obtains the name of the instance RAM role. To reduce the number of requests, we recommend that you specify this parameter.
    	role_name='<RoleName>'
    )
    credentialsClient = CredClient(credentialConfig)
    

Java

  1. 資格情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</version>
    </dependency>
  2. インスタンスRAMロールを使用して一時的なアクセス資格情報を取得するようにECSインスタンスを設定します。

    import com.aliyun.credentials.Client;
    import com.aliyun.credentials.models.Config;
    
    public class DemoTest {
        public static void main(String[] args) throws Exception {
            Config credentialConfig = new Config();
            credentialConfig.setType("ecs_ram_role");
            // Optional. Specify the name of the instance RAM role. If you do not specify this parameter, the system automatically obtains the name of the instance RAM role. To reduce the number of requests, we recommend that you specify this parameter.
            credentialConfig.setRoleName("<RoleName>");
            Client credentialClient = new Client(credentialConfig);
        }
    }

方法2: シェルコマンドの使用

メタデータサービスは、一時的なアクセス資格情報を取得するためのHTTPエンドポイントを提供します。

セキュリティ強化モード

  • Linux インスタンス

    # Obtain the access credentials of the metadata server for authentication.
    TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:<Validity period of the metadata server access credentials>"` 
    # Obtain temporary access credentials for the instance RAM role.
    curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/ram/security-credentials/<Name of the instance RAM role>
  • Windowsインスタンス (PowerShell)

    # Obtain the access credentials of the metadata server for authentication.
    $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "<Validity period of the metadata server access credentials>"} -Method PUT -Uri http://100.100.100.200/latest/api/token
    # Obtain temporary access credentials for the instance RAM role.
    Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/ram/security-credentials/<Name of the instance RAM role>

<メタデータサーバーのアクセス資格情報の有効期間>: インスタンスRAMロールの一時的なアクセス資格情報を取得する前に、データセキュリティを強化するために、メタデータサーバーのアクセス資格情報を取得し、資格情報の有効期間を指定する必要があります。 指定された有効期間が終了したら、メタデータサーバーのアクセス資格情報を再取得する必要があります。 そうしないと、インスタンスRAMロールの一時的なアクセス資格情報を取得できません。

有効な値: 1 ~ 21600 単位は秒です。 詳細については、「インスタンスメタデータの取得」をご参照ください。

<インスタンスRAMロールの名前>: <インスタンスRAMロールの名前> を実際の値に置き換えます。 例: EcsRamRole

通常モード

  • Linux インスタンス

    curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<Name of the instance RAM role>
  • Windowsインスタンス (PowerShell)

    Invoke-RestMethod http://100.100.100.200/latest/meta-data/Invoke-RestMethod http://100.100.100.200/latest/meta-data/ram/security-credentials/<Name of the instance RAM role>

    <インスタンスRAMロールの名前> を実際の値に置き換えます。 例: EcsRamRoleDocumentTesting。

次のサンプルコードは、サンプル応答を提供します。

  • 一時的なアクセス資格情報は、AccessKeyIdAccessKeySecret、およびSecurityTokenの値で構成されます。

  • 有効期限: 一時的なアクセス資格情報が期限切れになる時点を示します。

    {
       "AccessKeyId" : "STS.*******6YSE",
       "AccessKeySecret" : "aj******jDU",
       "Expiration" : "2017-11-01T05:20:01Z", 
       "SecurityToken" : "CAISng********",
       "LastUpdated" : "2023-07-18T14:17:28Z",
       "Code" : "Success"
    }

インスタンスRAMロールを使用してAPI操作を呼び出す

この例では、Linux ECSインスタンスにデプロイされたPythonアプリケーションが、インスタンスにアタッチされたインスタンスRAMロールを使用してAPI操作を呼び出し、OSSバケットからファイルをダウンロードします。

pip install oss2  
pip install alibabacloud_credentials
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',      # Specify the type of access credential. Set this parameter to ecs_ram_role. 
        role_name=role_name
    )
    cred = Client(config)
    credentials_provider = CredentialProviderWarpper(cred)
    auth = oss2.ProviderAuth(credentials_provider)

    # Initialize the OSS bucket.
    bucket = oss2.Bucket(auth, endpoint, bucket_name)
    # Download the image.
    bucket.get_object_to_file(object_key, local_file)
    print("Image downloaded successfully")

if __name__ == "__main__":  

    # Define global variables.
    role_name = 'role_name'  # Specify the name of the instance RAM role.
    bucket_name = 'bucket_name'  # Specify the name of the OSS bucket.
    endpoint = 'http://oss-cn-beijing-internal.aliyuncs.com'  # Specify the endpoint of the OSS bucket. If an internal endpoint is used, make sure that the ECS instance and the OSS bucket reside in the same region. 
    object_key = 'testfolder/example.png'  # Specify the path in which the image that you want to download is stored in OSS. The path does not include the bucket name.
    local_file = '/localpath/to/image.png'  # Specify a name for the image and the path in which you want to store the image on the ECS instance.
    download_image_using_instance_role(bucket_name, endpoint, object_key, local_file, role_name)

その他の操作

インスタンスRAMロールのデタッチまたは変更

ECSコンソールの使用

  1. ECSコンソールにログインします

  2. 左側のナビゲーションウィンドウで、インスタンス&画像 > インスタンス.

  3. 上部のナビゲーションバーで、リソースが属するリージョンとリソースグループを選択します。 地域

  4. 管理するECSインスタンスを見つけ、[操作] 列の 图标 > [インスタンス設定] > [RAMロールのアタッチ /デタッチ] を選択します。

    • ECSインスタンスにアタッチされているインスタンスRAMロールをデタッチするには、[操作] パラメーターを バインド解除 に設定し、[確認] をクリックします。

    • ECSインスタンスにアタッチされているインスタンスRAMロールを変更するには、[アクション] パラメーターを バインド に設定し、[RAMロール] ドロップダウンリストから別のインスタンスRAMロールを選択し、[確認] をクリックします。

      image.png

API操作の呼び出し

  • ECSインスタンスからインスタンスRAMロールをデタッチするには、DettachInstanceRamRole操作を呼び出します。

  • ECSインスタンスにアタッチされているインスタンスRAMロールを変更するには、次の操作を呼び出します。

    1. DettachInstanceRamRole操作を呼び出して、インスタンスRAMロールをECSインスタンスからデタッチします。

    2. AttachInstanceRamRole操作を呼び出して、異なるインスタンスRAMロールをECSインスタンスにアタッチします。

関連ドキュメント