Elastic Compute Service (ECS) では、インスタンス Resource Access Management (RAM) ロールは、ECS インスタンスにアタッチされる通常のサービスロールであり、インスタンス RAM ロールの信頼できるエンティティは ECS です。 インスタンス RAM ロールを使用すると、AccessKey ペアを提供することなく、ECS インスタンス内から一時的なアクセス認証情報としてセキュリティトークンサービス (STS) トークンを取得できます。 その後、一時的なアクセス認証情報を使用して、他の Alibaba Cloud サービスの API 操作を呼び出すことができます。 一時的なアクセス認証情報は ECS インスタンス内からのみ取得でき、AccessKey ペアを提供する必要はありません。 これにより、Alibaba Cloud アカウントの AccessKey ペアのセキュリティが確保され、RAM を使用してきめ細かいアクセスの制御と権限管理を実装できます。
メリット
ECS インスタンス内でのセキュアで便利な API 操作呼び出し: プロジェクトが ECS インスタンスにデプロイされている場合、ECS が提供する機能を使用して、コード内に AccessKey ペアを設定することなく、一時的なアクセス認証情報として STS トークンを取得して API 操作を呼び出すことができます。 これにより、AccessKey ペアの漏洩のリスクが軽減されます。
簡素化された RAM ID スイッチオーバー: サービスのアクセス認証情報として RAM ID の AccessKey ペアを使用する場合、RAM ID を変更するときに構成またはコード内の AccessKey ペアを変更し、サービスを再起動する必要があります。 インスタンス RAM ロールを使用してサービスの一時的なアクセス認証情報として STS トークンを取得する場合、RAM ID を変更するときにインスタンス RAM ロールを変更するだけで済みます。 追加の構成は必要ありません。
きめ細かい権限管理: 特定のポリシーを含むインスタンス RAM ロールを異なる ECS インスタンスにアタッチできます。 これにより、ビジネス要件に基づいてきめ細かいアクセスの制御を実装できます。
制限事項
インスタンス RAM ロールを ECS インスタンスにアタッチする際には、次の制限事項に注意してください。
インスタンス RAM ロールをアタッチする ECS インスタンスは、仮想プライベートクラウド (VPC) 内に存在する必要があります。
1 つの ECS インスタンスには、1 つのインスタンス RAM ロールのみアタッチできます。
手順
Alibaba Cloud アカウントを使用して後続の操作を実行する場合、インスタンス RAM ロールを構成および使用するための追加の権限をアカウントに付与する必要はありません。 RAM ユーザーまたは RAM ロールを使用して後続の操作を実行する場合は、RAM ユーザーまたは RAM ロールに次の権限を付与します。
インスタンス RAM ロールを作成し、ECS インスタンスに適用する
コンソールを使用する
RAM コンソール にログインし、インスタンス RAM ロールを作成し、RAM ロールに権限を付与します。
信頼できるエンティティが Alibaba Cloud サービスであるインスタンス RAM ロールを作成します。
左側のナビゲーションウィンドウで、[IDと権限] > [ロール] を選択します。 [ロール] ページで、[ロールの作成] をクリックします。 [ロールの作成] ページで、次のパラメーターを特定の値に設定し、ビジネス要件に基づいて他のパラメーターを構成します。 パラメーター設定については、「信頼できる Alibaba Cloud サービスの RAM ロールの作成」トピックの「通常のサービスロールを作成する」セクションをご参照ください。
信頼できるエンティティの選択: [alibaba Cloud サービス] を選択します。
ロールタイプ: [通常のサービスロール] を選択します。
信頼できるサービスの選択: [elastic Compute Service] を選択します。
RAM ロールに権限を付与します。
システムポリシーまたはカスタムポリシーを RAM ロールにアタッチして、特定のリソースへのアクセスまたは管理の権限を付与します。 たとえば、AliyunOSSReadOnlyAccess カスタムポリシーを RAM ロールに付与できます。
説明システムポリシーがビジネス要件を満たしていない場合は、RAM ロールのカスタムポリシーを作成できます。
インスタンス RAM ロールを ECS インスタンスにアタッチします。
ECS コンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、リソースが属するリージョンとリソースグループを選択します。
インスタンス RAM ロールをアタッチする ECS インスタンスを見つけ、[操作] 列の
を選択します。[RAM ロールの適用/解除] ダイアログボックスで、[RAM ロール] ドロップダウンリストから作成したインスタンス RAM ロールを選択し、[OK] をクリックします。
API 操作を呼び出す
インスタンス RAM ロールを作成し、RAM ロールに権限を付与します。
CreateRole 操作を呼び出して、インスタンス RAM ロールを作成します。
AssumeRolePolicyDocument パラメーターを次のポリシーに設定します。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
(オプション) CreatePolicy 操作を呼び出して、ポリシーを作成します。
インスタンス RAM ロールにアタッチできるポリシーがすでにある場合は、この手順をスキップします。
PolicyDocument
パラメーターを次のポリシーに設定します。{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
AttachPolicyToRole 操作を呼び出して、ポリシーをインスタンス RAM ロールにアタッチします。
AttachInstanceRamRole 操作を呼び出して、インスタンス RAM ロールを ECS インスタンスにアタッチします。
インスタンス RAM ロールの一時的なアクセス認証情報を取得する
メタデータサービスにアクセスすることにより、ECS インスタンス内から一時的なアクセス認証情報を取得できます。 一時的なアクセス認証情報の有効性は保証されています。 詳細については、「インスタンスメタデータを取得する」をご参照ください。
方法 1: Alibaba Cloud Credentials ツールを使用する
Alibaba Cloud Credentials ツールは、一時的なアクセス認証情報として STS トークンを取得するために ECS メタデータサービスを呼び出すロジックをカプセル化し、一時的なアクセス認証情報の定期的な更新をサポートします。
次のセクションでは、SDK for Python および SDK for Java で Alibaba Cloud Credentials ツールを使用する方法の例を示します。
Python
Alibaba Cloud Credentials ツールをインストールします。
pip install alibabacloud_credentials
インスタンス RAM ロールを使用して一時的なアクセス認証情報を取得するように ECS インスタンスを構成します。
from alibabacloud_credentials.client import Client as CredClient from alibabacloud_credentials.models import Config as CredConfig credentialConfig = CredConfig( type='ecs_ram_role', # オプション。インスタンス RAM ロール名を指定します。 このパラメーターを指定しない場合、システムはインスタンス RAM ロール名を自動的に取得します。 リクエスト数を減らすために、このパラメーターを指定することをお勧めします。 role_name='<ロール名>' ) credentialsClient = CredClient(credentialConfig)
Java
credentials の依存関係を追加します。
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.3.4</version> </dependency>
インスタンス 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"); // オプション。インスタンス RAM ロール名を指定します。 このパラメーターを指定しない場合、システムはインスタンス RAM ロール名を自動的に取得します。 リクエスト数を減らすために、このパラメーターを指定することをお勧めします。 credentialConfig.setRoleName("<ロール名>"); Client credentialClient = new Client(credentialConfig); } }
方法 2: シェルコマンドを使用する
メタデータサービスは、一時的なアクセス認証情報を取得するための HTTP エンドポイントを提供します。
セキュリティ強化モード
Linux インスタンス
# 認証用のメタデータサーバーのアクセス認証情報を取得します。 TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:<メタデータサーバーのアクセス認証情報の有効期間>"` # インスタンス RAM ロールの一時的なアクセス認証情報を取得します。 curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/ram/security-credentials/<インスタンス RAM ロールの名前>
Windows インスタンス (PowerShell)
# 認証用のメタデータサーバーのアクセス認証情報を取得します。 $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "<メタデータサーバーのアクセス認証情報の有効期間>"} -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/<インスタンス RAM ロールの名前>
<メタデータサーバーのアクセス認証情報の有効期間>
: インスタンス RAM ロールの一時的なアクセス認証情報を取得する前に、メタデータサーバーのアクセス認証情報を取得し、データセキュリティを高めるために認証情報の有効期間を指定する必要があります。 指定された有効期間が終了した後、メタデータサーバーのアクセス認証情報を再取得する必要があります。 そうしないと、インスタンス RAM ロールの一時的なアクセス認証情報を取得できません。
有効な値: 1 ~ 21600 。 単位: 秒。 詳細については、「インスタンスメタデータを取得する」をご参照ください。
<インスタンス RAM ロールの名前>
: <インスタンス RAM ロールの名前> を実際の値に置き換えます。 例: EcsRamRole
。
通常モード
Linux インスタンス
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<インスタンス RAM ロールの名前>
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/<インスタンス RAM ロールの名前>
<インスタンス 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" }
インスタンス 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', # アクセスクレデンシャルのタイプを指定します。このパラメーターを ecs_ram_role に設定します。
role_name=role_name
)
cred = Client(config)
credentials_provider = CredentialProviderWarpper(cred)
auth = oss2.ProviderAuth(credentials_provider)
# OSS バケットを初期化します。
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' # OSS バケットの名前を指定します。
endpoint = 'http://oss-cn-beijing-internal.aliyuncs.com' # OSS バケットのエンドポイントを指定します。内部エンドポイントを使用する場合は、ECS インスタンスと 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)
その他の操作
インスタンス RAM ロールのデタッチまたは変更
ECS コンソールを使用する
ECS コンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、リソースが属するリージョンとリソースグループを選択します。
管理する ECS インスタンスを見つけ、[アクション] 列で
を選択します。ECS インスタンスにアタッチされているインスタンス RAM ロールをデタッチするには、[アクション] パラメーターを バインド解除 に設定し、[確認] をクリックします。
ECS インスタンスにアタッチされているインスタンス RAM ロールを変更するには、[アクション] パラメーターを バインド に設定し、[RAM ロール] ドロップダウンリストから別のインスタンス RAM ロールを選択して、[確認] をクリックします。
API 操作を呼び出す
ECS インスタンスからインスタンス RAM ロールをデタッチするには、DettachInstanceRamRole 操作を呼び出します。
ECS インスタンスにアタッチされているインスタンス RAM ロールを変更するには、次の操作を呼び出します。
ECS インスタンスからインスタンス RAM ロールをデタッチするには、DettachInstanceRamRole 操作を呼び出します。
別のインスタンス RAM ロールを ECS インスタンスにアタッチするには、AttachInstanceRamRole 操作を呼び出します。
参考資料
セルフマネージド アプリケーションが ECS インスタンスにデプロイされている場合は、インスタンス RAM ロールを ECS インスタンスにアタッチし、インスタンス RAM ロールを使用してインスタンスから Key Management Service (KMS) にアクセスできます。詳細については、「ECS インスタンスにアタッチされたインスタンス RAM ロールを使用して KMS に安全にアクセスする」をご参照ください。
ECS インスタンスが特定の権限を必要としなくなった場合は、インスタンスにアタッチされているインスタンス RAM ロールから権限を取り消すことができます。詳細については、「RAM ロールから権限を取り消す」をご参照ください。
プレーンテキストの AccessKey ペアを Alibaba Cloud の API 操作を呼び出すために使用するコードにハードコードした場合、コードリポジトリの権限管理が不適切なために AccessKey ペアが漏洩する可能性があります。Alibaba Cloud の API 操作を呼び出すには、ハードコードされた AccessKey ペアではなくアクセス認証情報を使用することをお勧めします。詳細については、「アクセス認証情報を使用して API 操作を呼び出すためのベストプラクティス」および「認証情報セキュリティ ソリューション」をご参照ください。