他のAlibaba Cloudサービスのリソースにアクセスするには、インスタンスにデプロイされているElastic Compute Service (ECS) インスタンスまたはアプリケーションに、対応するアクセス資格情報が必要です。 Alibaba Cloudサービスは、アクセス資格情報を使用して、ECSインスタンスまたはインスタンスにデプロイされたアプリケーションのIDと権限を認証します。 インスタンスのRAM (Resource Access Management) ロールをECSインスタンスにアタッチできます。 ECSインスタンスとインスタンスにデプロイされたアプリケーションは、インスタンス内から一時的なアクセス資格情報を自動的に取得および更新して、AccessKeyペアを公開せずに他のAlibaba Cloudサービスのリソースにアクセスできます。 これにより、AccessKeyペアのリークのリスクが軽減され、リソースに対するアクセス許可のRAMロールベースのきめ細かい管理が可能になり、過度のアクセス許可が付与されるのを防ぎます。 このトピックでは、インスタンスRAMロールを作成し、インスタンスRAMロールをECSインスタンスにアタッチし、インスタンスRAMロールに基づいて一時的なアクセス資格情報を取得する方法について説明します。
インスタンスRAMロールは、信頼できるエンティティがAlibaba CloudサービスであるRAMロールの一種です。 このタイプのRAMロールは、Alibaba Cloudサービス全体のアクセスを許可するために使用され、Alibaba Cloudサービスが引き受けることができます。 RAMロールの詳細については、RAMロールとは何ですか? 「RAMロールの概要」トピックのセクション。
メリット
インスタンスRAMロールを使用して、認証とアクセス制御の一時的なアクセス資格情報を取得すると、次の利点が得られます。
強化された通信セキュリティ: AccessKeyペアの代わりにsecurity Token Service (STS) トークンを使用してリソースにアクセスできます。
クロスサービスアクセスと詳細な権限管理: 異なるポリシーを含むインスタンスRAMロールをアタッチして、最小権限の原則に基づいて特定のリソースにのみアクセスをECSインスタンスに付与できます。
簡易権限メンテナンス: ECSインスタンスにアタッチされているインスタンスRAMロールのポリシーを変更して、インスタンスの資格情報を管理する必要なく、インスタンスのアクセス権限を変更および管理できます。
制限事項
インスタンスRAMロールをECSインスタンスにアタッチする場合、次の制限事項に注意してください。
仮想プライベートクラウド (VPC) にECSインスタンスをデプロイする必要があります。
ECSインスタンスにアタッチできるインスタンスRAMロールは1つだけです。
手順
インスタンスRAMロールを作成し、インスタンスRAMロールをECSインスタンスにアタッチ
インスタンスRAMロールを作成し、インスタンスRAMロールに特定のAlibaba Cloudサービスにアクセスするために必要な権限を付与します。 たとえば、ECSインスタンスがObject Storage Service (OSS) にアクセスできるようにするには、インスタンスRAMロールにOSSからデータを読み書きする権限を付与する必要があります。
RAMユーザーを使用してこのトピックで説明する手順を実行する場合は、RAMユーザーにインスタンスRAMロールを使用および構成する権限が付与されていることを確認してください。 詳細については、「RAMユーザーにECSリソースの使用権限を付与」をご参照ください。
コンソールを使用する
RAMコンソールにログインしてインスタンスRAMロールを作成し、インスタンスRAMロールに権限を付与します。
信頼できるエンティティがAlibaba CloudサービスであるRAMロールを作成します。
左側のナビゲーションウィンドウで、[アイデンティティ]> [ロール] を選択します。 [ロール] ページで、[ロールの作成] をクリックします。 [ロールの作成] ページで、次のパラメーターを特定の値に設定し、ビジネス要件に基づいて他のパラメーターを設定します。 パラメーター設定の詳細については、「信頼できるAlibaba CloudサービスのRAMロールの作成」トピックの通常サービスロールの作成セクションをご参照ください。
信頼できるエンティティの選択: Alibaba Cloudサービスを選択します。
ロールの種類: [通常のサービスロール] を選択します。
信頼できるサービスの選択: Elastic Compute Serviceを選択します。
インスタンスRAMロールに権限を付与します。
作成したシステムポリシーまたはカスタムポリシーをインスタンスRAMロールにアタッチして、インスタンスRAMロールに特定のリソースにアクセスまたは管理する権限を付与します。 たとえば、AliyunOSSReadOnlyAccessポリシーをアタッチして、インスタンスRAMロールにOSSからデータを読み書きする権限を付与できます。
説明インスタンスRAMロールにシステムポリシーまたはカスタムポリシーをアタッチできます。 システムポリシーがビジネス要件を満たしていない場合は、カスタムポリシーを作成できます。 詳細については、「カスタムポリシーの作成」をご参照ください。
インスタンスRAMロールをECSインスタンスにアタッチします。
ECSコンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、リソースが属するリージョンとリソースグループを選択します。
インスタンスRAMロールをアタッチするECSインスタンスを見つけ、[操作] 列の
を選択します。[RAMロールのアタッチ /デタッチ] ダイアログボックスで、[RAMロール] ドロップダウンリストから作成したインスタンスRAMロールを選択し、[確認] をクリックします。
API操作の呼び出し
インスタンス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インスタンスにデプロイされたアプリケーションが他のAlibaba Cloudサービスにアクセスするための一時的なアクセス資格情報を取得した後、アプリケーションは一時的なアクセス資格情報を利用してAPI操作を安全に呼び出し、Alibaba Cloudサービス全体のデータにアクセスまたは管理します。 一時的なアクセス資格情報は、定期的に自動的に更新されます。
方法1: SDKでAlibaba Cloud Credentialsツールを使用する
Alibaba Cloud Credentialsツールは、ECSインスタンスにアタッチされているインスタンスRAMロールを取得し、ECSのメタデータサービス (メタデータサーバー) を呼び出して、インスタンスRAMロールに基づく一時的なアクセス資格情報としてSTSトークンを取得します。 一時的なアクセス証明は、定期的に更新される。
次のサンプルコードは、SDK for PythonおよびSDK for JavaでAlibaba Cloud Credentialsツールを使用する方法の例を示しています。 他のプログラミング言語のSDKのサンプルコードを表示するには、「アクセス資格情報を使用してAPI操作を呼び出すためのベストプラクティス」トピックのサンプルコードセクションを参照してください。
Python
Alibaba Cloud Credentialsツールをインストールします。
sudo pip install alibabacloud_credentials
インスタンスRAMロールを使用して一時的なアクセス資格情報を取得するようにECSインスタンスを設定します。
alibabacloud_credentials.clientからの
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 RAM role of the ECS instance. If you do not specify this parameter, its value is automatically obtained. To reduce the number of requests, we recommend that you specify this parameter. role_name='<RoleName>' ) credentialsClient = CredClient(credentialConfig)
Java
資格情報の依存関係を追加します。
<!- https://mvnrepository.com/artifact/com.aliyun/credentials-java -> <dependency> <groupId>com.aliyun</groupId> <artifactId> 資格情報-java</artifactId> <version>0.3.4</version> </dependency>
インスタンスRAMロールを使用して一時的なアクセス資格情報を取得するようにECSインスタンスを設定します。
com.aliyun.credentials.Clientをインポートします。import com.aliyun.credentials.mo dels.Config; パブリッククラスDemoTest { public static void main(String[] args) throws Exception { Config credentialConfig = new Config(); credentialConfig.setType("ecs_ram_role"); // Optional. ECSインスタンスのRAMロールの名前を指定します。 このパラメーターを指定しない場合、値は自動的に取得されます。 リクエスト数を減らすには、このパラメーターを指定することを推奨します。 credentialConfig.setRoleName("<RoleName>"); クライアントcredentialClient = newクライアント (credentialConfig); } }
方法2: メタデータを使用したECSインスタンス内の一時的なアクセス資格情報の取得
特定のシナリオでは、Alibaba Cloud Credentialsツールがない、または使用できない場合、またはスクリプト内のインスタンスRAMロールに基づいて一時的なアクセス資格情報を取得する場合、ECSインスタンス内からメタデータサーバーにアクセスできます。
メタデータサーバーにアクセスして、ECSコンソールにログインしたり、API操作を呼び出したりすることなく、ECSインスタンス内からインスタンスメタデータを取得できます。 詳細については、「インスタンスメタデータの取得」をご参照ください。
セキュリティ強化モード
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ロールの名前> を実際の値に置き換えます。 例: EcsRamRoleDocumentTesting。
通常モード
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。
次のコードスニペットは、応答のサンプルを示しています。
SecurityToken
: インスタンスRAMロールの一時的なアクセス資格情報を示します。有効期限
: インスタンスRAMロールの一時的なアクセス資格情報の有効期限が切れる時刻を示します。{ "AccessKeyId" : "STS.*******6YSE", "AccessKeySecret" : "aj******jDU", "Expiration" : "2017-11-01T05:20:01Z", "SecurityToken" : "CAISng********", "LastUpdated" : "2023-07-18T14:17:28Z", "Code" : "Success" }
インスタンスRAMロールのデタッチまたは変更
ECSコンソールの使用
ECSコンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、リソースが属するリージョンとリソースグループを選択します。
管理するECSインスタンスを見つけ、[操作] 列の
を選択します。ECSインスタンスにアタッチされているインスタンスRAMロールをデタッチするには、[操作] パラメーターを バインド解除 に設定し、[確認] をクリックします。
ECSインスタンスにアタッチされているインスタンスRAMロールを変更するには、[アクション] パラメーターを バインド に設定し、[RAMロール] ドロップダウンリストから別のインスタンスRAMロールを選択し、[確認] をクリックします。
API操作の呼び出し
ECSインスタンスからインスタンスRAMロールをデタッチするには、DettachInstanceRamRole操作を呼び出します。
ECSインスタンスにアタッチされているインスタンスRAMロールを変更するには、次の操作を呼び出します。
DettachInstanceRamRole操作を呼び出して、インスタンスRAMロールをECSインスタンスからデタッチします。
AttachInstanceRamRole操作を呼び出して、異なるインスタンスRAMロールをECSインスタンスにアタッチします。
例: インスタンスRAMロールを使用した他のAlibaba Cloudサービスへのアクセス
この例では、Linux ECSインスタンスにデプロイされたPythonアプリケーションは、インスタンスRAMロールを使用してOSSからイメージをダウンロードします。
準備を完了します。
インスタンスRAMロールを作成し、AliyunOSSReadOnlyAccessポリシーをインスタンスRAMロールにアタッチしてから、インスタンスRAMロールをLinux ECSインスタンスにアタッチします。
詳細については、このトピックの「インスタンスRAMロールを作成し、インスタンスRAMロールをECSインスタンスにアタッチする」をご参照ください。
ECSインスタンスが存在するリージョンにOSSバケットを作成し、バケットページからバケットの名前とエンドポイントを取得します。 詳細は、「バケットの作成」をご参照ください。
重要インターネット経由でOSSにアクセスする場合は、ECSインスタンスがインターネットにアクセスできることを確認してください。 ECSインスタンスがIPv4経由でインターネットにアクセスできるようにするには、ECSインスタンスのパブリック帯域幅設定を変更するか、ECSインスタンスにEIP (elastic IP address) を関連付けることができます。 詳細については、「自動割り当てパブリックIPアドレスに関連付けられたインスタンスのパブリック帯域幅設定の変更」または「EIPの関連付けまたは関連付けの解除」トピックの「1つ以上のEIPとインスタンスの関連付け」セクションをご参照ください。
画像をOSSバケットにアップロードします。 詳細については、「簡易アップロード」トピックのOSSコンソールの使用セクションをご参照ください。
Linux ECSインスタンスに接続し、OSS SDK for PythonとAlibaba Cloud Credentialsツールをインストールします。
説明この例では、Alibaba Cloud Linux 3オペレーティングシステムを実行するECSインスタンスが使用されています。 デフォルトでは、Python 3はAlibaba Cloud Linux 3にインストールされます。 別のLinuxオペレーティングシステムを実行するECSインスタンスを使用する場合は、Pythonのバージョンに基づいてこのセクションのコマンドを変更します。 Windowsオペレーティングシステムを実行するECSインスタンスを使用する場合は、「Installation」に記載されている手順に従って、OSS SDK for Pythonをインストールします。
pip、setuptools、およびホイールツールを更新します。
sudo pip3 install --upgrade pip setuptools wheel
Alibaba Cloud Credentialsツールをインストールします。
sudo pip3 install alibabacloud_credentials
OSS SDK for pythonが依存するPython-develパッケージをインストールします。
sudo yum install python3-devel
OSS SDK for Pythonをインストールします。
sudo pip3 install oss2
インスタンスRAMロールの一時的なアクセス資格情報を使用して、OSSにアクセスし、イメージをダウンロードします。
Pythonコードをコンパイルします。 サンプルPythonコード (変数を実際の値に置き換える ):
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. 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)
関連ドキュメント
自己管理アプリケーションがECSインスタンスにデプロイされている場合、ECSインスタンスにインスタンスRAMロールをアタッチし、インスタンスRAMロールを使用してインスタンスからKey Management Service (KMS) にアクセスできます。 詳細については、「ECSインスタンスにアタッチされたインスタンスRAMロールを使用してKMSに安全にアクセスする」をご参照ください。
ECSインスタンスが特定の権限を必要としなくなった場合、インスタンスにアタッチされているインスタンスRAMロールから権限を取り消すことができます。 詳細については、「RAMロールから権限を取り消す」をご参照ください。
Alibaba CloudのAPI操作を呼び出すために使用するコードで平文のAccessKeyペアをハードコーディングすると、コードリポジトリの不適切な権限管理により、AccessKeyペアが漏洩する可能性があります。 Alibaba CloudのAPI操作を呼び出すには、ハードコードされたAccessKeyペアの代わりにアクセス認証情報を使用することを推奨します。 詳細については、「アクセス資格情報を使用してAPI操作を呼び出すためのベストプラクティス」および「credentialセキュリティソリューション」をご参照ください。