Elastic Algorithm Service (EAS) サービスに RAM ロールをアタッチすると、サービス内で実行されるコードが、長期的なアクセスキーを保存することなく、他の Alibaba Cloud API を呼び出せるようになります。実行時に、サービスインスタンスは短期的な STS 認証情報を自動的に取得し、有効期限が切れる前に更新します。
利点
ハードコーディングされたアクセスキーの代わりに RAM ロールを使用すると、以下の 2 つの利点があります。
-
セキュリティ:認証情報の有効期間は短く、サービスイメージや設定に保存されません。漏洩の可能性がある長期キーは存在しません。
-
きめ細かな制御:RAM ロールの権限ポリシーをいつでも更新して、サービスがアクセスできる対象を再デプロイすることなく変更できます。
制限事項
各 EAS サービスに関連付けることができる RAM ロールは 1 つだけです。
ロールタイプの選択
| [PAI のデフォルトロール] | [カスタムロール] | |
|---|---|---|
| 概要 | 組み込みのサービスロール AliyunServiceRoleForPaiEas であり、自動的に利用可能です |
ユーザーが作成および設定する RAM ロール |
| 権限 | MaxCompute と OSS のみ | ユーザーが付与した任意の Alibaba Cloud サービス |
| 使用するケース | サービス所有者が実行権限を持つ MaxCompute プロジェクトまたはワークスペースのデフォルト OSS バケットへのアクセス | その他のシナリオ、またはよりきめ細かな権限制御が必要な場合 |
| 設定の手間 | サービス設定に JSON フィールドを 1 つ追加 | ロールを作成してポリシーを付与し、ロールの ARN をサービス設定に追加 |
前提条件
開始する前に、以下が満たされていることを確認してください。
-
PAI に EAS サービスがあるか、デプロイメントの準備が完了していること
-
(カスタムロールの場合) ロールを作成および管理するための RAM コンソールへのアクセス権
-
(RAM ユーザーの場合) プライマリアカウントに連絡して、
ram:PassRole権限を付与してもらってください。詳細については、「RAM ユーザーへの PassRole 権限の付与」をご参照ください。
PAI デフォルトロールのアタッチ
デプロイする際に、[サービス構成] セクションの JSON に、次のフィールドを追加してください:
"options": {
"enable_ram_role": true
}
これを有効にすると、サービスインスタンスは以下にアクセスできるようになります。
-
PyODPS SDK を介した、EAS サービス所有者が実行権限を持つ MaxCompute プロジェクト内のデータ
-
OSS SDK を介した、現在のワークスペースにプリセットされているデフォルト OSS バケット内のデータ
直接 JSON を使用してデプロイし、PAI デフォルトロールを介して OSS SDK を使用する場合は、サービス設定に metadata.workspace_id フィールドを含めてください。
カスタム RAM ロールのアタッチ
ステップ 1: RAM ロールの作成
-
RAM コンソールにログインし、RAM ロールを作成します。
-
以下のパラメーターを設定します。
パラメーター 値 [プリンシパルタイプ] クラウドサービス [プリンシパル名] Platform for AI/PAI ( eas.pai.aliyuncs.com) -
新しいロールの [信頼ポリシー] タブで、
Serviceプリンシパル配列にeas.pai.aliyuncs.comが含まれていることを確認します。 この信頼ポリシーは、どのサービスがロールを引き受けることができるかを制御します。 正しく設定された信頼ポリシーは、次のようになります。重要このエントリがないことが、
failed to assume roleデプロイエラーの最も一般的な原因です。ロールが別のプリンシパル (たとえば、別のサービスなど) で作成された場合は、[信頼ポリシーの編集] をクリックし、Service配列に"eas.pai.aliyuncs.com"を追加します。{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "eas.pai.aliyuncs.com" ] } } ], "Version": "1" }
ステップ 2: ロールへの権限の付与
システムポリシーまたはカスタムポリシーをアタッチして、サービスが必要とするリソースへのアクセス権をロールに付与します。たとえば、AliyunOSSReadOnlyAccess をアタッチして OSS への読み取りアクセスを許可します。
サービスがデプロイ時にデータソース (NAS または OSS) をマウントしたり、カスタムイメージをプルしたりする場合は、ロールに対応する権限を付与してください。
-
データソース: NAS アクセスコントロールまたはOSS アクセスコントロール
-
コンテナイメージ: Container Registry
ステップ 3: デプロイ時のロールの関連付け
[サービス設定] セクションの JSON に以下を追加します。role_arn を、作成したロールの ARN に置き換えます。ARN を確認するには、「RAM ロールの表示」をご参照ください。
"options": {
"enable_ram_role": true
},
"role_arn": "acs:ram::111*************:role/${RoleName}"
RAM ユーザーへの PassRole 権限の付与
RAM ユーザー (サブアカウント) として EAS サービスをデプロイする場合、プライマリアカウントはあなたに ram:PassRole 権限を付与する必要があります。これがないと、デプロイはロール設定エラーで失敗します。
プライマリアカウントに、あなたの RAM ユーザーに以下のカスタムポリシーをアタッチするよう依頼してください。${RoleName} を EAS サービスに関連付けられた RAM ロールの名前に置き換えます。詳細については、「カスタム権限ポリシーの作成」と「RAM ユーザーへの権限の付与」をご参照ください。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram::*:role/${RoleName}"
}
]
}
一時的なアクセス認証情報の取得
ロールをアタッチした後、サービスインスタンスは 3 つの方法で STS 一時認証情報を取得できます。いずれの方法でも同じ認証情報フィールドが返されます。
方法 1: 認証情報ツール
認証情報ツールは、サービスインスタンスに自動的に注入されるローカルエンドポイントから認証情報を読み取ります。認証情報は定期的に更新されるため、コードでローテーションを処理する必要はありません。
デプロイする際、[サードパーティライブラリ構成] セクションで alibabacloud_credentials をインストールします (イメージにすでに含まれている場合はスキップします)。
次に、以下のコードを使用して認証済みクライアントを初期化します。
from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_credentials.models import Config as CredConfig
credentials_config = CredConfig(type='credentials_uri')
credentials_client = CredClient(credentials_config)
詳細については、「アクセス認証情報を使用した Alibaba Cloud OpenAPI へのアクセスのベストプラクティス」をご参照ください。
方法 2: ローカル認証情報エンドポイントの呼び出し
サービスインスタンス内で、自動的に注入されたローカルサーバーを呼び出して現在の認証情報を取得します。
# インスタンス RAM ロールの一時的な認証情報を取得
curl $ALIBABA_CLOUD_CREDENTIALS_URI
レスポンス例:
{
"Code": "Success",
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******",
"Expiration": "2024-05-21T10:39:29Z"
}
| フィールド | 説明 |
|---|---|
SecurityToken |
RAM ロールの一時トークン |
Expiration |
認証情報の有効期限 (UTC) |
方法 3: 認証情報ファイルの読み取り
PAI-EAS は、サービスインスタンス内の /etc/ram/credentials に認証情報を自動的に書き込み、ファイルを定期的に更新します。ローカル HTTP 呼び出しが不便な場合は、このファイルを直接読み取ります。
{
"Code": "Success",
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******",
"Expiration": "2024-05-21T10:39:29Z"
}
例
以下の例は、RAM ロールを使用して EAS サービス内から OSS および MaxCompute にアクセスする方法を示しています。どちらの例も providers.DefaultCredentialsProvider() を使用しており、注入されたローカルエンドポイントから自動的に認証情報を取得します。
この例では、PAI コンソールの [カスタムデプロイ] ページを使用します。パラメーターの詳細については、「コンソールカスタムデプロイメントのパラメーター説明」をご参照ください。
サンプルの仕組み:[モデル設定] でサービスインスタンスに Python スクリプトをマウントし、実行コマンドを設定して実行します。これにより、カスタムイメージのビルドが不要になります。
例 1: OSS データへのアクセス
import oss2
from alibabacloud_credentials.client import Client
from alibabacloud_credentials import providers
from itertools import islice
if __name__ == '__main__':
auth = oss2.ProviderAuth(providers.DefaultCredentialsProvider())
bucket = oss2.Bucket(
auth,
'<oss_endpoint>', # 内部エンドポイント (例: oss-cn-hangzhou-internal.aliyuncs.com)
'<oss_bucket>' # 現在のワークスペースのデフォルト OSS バケットである必要があります
)
for b in islice(oss2.ObjectIterator(bucket), 10):
print(b.key)
プレースホルダーを置き換えます。
| プレースホルダー | 説明 |
|---|---|
<oss_bucket> |
OSS バケット名。現在のワークスペースにプリセットされているデフォルト OSS バケットである必要があります。 |
<oss_endpoint> |
バケットのリージョンのエンドポイント。EAS はデフォルトでパブリックインターネットに接続しないため、内部エンドポイント (例: oss-cn-hangzhou-internal.aliyuncs.com) を使用してください。パブリックエンドポイントを使用するには、EAS 用にインターネットアクセスを持つ Virtual Private Cloud (VPC) を設定します。詳細については、「ネットワーク設定」をご参照ください。 |
例 2: MaxCompute (PyODPS) へのアクセス
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>', # MaxCompute プロジェクト名
endpoint='<odps_endpoint>' # 内部エンドポイント (例: https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api)
)
for t in o.list_tables():
print(t)
プレースホルダーを置き換えます。
| プレースホルダー | 説明 |
|---|---|
<odps_project> |
MaxCompute プロジェクト名。MaxCompute コンソール[Workspace][Project Management]の > で確認できます。RAM ユーザーとしてデプロイする場合は、そのユーザーがプロジェクトの操作権限を持っていることを確認してください。詳細については、「他のユーザーへの権限付与」をご参照ください。 |
<odps_endpoint> |
プロジェクトのリージョンのエンドポイント。EAS はデフォルトでパブリックインターネットに接続しないため、内部エンドポイント (例: https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api) を使用してください。パブリックエンドポイントを使用するには、EAS 用にインターネットアクセスを持つ VPC を設定します。詳細については、「ネットワーク設定」をご参照ください。 |
例のデプロイ
[Custom Deployment] ページで、以下のパラメーターを設定します。
| パラメーター | 値 |
|---|---|
| [Command] ([Environment Information] 配下) | python /mnt/data/xx.py |
| [Model Configuration] | スクリプトを含むディレクトリをマウントし、マウントパスを /mnt/data/ に設定します |
| [Third-party Library List] ([Third-party Library Settings] 配下) | alibabacloud_credentials、pyodps、oss2、イメージにプリインストールされている場合はスキップします |
| [Service Configuration] | JSON に "options": { "enable_ram_role": true } を追加します |
[デプロイ] をクリックすると、サービスが実行され、サービスログで出力を確認できます。
トラブルシューティング
ロールが見つからない
現象: エラーコード Forbidden.PrivilegeDenied と共に Permission Denied エラーが発生します。認可アクションは ram:PassRole で、権限チェックの結果は権限不足を示しています。
RAM コンソールでロールが存在するかどうかを確認してください。
-
ロールが存在しない: 存在するロール名を参照するようにサービス設定を更新します。
-
ロールは存在するがエラーが続く: サービスをデプロイしている RAM ユーザーに
ram:PassRole権限がありません。プライマリアカウントに以下のポリシーをアタッチするよう依頼してください (${RoleName}はロール名に置き換えます)。詳細については、「RAM ユーザーへの権限の付与」をご参照ください。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram::*:role/${RoleName}" } ] }
ロールの引き受けに失敗
現象: [Elastic Algorithm Service] ページの [デプロイイベント] タブに、次の内容が表示されます。
unable to render, error: failed to assume role for user, reason: You are not authorized to do this action. You should be authorized by RAM.
RAM ロールの信頼ポリシーに、信頼されたプリンシパルとして eas.pai.aliyuncs.com が含まれていません。これを修正するには、次の手順を実行します。
-
RAM 管理者としてRAM コンソールにログインします。
-
左側のナビゲーションペインで、[アイデンティティ] > [ロール] を選択します。
-
対象の RAM ロールの名前をクリックします。
-
[信頼ポリシー] タブで、[信頼ポリシーの編集] をクリックします。
-
Service配列に"eas.pai.aliyuncs.com"を追加し、[OK] をクリックします。
変更前:
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"RAM": ["acs:ram::aaa:root"],
"Service": ["xxx.aliyuncs.com"]
}
}
],
"Version": "1"
}
変更後:
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"RAM": ["acs:ram::aaa:root"],
"Service": [
"xxx.aliyuncs.com",
"eas.pai.aliyuncs.com"
]
}
}
],
"Version": "1"
}