インスタンス Resource Access Management (RAM) ロールは、Elastic Compute Service (ECS) インスタンスにアタッチできるサービスロールです。インスタンス RAM ロールの信頼できるエンティティは ECS です。インスタンス RAM ロールを使用すると、AccessKey ペアを提供することなく、ECS インスタンス内から Security Token Service (STS) トークンを取得できます。その後、STS トークンを使用して、他の Alibaba Cloud サービスの API 操作を呼び出すことができます。一時的な認証情報はインスタンス内からのみ取得できるため、AccessKey ペアを設定する必要がありません。これにより、ご利用の Alibaba Cloud アカウントの AccessKey ペアのセキュリティが強化され、RAM を使用してきめ細かな権限管理を実装できます。
メリット
インスタンス内での安全で便利な API 呼び出し:ご利用のプロジェクトが Alibaba Cloud の ECS インスタンスにデプロイされている場合、コードに AccessKey ペアを設定する必要はありません。代わりに、ECS の機能を使用して STS トークンを取得し、API を呼び出すことができます。これにより、AccessKey ペアの漏洩リスクが軽減されます。
RAM ID の切り替えの簡素化:従来の AccessKey ペアを使用する場合、サービスを呼び出す RAM ID を変更するには、設定やコードを修正してサービスを再起動する必要があります。インスタンス RAM ロールを使用する場合、ECS インスタンスに付与されている RAM ロールを調整するだけで ID を切り替えることができます。その他の変更は不要です。
きめ細かな権限管理:特定の権限ポリシーを持つ RAM ロールを異なる ECS インスタンスに割り当てることができます。これにより、必要に応じてきめ細かなアクセス制御を実装できます。
制限事項
RAM ロールを ECS インスタンスにアタッチする場合、以下の制限が適用されます。
ECS インスタンスには、1つの RAM ロールしかアタッチできません。
操作手順
RAM ユーザーまたは RAM ロールを使用して以下の操作を実行する場合は、その ID に必要な権限を付与してください。
RAM ロールの作成と ECS インスタンスへのアタッチ
コンソールでのロールの作成とアタッチ
Resource Access Management (RAM) コンソールにログインして、RAM ロールを作成し、権限を付与します。
信頼できる Alibaba Cloud サービス用の RAM ロールを作成します。
[ID > ロール] を選択し、[ロールの作成] をクリックし、画面の指示に従ってロールを作成します。 次のパラメーターを設定し、必要に応じて他のパラメーターを設定します。 詳細については、「通常のサービスロールを作成する」をご参照ください。
信頼できるエンティティタイプを [Alibaba Cloud サービス] に設定します。
信頼できるサービスを [ECS] に設定します。
作成した RAM ロールに権限を付与します。
システムポリシーまたはカスタムポリシーを RAM ロールにアタッチして、必要なリソースアクセス権限または操作権限を付与します。たとえば、AliyunOSSReadOnlyAccess システムポリシーを RAM ロールに付与します。
システムポリシーが要件を満たさない場合は、カスタムポリシーを作成して RAM ロールに権限を付与できます。詳細については、「カスタムポリシーの作成」をご参照ください。
RAM ロールを ECS インスタンスにアタッチします。
ECS コンソール - インスタンスに移動します。上部のナビゲーションバーで、対象のリージョンとリソースグループを選択します。
対象の ECS インスタンスを見つけ、を選択します。
ダイアログボックスで、作成したインスタンス RAM ロールを選択し、[OK] をクリックします。
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 インスタンス内からメタデータサービスにアクセスすることで、一時的なアクセス認証情報を取得できます。一時的なアクセス認証情報の有効期間は自動的に管理されます。詳細については、「インスタンスメタデータ」をご参照ください。
方法1:プログラムで Credentials ツールを使用
Credentials ツールは、ECS インスタンスメタデータサービス (IMDS) を呼び出して STS トークンを取得するロジックをカプセル化しています。また、定期的な更新もサポートしています。
Python
Credentials ツールをインストールします。
セキュリティ強化モードで一時的な認証情報を取得するには、alibabacloud_credentials のバージョンが 0.3.6 以降である必要があります。
pip install alibabacloud_credentialsECS インスタンスの RAM ロールをアクセス認証情報として設定します。
from alibabacloud_credentials.client import Client as CredClient from alibabacloud_credentials.models import Config as CredConfig credentialsConfig = CredConfig( type='ecs_ram_role', # オプション。インスタンス RAM ロールの名前。このパラメーターを指定しない場合、名前は自動的に取得されます。リクエストを減らすために、このパラメーターを指定することを推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用してロール名を設定することもできます。 role_name='<role_name>', # オプション。デフォルト値は False です。True に設定すると、セキュリティ強化モードが強制されます。False に設定すると、システムはまずセキュリティ強化モードで認証情報を取得しようとします。失敗した場合、システムは通常モード (IMDSv1) で再試行します。 disable_imds_v1=False, ) credentialsClient = CredClient(credentialsConfig)詳細については、「方法5:ECS インスタンス RAM ロール」をご参照ください。
Java
Credentials の依存関係を追加します。
セキュリティ強化モードで一時的な認証情報を取得するには、credentials-java のバージョンが 0.3.10 以降である必要があります。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.10</version> </dependency>ECS インスタンスのインスタンス RAM ロールをアクセス認証情報として設定します。
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"); // オプション。インスタンス RAM ロールの名前。このパラメーターを指定しない場合、名前は自動的に取得されます。リクエストを減らすために、このパラメーターを指定することを推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用してロール名を設定することもできます。 credentialConfig.setRoleName("<RoleName>"); // オプション。デフォルト値は false です。true に設定すると、セキュリティ強化モードが強制されます。false に設定すると、システムはまずセキュリティ強化モードで認証情報を取得しようとします。失敗した場合、システムは通常モード (IMDSv1) で再試行します。 credentialConfig.setDisableIMDSv1(true); Client credentialClient = new Client(credentialConfig); } }詳細については、「方法5:ECS インスタンス RAM ロール」をご参照ください。
Go
Credentials ツールをインストールします。
セキュリティ強化モードで一時的な認証情報を取得するには、credentials-go のバージョンが 1.3.10 以降である必要があります。
go getを使用してツールをダウンロードし、インストールします。go get -u github.com/aliyun/credentials-godepを使用して依存関係を管理する場合は、次のコマンドを実行します。dep ensure -add github.com/aliyun/credentials-go
ECS インスタンスのインスタンス RAM ロールをアクセス認証情報として設定します。
package main import ( "fmt" "github.com/aliyun/credentials-go/credentials" ) func _main(args []*string) { credentialsConfig := new(credentials.Config). SetType("ecs_ram_role"). // オプション。インスタンス RAM ロールの名前。このパラメーターを指定しない場合、名前は自動的に取得されます。リクエストを減らすために、このパラメーターを指定することを推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用してロール名を設定することもできます。 SetRoleName("<RoleName>"). // オプション。デフォルト値は false です。true に設定すると、セキュリティ強化モードが強制されます。false に設定すると、システムはまずセキュリティ強化モードで認証情報を取得しようとします。失敗した場合、システムは通常モード (IMDSv1) で再試行します。 SetDisableIMDSv1(true) credentialClient, err := credentials.NewCredential(credentialsConfig) if err != nil { panic(err) } }詳細と呼び出し例については、「方法5:ECS インスタンス RAM ロールの使用」をご参照ください。
Node.js
Credentials ツールをインストールします。
セキュリティ強化モードで一時的な認証情報を取得するには、credentials のバージョンが 2.3.1 以降である必要があります。
npm install @alicloud/credentialsECS インスタンスのインスタンス RAM ロールをアクセス認証情報として設定します。
const Credential = require('@alicloud/credentials'); const credentialsConfig = new Credential.Config({ type: 'ecs_ram_role', // オプション。インスタンス RAM ロールの名前。このパラメーターを指定しない場合、名前は自動的に取得されます。リクエストを減らすために、このパラメーターを指定することを推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用してロール名を設定することもできます。 roleName: '<RoleName>', // オプション。デフォルト値は false です。true に設定すると、セキュリティ強化モードが強制されます。false に設定すると、システムはまずセキュリティ強化モードで認証情報を取得しようとします。失敗した場合、システムは通常モード (IMDSv1) で再試行します。 disableIMDSv1: true, }); const cred = new Credential.default(credentialsConfig);詳細と呼び出し例については、「方法5:ECS インスタンス RAM ロールの使用」をご参照ください。
.NET
Credentials ツールをインストールします。
セキュリティ強化モードで一時的な認証情報を取得するには、credentials のバージョンが 1.4.2 以降である必要があります。
dotnet add package Aliyun.CredentialsECS インスタンスのインスタンス RAM ロールをアクセス認証情報として設定します。
using Aliyun.Credentials.Models; namespace credentials_demo { class Program { static void Main(string[] args) { var config = new Config() { Type = "ecs_ram_role", // オプション。インスタンス RAM ロールの名前。このパラメーターを指定しない場合、名前は自動的に取得されます。リクエストを減らすために、このパラメーターを指定することを推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用してロール名を設定することもできます。 RoleName = "<RoleName>", // オプション。デフォルト値は false です。true に設定すると、セキュリティ強化モードが強制されます。false に設定すると、システムはまずセキュリティ強化モードで認証情報を取得しようとします。失敗した場合、システムは通常モード (IMDSv1) で再試行します。 DisableIMDSv1 = true } } } }詳細と呼び出し例については、「方法5:ECS インスタンス RAM ロールの使用」をご参照ください。
PHP
Credentials ツールをインストールします。
セキュリティ強化モードで一時的な認証情報を取得するには、credentials のバージョンが 1.2.0 以降である必要があります。
composer require alibabacloud/credentialsECS インスタンスのインスタンス RAM ロールをアクセス認証情報として設定します。
<?php use AlibabaCloud\Credentials\Credential; use AlibabaCloud\Credentials\Credential\Config; $credConfig = new Config([ 'type' => 'ecs_ram_role', // オプション。インスタンス RAM ロールの名前。このパラメーターを指定しない場合、名前は自動的に取得されます。リクエストを減らすために、このパラメーターを指定することを推奨します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用してロール名を設定することもできます。 'roleName' => '<RoleName>', // オプション。デフォルト値は false です。true に設定すると、セキュリティ強化モードが強制されます。false に設定すると、システムはまずセキュリティ強化モードで認証情報を取得しようとします。失敗した場合、システムは通常モード (IMDSv1) で再試行します。 'disableIMDSv1' => true, ]);詳細と呼び出し例については、「方法5:ECS インスタンス RAM ロールの使用」をご参照ください。
方法2:シェルコマンドの使用
メタデータサービスは、一時的なアクセス認証情報を取得するための HTTP エンドポイントを提供します。
セキュリティ強化モード
Linux インスタンス
# メタデータサーバーのアクセストークンを取得して認証します。 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_token>"` # インスタンス RAM ロールの一時的なアクセス認証情報を取得します。 curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/ram/security-credentials/<instance_RAM_role_name>
Windows インスタンス (PowerShell)
# メタデータサーバーのアクセストークンを取得して認証します。 $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "<validity_period_of_the_metadata_server_access_token>"} -Method PUT -Uri http://100.100.100.200/latest/api/token # インスタンス RAM ロールの一時的なアクセス認証情報を取得します。 Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/ram/security-credentials/<instance_RAM_role_name>
<validity_period_of_the_metadata_server_access_token>:インスタンス RAM ロールの一時的なアクセス認証情報を取得する前に、メタデータサーバーのアクセストークンを取得し、その有効期間を設定してデータセキュリティを強化する必要があります。トークンが有効期限切れになった後は、再取得する必要があります。そうしないと、インスタンス RAM ロールの一時的なアクセス認証情報を取得できません。
有効な値:1~21600。単位:秒。詳細については、「インスタンスメタデータ」をご参照ください。
<instance_RAM_role_name> をご利用のインスタンス RAM ロールの名前に置き換えます。例:EcsRamRole。
クラウドアシスタントを使用して上記のコマンドを実行する場合、クラウドアシスタントエージェントが次の最小バージョン要件を満たしていることを確認してください。
プラットフォーム | クラウドアシスタントエージェントの最小バージョン |
windows | 2.1.3.857 |
linux | 2.2.3.857 |
linux arm | 2.4.3.857 |
freebsd | 2.3.3.857 |
通常モード
Linux インスタンス
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<instance_RAM_role_name>Windows インスタンス (PowerShell)
Invoke-RestMethod http://100.100.100.200/latest/meta-data/ram/security-credentials/<instance_RAM_role_name><instance_RAM_role_name>をご利用のインスタンス RAM ロールの名前に置き換えます。例:EcsRamRoleDocumentTesting。
次のコードは応答のサンプルです。
一時的なアクセストークンは、
AccessKeyId、AccessKeySecret、SecurityTokenの値で構成されます。Expiration:一時的なアクセス認証情報の有効期限。{ "AccessKeyId" : "STS.*******6YSE", "AccessKeySecret" : "aj******jDU", "Expiration" : "2017-11-01T05:20:01Z", "SecurityToken" : "CAISng********", "LastUpdated" : "2023-07-18T14:17:28Z", "Code" : "Success" }
方法 3: Alibaba Cloud CLI を使用する
コマンドラインインターフェイス (CLI) は、ECS IMDS を呼び出して STS トークンを取得することをサポートしています。また、定期的かつ自動的な更新もサポートしています。
セキュリティ強化モードで一時的な認証情報を取得するには、CLI のバージョンが 3.0.248 以降である必要があります。
CLI をインストールします。
ID 認証情報を設定します。
次のコマンドを実行して、認証情報を構成します。<ProfileName> をご使用の構成の名前に置き換えてください。
aliyun configure --profile <ProfileName> --mode EcsRamRoleこれは対話型のコマンドです。プロンプトに従って必要な情報を入力してください。詳細については、「認証情報の設定」をご参照ください。
API 操作を呼び出します。
たとえば、CLI を使用して ECS インスタンスのリストをクエリします。
aliyun ecs DescribeInstancesCLI コマンドの詳細については、「コマンドの構造」をご参照ください。
インスタンス RAM ロールを使用した API の呼び出し
次の例では、インスタンス RAM ロールの使用方法を示します。Linux ECS インスタンスにデプロイされた Python アプリケーションが OSS API 操作を呼び出してファイルをダウンロードします。
pip install oss2
pip install alibabacloud_credentialsimport 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
)
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' # ご利用のインスタンス RAM ロールの名前に置き換えます。
bucket_name = 'bucket_name' # ご利用のバケット名に置き換えます。
endpoint = 'oss-cn-beijing.aliyuncs.com' # ご利用の OSS バケットのパブリックエンドポイントに置き換えます。
object_key = 'testfolder/example.png' # OSS からダウンロードするイメージの完全なパスに置き換えます。バケット名は含めないでください。
local_file = '/localpath/to/image.png' # イメージを保存する ECS インスタンスのルートパスに置き換えて、イメージ名を定義します。
download_image_using_instance_role(bucket_name, endpoint, object_key, local_file, role_name)
その他の操作
ECS インスタンスのインスタンス RAM ロールのデタッチまたは変更
コンソールでのロールのデタッチまたは変更
ECS コンソール - インスタンスに移動します。上部のナビゲーションバーで、対象のリージョンとリソースグループを選択します。
管理する ECS インスタンスを見つけ、を選択します。
RAM ロールをデタッチするには、[アクション] を デタッチ に設定し、[OK] をクリックします。
インスタンス RAM ロールを変更するには、[アクション] を アタッチ に設定し、目的のインスタンス RAM ロールを選択してから、[OK] をクリックします。
API を使用したロールのデタッチまたは変更
インスタンス RAM ロールをデタッチするには、DetachInstanceRamRole 操作を呼び出します。
インスタンス RAM ロールを変更するには:
DetachInstanceRamRole 操作を呼び出して、現在のインスタンス RAM ロールをデタッチします。
AttachInstanceRamRole 操作を呼び出して、新しい RAM ロールをインスタンスにアタッチします。
関連ドキュメント
自己管理アプリケーションが ECS インスタンスにデプロイされており、KMS サービスにアクセスする必要がある場合は、ECS インスタンス RAM ロールを使用して KMS に安全にアクセスできます。
ECS インスタンスが特定の権限を必要としなくなった場合は、RAM ロールから権限を取り消すことができます。
コードにプレーンテキストの AccessKey をハードコーディングして Alibaba Cloud OpenAPI にアクセスすると、コードリポジトリの不適切な権限管理が原因で AccessKey が漏洩する可能性があります。AccessKey のハードコーディングを避け、代わりにアクセス認証情報を使用して Alibaba Cloud OpenAPI にアクセスすることを推奨します。
> インスタンス設定 > RAM ロールのアタッチ/デタッチ