Todos os produtos
Search
Central de documentação

Platform For AI:Configurar a função RAM do EAS

Última atualização: Aug 25, 2026

Anexe uma função RAM ao service EAS para permitir que o código executado na instância chame outras APIs da Alibaba Cloud sem armazenar AccessKeys permanentes. Em tempo de execução, a instância de service obtém credenciais STS temporárias automaticamente e as renova antes do vencimento.

Benefícios

O uso de uma função RAM em vez de AccessKeys codificadas oferece duas vantagens principais:

  • Segurança: As credenciais são temporárias e nunca ficam armazenadas na imagem ou na configuração do service, eliminando o risco de vazamento de chaves permanentes.

  • Controle refinado: Atualize a política de permissões da função RAM a qualquer momento para alterar os acessos do service sem precisar reimplantá-lo.

Limitações

Cada service EAS pode ser associado a apenas uma função RAM.

Escolha um tipo de função

Default Roles of PAI

Custom Roles

Definição

Função de service integrada AliyunServiceRoleForPaiEas, disponível automaticamente

Função RAM criada e configurada por você

Permissões

Apenas MaxCompute e OSS

Qualquer service da Alibaba Cloud concedido por você

Cenário recomendado

Acesso ao bucket OSS padrão do workspace ou a projetos MaxCompute nos quais o proprietário do service tem permissões de execução

Demais cenários ou quando é necessário controle de permissões mais granular

Esforço de configuração

Adicionar um campo JSON à configuração do service

Criar uma função, conceder políticas e adicionar o ARN da função à configuração do service

Pré-requisitos

Antes de começar, verifique se você possui:

  • Um service EAS no PAI ou uma implantação pronta para configure

  • (Para funções personalizadas) Acesso ao console RAM para crie e gerencie funções

  • (Para usuários RAM) Contato com a conta primária para conceder a permissão ram:PassRole — consulte Conceder permissão PassRole a um usuário RAM

Anexar a função padrão do PAI

Adicione o seguinte campo ao json na seção Service Configuration durante a implantação:

"options": {
  "enable_ram_role": true
}

Após ativar essa opção, a instância de service poderá acessar:

  • Dados em projetos MaxCompute nos quais o proprietário do service EAS tem permissões de execução, por meio do SDK PyODPS

  • Dados no default OSS bucket predefinido no workspace atual, por meio do SDK OSS

Se você implantar usando json direto e quiser utilizar o SDK OSS por meio da função padrão do PAI, inclua o campo metadata.workspace_id na configuração do service.

Anexar uma função RAM personalizada

Etapa 1: Crie uma função RAM

  1. Faça logon no RAM console e create a RAM role.

  2. Defina os seguintes parâmetros:

    Parâmetro

    Valor

    Principal Type

    Cloud Service

    Principal Name

    Platform for AI/PAI (eas.pai.aliyuncs.com)

  3. Na aba Trust Policy da nova função, confirme se eas.pai.aliyuncs.com aparece no array de principais Service. Essa política de confiança controla quais services podem assumir a função. Uma política de confiança configurada corretamente tem a seguinte aparência:

    Importante

    A ausência dessa entrada é a causa mais comum do erro de implantação failed to assume role. Se a função foi criada com um principal diferente (por exemplo, outro service), clique em Edit Trust Policy e adicione "eas.pai.aliyuncs.com" ao array Service.

    {
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "eas.pai.aliyuncs.com"
            ]
          }
        }
      ],
      "Version": "1"
    }

Etapa 2: Conceder permissões à função

Attach system or custom policies para dar à função acesso aos recursos necessários ao service. Por exemplo, anexe AliyunOSSReadOnlyAccess para permitir acesso de leitura ao OSS.

Importante

Se o service montar fontes de dados (NAS ou OSS) ou baixar imagens personalizadas durante a implantação, conceda à função as permissões correspondentes:

Etapa 3: Associar a função durante a implantação

Adicione o seguinte trecho ao json na seção Service Configuration. Substitua role_arn pelo ARN da função criada. Para localizar o ARN, consulte View the RAM role.

"options": {
  "enable_ram_role": true
},
"role_arn": "acs:ram::111*************:role/${RoleName}"

Conceder permissão PassRole a um usuário RAM

Se você implantar services EAS como usuário RAM (subconta), a conta primária deverá conceder a permissão ram:PassRole. Sem ela, a implantação falha com um erro de configuração de função.

Solicite à conta primária que anexe a seguinte política personalizada ao seu usuário RAM. Substitua ${RoleName} pelo nome da função RAM associada ao service EAS. Para obter ajuda, consulte Create a custom permission policy e Grant permissions to a RAM user.

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ram:PassRole",
      "Resource": "acs:ram::*:role/${RoleName}"
    }
  ]
}

Obter credenciais de acesso temporárias

Após anexar uma função, a instância de service pode obter credenciais temporárias STS de três maneiras. Todos os métodos retornam os mesmos campos de credencial.

Método 1: Ferramenta de credenciais

O Credentials tool lê as credenciais de um endpoint local injetado automaticamente na instância de service. As credenciais são atualizadas periodicamente, eliminando a necessidade de gerencie a rotação no código.

Durante a implantação, instale alibabacloud_credentials na seção Third-party Library Configuration (ignore esta etapa se a biblioteca já estiver na imagem).

Em seguida, use o código abaixo para inicializar um cliente autenticado:

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)

Para exemplos em outras linguagens, consulte Best practices for accessing Alibaba Cloud OpenAPI using access credentials.

Método 2: Chamar o endpoint local de credenciais

Na instância de service, chame o servidor local injetado automaticamente para obter as credenciais atuais:

# Retrieve temporary credentials for the instance RAM role
curl $ALIBABA_CLOUD_CREDENTIALS_URI

Resposta de exemplo:

{
  "Code": "Success",
  "AccessKeyId": "STS.N*********7",
  "AccessKeySecret": "3***************d",
  "SecurityToken": "DFE32G*******",
  "Expiration": "2024-05-21T10:39:29Z"
}

Campo

Descrição

SecurityToken

Token temporário da função RAM

Expiration

Data e hora de expiração das credenciais (UTC)

Método 3: Ler o arquivo de credenciais

O PAI-EAS grava automaticamente as credenciais em /etc/ram/credentials dentro da instância de service e atualiza o arquivo periodicamente. Leia este arquivo diretamente quando uma chamada HTTP local não for conveniente:

{
  "Code": "Success",
  "AccessKeyId": "STS.N*********7",
  "AccessKeySecret": "3***************d",
  "SecurityToken": "DFE32G*******",
  "Expiration": "2024-05-21T10:39:29Z"
}

Exemplos

Os exemplos a seguir demonstram como acessar o OSS e o MaxCompute de dentro de um service EAS usando a função RAM. Ambos utilizam providers.DefaultCredentialsProvider(), que obtém as credenciais do endpoint local injetado automaticamente.

Estes exemplos usam a página Custom Deployment no PAI console. Para descrições completas dos parâmetros, consulte Console custom deployment parameter description.

Funcionamento dos exemplos: Monte um script Python na instância de service via Model Configuration e defina o comando de execução para execute. Isso evita a necessidade de crie uma imagem personalizada.

Exemplo 1: Acessar dados do 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>',   # Internal endpoint, e.g. oss-cn-hangzhou-internal.aliyuncs.com
        '<oss_bucket>'      # Must be the default OSS bucket for the current workspace
    )

    for b in islice(oss2.ObjectIterator(bucket), 10):
        print(b.key)

Substitua os placeholders:

Placeholder

Descrição

<oss_bucket>

Nome do bucket OSS. Deve ser o default OSS bucket predefinido no workspace atual.

<oss_endpoint>

endpoint da região do bucket. O EAS não se conecta à internet pública por padrão; portanto, use o endpoint interno (por exemplo, oss-cn-hangzhou-internal.aliyuncs.com). Para usar um endpoint público, configure uma Virtual Private Cloud (VPC) com acesso à internet para o EAS. Consulte Network configuration.

Exemplo 2: Acessar o 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>',    # Your MaxCompute project name
        endpoint='<odps_endpoint>'   # Internal endpoint, e.g. https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api
    )

    for t in o.list_tables():
        print(t)

Substitua os placeholders:

Placeholder

Descrição

<odps_project>

Nome do projeto MaxCompute. Encontre-o no console MaxCompute em Workspace > Project Management. Se estiver implantando como usuário RAM, certifique-se de que o usuário tenha permissões de operação no projeto. Consulte Authorize other users.

<odps_endpoint>

endpoint da região do projeto. O EAS não se conecta à internet pública por padrão; portanto, use o endpoint interno (por exemplo, https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api). Para usar um endpoint público, configure uma VPC com acesso à internet para o EAS. Consulte Network configuration.

Implantar os exemplos

Na página Custom Deployment, configure os seguintes parâmetros:

Parâmetro

Valor

Run Command (em Environment Information)

python /mnt/data/xx.py

Model Configuration

Monte o diretório contendo o script e defina o caminho de montagem como /mnt/data/

Third-party Library List (em Third-party Library Configuration)

alibabacloud_credentials, pyodps, oss2 — ignore se já estiverem pré-instalados na imagem

Service Configuration

Adicione "options": { "enable_ram_role": true } ao json

Após clique em Deploy, visualize a saída nos logs do service assim que ele estiver em execução.

Solução de problemas

Função não encontrada

Sintoma: Erro Permission Denied com o código Forbidden.PrivilegeDenied. A ação de autorização é ram:PassRole, e o resultado da verificação indica permissões insuficientes.

Verifique no RAM console se a função existe.

  • A função não existe: Atualize a configuração do service para referenciar o nome de uma função existente.

  • A função existe, mas o erro persiste: O usuário RAM que implanta o service não possui a permissão ram:PassRole. Solicite à conta primária que anexe a seguinte política (substitua ${RoleName} pelo nome da função). Consulte Grant permissions to a RAM user.

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "ram:PassRole",
          "Resource": "acs:ram::*:role/${RoleName}"
        }
      ]
    }

Falha ao assumir a função

Sintoma: A aba Deployment Events na página Elastic Algorithm Service exibe:

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.

A política de confiança da função RAM não inclui eas.pai.aliyuncs.com como principal confiável. Para corrigir:

  1. Faça logon no console RAM como administrador RAM.

  2. No painel de navegação à esquerda, escolha Identities > Roles.

  3. Clique em no nome da função RAM de destino.

  4. Na aba Trust Policy, clique em Edit Trust Policy.

  5. No array Service, adicione "eas.pai.aliyuncs.com" e clique em OK.

Antes:

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "RAM": ["acs:ram::aaa:root"],
        "Service": ["xxx.aliyuncs.com"]
      }
    }
  ],
  "Version": "1"
}

Depois:

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "RAM": ["acs:ram::aaa:root"],
        "Service": [
          "xxx.aliyuncs.com",
          "eas.pai.aliyuncs.com"
        ]
      }
    }
  ],
  "Version": "1"
}