RAM ロールを Elastic Algorithm Service (EAS) サービスにアタッチすることで、サービス内で実行されるコードが、長期的な AccessKey を保存することなく、他の Alibaba Cloud API を呼び出せるようになります。ランタイム時、サービスインスタンスは短期間有効な STS 認証情報を自動的に取得し、有効期限が切れる前に更新します。
メリット
ハードコーディングされた AccessKey の代わりに RAM ロールを使用すると、次の 2 つのメリットがあります。
-
セキュリティ:認証情報は短期間のみ有効で、サービスイメージや構成に保存されることはありません。漏洩する可能性のある長期的なキーは存在しません。
-
きめ細かな制御:RAM ロールの権限ポリシーはいつでも更新でき、サービスを再デプロイすることなく、サービスがアクセスできる内容を変更できます。
制限事項
各 EAS サービスは、1 つの RAM ロールにのみ関連付けることができます。
ロールタイプの選択
| PAI デフォルトロール | カスタムロール | |
|---|---|---|
| 概要 | 組み込みのサービスロール AliyunServiceRoleForPaiEas で、自動的に利用可能です |
ユーザーが作成・設定する RAM ロールです |
| 権限 | MaxCompute と OSS のみ | ユーザーが付与した任意の Alibaba Cloud サービス |
| 利用シーン | サービスオーナーが実行権限を持つワークスペースのデフォルト OSS バケットまたは MaxCompute プロジェクトへのアクセス | その他のすべてのシナリオ、またはより詳細な権限制御が必要な場合 |
| 設定の手間 | サービス構成に JSON フィールドを 1 つ追加 | ロールを作成し、ポリシーを付与してから、ロールの ARN をサービス構成に追加 |
前提条件
開始する前に、以下を確認してください。
-
Platform for AI (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 ロールを作成します。
-
次のパラメーターを設定します。
パラメーター 値 プリンシパルタイプ Cloud Service プリンシパル名 Platform for AI/PAI ( eas.pai.aliyuncs.com) -
新しいロールの [信頼ポリシー] タブで、
Serviceプリンシパル配列にeas.pai.aliyuncs.comが表示されていることを確認します。この信頼ポリシーは、どのサービスがロールを偽装できるかを制御します。正しく設定された信頼ポリシーは以下のとおりです。重要このエントリがないことは、
failed to assume roleデプロイメントエラーの最も一般的な原因です。ロールが別のプリンシパル (たとえば、別のサービスなど) で作成された場合は、[信頼ポリシーの編集] をクリックし、"eas.pai.aliyuncs.com"をService配列に追加します。{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": ["acs:ram::aaa:root"], "Service": ["xxx.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 コンソールの [ワークスペース] > [プロジェクト管理] で確認できます。 RAM ユーザーとしてデプロイする場合、そのユーザーがプロジェクトの操作権限を持っていることを確認してください。 「他のユーザーへの権限付与」をご参照ください。 |
<odps_endpoint> |
プロジェクトのリージョンに対応するエンドポイント。EAS はデフォルトでパブリックインターネットに接続しないため、内部エンドポイント (例:https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api) を使用してください。パブリックエンドポイントを使用するには、EAS 用に VPC を設定します。詳細については、「ネットワーク設定」をご参照ください。 |
例のデプロイ
カスタムデプロイメントページで、次のパラメーターを設定します。
| パラメーター | 値 |
|---|---|
| [コマンドの実行] ([環境情報] 配下) | python /mnt/data/xx.py |
| モデル設定 | スクリプトを含むディレクトリをマウントし、マウントパスを /mnt/data/ |
| サードパーティライブラリリスト(サードパーティライブラリ設定 の下) | alibabacloud_credentials、pyodps、oss2 — イメージにプリインストール済みの場合はスキップします |
| サービス設定 | 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"
}