インスタンス Resource Access Management (RAM) ロールは、Elastic Compute Service (ECS) インスタンスにアタッチできるサービスロールです。インスタンス RAM ロールの信頼できるエンティティは ECS です。インスタンス RAM ロールを使用すると、AccessKey ペアを提供することなく、ECS インスタンス内からセキュリティトークンサービス (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 インスタンスのネットワークタイプは VPC (virtual private cloud) である必要があります。
ECS インスタンスには 1 つの RAM ロールしかアタッチできません。
手順
Alibaba Cloud アカウントを使用している場合、次の権限付与ステップはスキップできます。RAM ユーザーまたは RAM ロールを使用して次の操作を実行する場合は、その ID に必要な権限を付与する必要があります。
RAM ロールを作成して ECS インスタンスにアタッチする
コンソールでロールを作成してアタッチする
Resource Access Management (RAM) コンソールにログインして RAM ロールを作成し、権限を付与します。
信頼できる Alibaba Cloud サービスの RAM ロールを作成します。
[ID] > [ロール] を選択し、[ロールの作成] をクリックして、画面の指示に従ってロールを作成します。次のパラメーターに注意し、必要に応じて他のパラメーターを構成します。詳細については、「通常のサービスロールの作成」をご参照ください:
[信頼できるエンティティタイプ] で、[Alibaba Cloud サービス] を選択します。
[信頼できるサービス] で、[Elastic Compute Service] を選択します。
作成した 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) で再試行します。 enable_imds_v1=True, ) 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/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 をインストールします。
認証情報を構成します。
次のコマンドを実行して、認証情報を構成します。<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("イメージは正常にダウンロードされました")
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 インスタンスにデプロイされている場合、インスタンス RAM ロールを ECS インスタンスにアタッチし、インスタンス RAM ロールを使用してインスタンスから Key Management Service (KMS) にアクセスできます。詳細については、「ECS インスタンスにアタッチされたインスタンス RAM ロールを使用して KMS に安全にアクセスする」をご参照ください。
ECS インスタンスが特定の権限を必要としなくなった場合は、インスタンスにアタッチされているインスタンス RAM ロールから権限を取り消すことができます。詳細については、「RAM ロールから権限を取り消す」をご参照ください。
コードにプレーンテキストの AccessKey をハードコーディングして Alibaba Cloud OpenAPI にアクセスすると、コードリポジトリの権限管理が不適切なために AccessKey が漏洩する可能性があります。Alibaba Cloud OpenAPI にアクセスするには、ハードコーディングされた AccessKey の代わりにアクセス認証情報を使用することをお勧めします。詳細については、「アクセス認証情報を使用して Alibaba Cloud OpenAPI にアクセスするためのベストプラクティス」をご参照ください。
> [インスタンス設定] > [RAM ロールのアタッチ/デタッチ]