DSW インスタンスに RAM ロールを関連付けることで、インスタンスはそのロールの一時的な STS 認証情報を使用して他のクラウドリソースにアクセスできます。これにより、長期的な AccessKey の設定が不要になり、認証情報の漏洩のリスクを軽減します。
インスタンス RAM ロールとは
インスタンス RAM ロールは、DSW インスタンスに一時的なロールベースのアイデンティティを提供します。DSW インスタンスに RAM ロールが付与されると、次のことが可能になります。
-
インスタンス内のプロセスは、ローカルメタデータサービスまたは認証情報ファイルから短期 STS 認証情報を自動的に取得できます。
-
認証情報には、アタッチされた許可ポリシーで定義された権限が付与され、OSS、MaxCompute、PAI-DLC などの承認済みクラウドサービスへの安全なアクセスが可能になります。
-
コードや設定ファイル内に AccessKey を平文で保存する必要が完全になくなり、セキュリティおよびコンプライアンスの要件を満たせます。
主な利点は次のとおりです。
-
セキュア:長期的な AccessKey の代わりに、自動更新される短期 STS 認証情報を使用するため、ハードコードされたキーや認証情報が漏洩するリスクを排除します。
-
容易な管理:RAM ロールポリシーを通じて権限を一元管理できます。ポリシーの変更は、インスタンスの再起動やコードの更新をすることなく、すぐに有効になります。
-
ネイティブな信頼性:認証情報は Alibaba Cloud Security Token Service (STS) が発行するため、追加の認証ミドルウェアは不要で、デフォルトで信頼されます。
制限事項
DSW インスタンスに関連付けられる RAM ロールは、一度に 1 つのみです。
操作手順
ステップ 1:RAM ロールの設定
DSW インスタンスの設定ページで、次の 3 つのロールオプションから 1 つを選択できます。
PAI デフォルトロール
Platform for AI (PAI) はデフォルトロールを提供します。このロールをインスタンスに付与すると、AccessKey を設定することなく、次のリソースに自動的にアクセスできるようになります。
-
ODPS SDK を使用して、インスタンスの所有者が実行権限を持つ MaxCompute プロジェクトにジョブを送信できます。
-
OSS SDK を使用して、現在のワークスペース用に設定されたデフォルトのストレージパスバケット内のデータにアクセスできます。
-
WebIDE で通義霊碼サービスを使用できます。
-
PAI または PAI-DLC SDK を使用して、現在のワークスペースにトレーニングジョブを作成および送信できます。
カスタムロール
-
RAM コンソールにログオンし、RAM ロールを作成します。詳細な手順については、「信頼できる Alibaba Cloud サービスの RAM ロールを作成する」をご参照ください。
主要なパラメーターを次のように設定します。
-
信頼されたエンティティタイプ:[Alibaba Cloud サービス]
-
信頼されたエンティティ名:機械学習 PAI (pai.aliyun.cs.com)
-
-
RAM ロールに権限を付与します。
[Add Authorization] をクリックし、システムまたはカスタムの許可ポリシーを RAM ロールにアタッチします。これにより、ロールは必要なリソースにアクセスまたは操作するための権限を取得します。たとえば、AliyunOSSFullAccess ポリシーを追加します。詳細については、「ステップ 3:RAM ロールに権限を付与する」をご参照ください。
説明RAM ユーザーを使用して DSW インスタンスを操作する場合は、お使いのルートアカウントの管理者に依頼し、次の許可ポリシーを作成して RAM ユーザーにアタッチしてもらってください。このポリシーにより、RAM ユーザーはインスタンス RAM ロールを使用できるようになります。
次のコードは、必要な許可ポリシーを示しています。
${RoleName}を DSW インスタンスの RAM ロール名に置き換えてください。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram::*:role/${RoleName}" } ] }
関連付けなし
インスタンスがワークスペース内で公開されている場合は、権限漏洩を防ぐため、RAM ロールを関連付けないことを推奨します。インスタンスの作成時または設定変更時に、詳細情報 セクションで RAM ロール を ロールを関連付けない に設定します。
RAM ロール設定の更新
-
DSW ページに移動します。
-
PAI コンソールにログオンし、対象のリージョンとワークスペースを選択します。
-
左側のナビゲーションペインで、モデル開発とトレーニング > Data Science Workshop (DSW) を選択して、DSW ページに移動します。
-
-
DSW インスタンスの右側にある 設定の変更 をクリックします。
-
ロールと権限 セクションで、インスタンスの RAM ロールを設定します。
重要実行中のインスタンスの RAM ロールを PAI デフォルトロール または カスタムロール から ロールを関連付けない に切り替えるか、ロールを関連付けない から PAI デフォルトロール または カスタムロール に切り替えると、インスタンスはすぐに再起動されます。必ずインスタンスを保存してください。
-
設定が完了したら、OK をクリックします。
ステップ 2:一時的な認証情報の取得
インスタンスに RAM ロールを関連付けた後、いくつかの方法で一時的な認証情報を取得し、クラウドサービスにアクセスできます。
認証情報ツール
Alibaba Cloud SDK の認証情報ツールを使用することを推奨します。このツールは認証情報の取得と更新を自動的に処理するため、クラウドサービスにアクセスする際のベストプラクティスです。
-
依存関係をインストールします (Python の例):
pip install alibabacloud_credentials -
使用例:
from alibabacloud_credentials.client import Client as CredClient from alibabacloud_credentials.models import Config as CredConfig credentialsConfig = CredConfig( type='credentials_uri' # オプション。デフォルトの認証情報チェーンで他のアクセス方法を設定していない場合、このタイプを明示的に指定する必要はありません。Credentials SDK は、デフォルトの認証情報チェーンの一環として URI メソッドを使用し、一時的な認証情報を取得します。 ) credentialsClient = CredClient(credentialsConfig)
他の言語の SDK サンプルについては、「認証情報を使用して Alibaba Cloud OpenAPI にアクセスするためのベストプラクティス」をご参照ください。
ローカルサービス
DSW インスタンスのターミナルで次のコマンドを実行すると、ローカルに注入されたサービスから認証情報を取得できます。
# インスタンス RAM ロールの一時的なアクセス認証情報を取得します
curl $ALIBABA_CLOUD_CREDENTIALS_URI
次はレスポンスのサンプルです。
-
SecurityToken:インスタンス RAM ロールの一時的なトークン。
-
Expiration:一時的なアクセス認証情報の有効期限。
{
"Code": "Success",
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******",
"Expiration": "2024-05-21T10:39:29Z"
}
ローカルファイル
DSW インスタンスでは、PAI がインスタンス RAM ロールの一時的な認証情報を含むファイルを自動的に注入し、定期的に更新します。パス /mnt/.alibabacloud/credentials からこのファイルを読み取ることで、認証情報を取得できます。ファイルの内容は次のとおりです。
{
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******",
"Expiration": "2024-05-21T10:39:29Z"
}
ステップ 3:他のクラウドサービスへのアクセス
OSS へのアクセス
-
次のコマンドを実行して、認証情報ツールと OSS SDK をインストールします。
# 認証情報ツールをインストールします pip install alibabacloud_credentials # OSS SDK をインストールします pip install oss2 -
インスタンス RAM ロールの一時的な認証情報を使用して OSS にアクセスし、指定したバケット内のオブジェクトを 10 個一覧表示します。OSS リージョンエンドポイントについては、「リージョンとエンドポイント」をご参照ください。
import oss2 from alibabacloud_credentials.client import Client from alibabacloud_credentials import providers from itertools import islice auth = oss2.ProviderAuth(providers.DefaultCredentialsProvider()) bucket = oss2.Bucket(auth, '<oss_endpoint>', # を、お使いの OSS バケットのリージョンエンドポイントに置き換えます。 '<oss_bucket>' # を、お使いの OSS バケット名に置き換えます。 ) for b in islice(oss2.ObjectIterator(bucket), 10): print(b.key)
MaxCompute へのアクセス
-
次のコマンドを実行して、認証情報ツールと ODPS SDK をインストールします。
# 認証情報ツールをインストールします pip install alibabacloud_credentials # ODPS SDK をインストールします pip install odps -
インスタンス RAM ロールの一時的な認証情報を使用して MaxCompute にアクセスし、指定したプロジェクト内のテーブル一覧を取得します。MaxCompute リージョンエンドポイントについては、「エンドポイント」をご参照ください。
from alibabacloud_credentials import providers from odps.accounts import CredentialProviderAccount from odps import ODPS if __name__ == '__main__': account = CredentialProviderAccount(providers.DefaultCredentialsProvider()) o = ODPS( account=account, project="<odps_project>", # を、お使いのプロジェクト名に置き換えます。 endpoint="<odps_endpoint>" # を、プロジェクトのリージョンエンドポイントに置き換えます。 ) for t in o.list_tables(): print(t)
PAI-DLC へのアクセス
-
次のコマンドを実行して、認証情報ツール、OpenAPI SDK、PAI-DLC SDK をインストールします。
# 認証情報ツールをインストールします pip install alibabacloud_credentials # Alibaba Cloud OpenAPI SDK をインストールします pip install alibabacloud-tea-util alibabacloud_tea_openapi # PAI-DLC SDK をインストールします pip install alibabacloud_pai_dlc20201203 -
インスタンス RAM ロールの一時的な認証情報を使用して PAI-DLC にアクセスし、指定したワークスペース内の PAI-DLC ジョブを一覧表示します。
from alibabacloud_credentials.client import Client as CredClient from alibabacloud_tea_openapi.models import Config from alibabacloud_pai_dlc20201203.client import Client as pai_dlc20201203Client from alibabacloud_pai_dlc20201203 import models as pai_dlc_20201203_models from alibabacloud_tea_util.models import RuntimeOptions # 認証情報ツールを使用して PAI-DLC クライアントを初期化します。 credentialsClient = CredClient() config = Config(credential=credentialsClient) config.endpoint = '<dlc_endpoint>' # を、お使いのリージョンのエンドポイントに置き換えます。 client = pai_dlc20201203Client(config) # リクエストを初期化し、ListJobs API を呼び出します。 list_jobs_request = pai_dlc_20201203_models.ListJobsRequest() list_jobs_request.workspace_id = '<workspace_id>' # を、お使いのワークスペース ID に置き換えます。 runtime_options = RuntimeOptions() headers = {} resp = client.list_jobs_with_options(list_jobs_request, headers, runtime_options) jobs = resp.to_map()['body']['Jobs'] print(jobs[0])
FAQ
Resolve PassRoleFailedError
Log on to the RAM console to verify that the role exists.
-
If the role does not exist, change the instance RAM role to an existing role.
-
If the role exists, ask your root account administrator to grant your RAM user permission to use this role. The required permission policy is as follows (replace ${RoleName} with the name of the RAM role):
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram::*:role/${RoleName}" } ] }
Resolve AssumeRoleFailedError
This error usually occurs because your role's trust policy is configured incorrectly. Follow these steps to resolve the issue:
-
Log on to the RAM console as a RAM administrator.
-
In the navigation pane on the left, choose Identity Management > Roles.
-
On the Roles page, click the name of the target RAM role.
-
On the Trust Policy tab, click Edit Trust Policy.
-
Modify the trust policy to add
pai.aliyuncs.comto theServiceprincipal, and then click OK.For example, if the original trust policy is:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::aaa:root" ], "Service": [ "xxx.aliyuncs.com" ] } } ], "Version": "1" }Update the policy to include
pai.aliyuncs.com:{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::aaa:root" ], "Service": [ "xxx.aliyuncs.com", "pai.aliyuncs.com" ] } } ], "Version": "1" }