すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:EAS RAM ロールの設定

最終更新日:Jul 16, 2026

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 ロールの作成

  1. RAM コンソールにログインし、RAM ロールを作成します。

  2. 次のパラメーターを設定します。

    パラメーター
    プリンシパルタイプ Cloud Service
    プリンシパル名 Platform for AI/PAI (eas.pai.aliyuncs.com)
  3. 新しいロールの [信頼ポリシー] タブで、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) をマウントしたり、カスタムイメージをプルしたりする場合は、ロールに対応する権限を付与してください。

ステップ 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_credentialspyodpsoss2 — イメージにプリインストール済みの場合はスキップします
サービス設定 JSON に "options": { "enable_ram_role": true } を追加します

[デプロイ] をクリックしてサービスが実行中になったら、サービスログで出力を確認します。

トラブルシューティング

ロールが見つからない

現象:エラーコード Forbidden.PrivilegeDeniedPermission 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 が含まれていません。これを修正するには、次の手順を実行します。

  1. RAM 管理者として RAM コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] を選択します。

  3. 対象の RAM ロールの名前をクリックします。

  4. [信頼ポリシー] タブで、[信頼ポリシーの編集] をクリックします。

  5. 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"
}