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 |
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
Faça logon no RAM console e create a RAM role.
-
Defina os seguintes parâmetros:
Parâmetro
Valor
Principal Type
Cloud Service
Principal Name
Platform for AI/PAI (
eas.pai.aliyuncs.com) -
Na aba Trust Policy da nova função, confirme se
eas.pai.aliyuncs.comaparece no array de principaisService. 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:ImportanteA 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 arrayService.{ "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.
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:
Fontes de dados: NAS access control ou OSS access control
Imagens de contêiner: Container Registry
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 |
|
|
Token temporário da função RAM |
|
|
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 |
|
|
Nome do bucket OSS. Deve ser o default OSS bucket predefinido no workspace atual. |
|
|
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, |
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 |
|
|
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. |
|
|
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, |
Implantar os exemplos
Na página Custom Deployment, configure os seguintes parâmetros:
|
Parâmetro |
Valor |
|
Run Command (em Environment Information) |
|
|
Model Configuration |
Monte o diretório contendo o script e defina o caminho de montagem como |
|
Third-party Library List (em Third-party Library Configuration) |
|
|
Service Configuration |
Adicione |
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:
Faça logon no console RAM como administrador RAM.
No painel de navegação à esquerda, escolha Identities > Roles.
Clique em no nome da função RAM de destino.
Na aba Trust Policy, clique em Edit Trust Policy.
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"
}