Associez un rôle RAM à votre service EAS afin que le code exécuté au sein du service puisse appeler d'autres API Alibaba Cloud sans stocker de clés AccessKey à long terme. Lors de l'exécution, l'instance de service récupère automatiquement des identifiants STS temporaires et les actualise avant leur expiration.
Avantages
L'utilisation d'un rôle RAM plutôt que de clés AccessKey codées en dur vous offre deux avantages majeurs :
Sécurité : Les identifiants sont éphémères et ne sont jamais stockés dans l'image ou la configuration de votre service. Aucune clé à long terme ne risque d'être divulguée.
Contrôle granulaire : Mettez à jour la politique d'autorisation du rôle RAM à tout moment pour modifier les ressources accessibles par le service, sans avoir besoin de redéployer.
Limites
Chaque service EAS ne peut être associé qu'à un seul rôle RAM.
Choisir un type de rôle
| Default Roles of PAI | Custom Roles | |
|---|---|---|
| Description | Le rôle de service intégré AliyunServiceRoleForPaiEas, disponible automatiquement |
Un rôle RAM que vous créez et configurez |
| Autorisations | MaxCompute et OSS uniquement | Tout service Alibaba Cloud que vous autorisez |
| Cas d'utilisation | Accès au bucket OSS par défaut de l'espace de travail ou aux projets MaxCompute pour lesquels le propriétaire du service dispose d'autorisations d'exécution | Tout autre scénario, ou lorsque vous avez besoin d'un contrôle plus fin des autorisations |
| Effort de configuration | Ajoutez un champ JSON à la configuration du service | Créez un rôle, accordez des politiques, puis ajoutez l'ARN du rôle à la configuration du service |
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un service EAS dans PAI, ou un déploiement prêt à être configuré
(Pour les rôles personnalisés) Un accès à la console RAM pour créer et gérer des rôles
(Pour les utilisateurs RAM) Contactez le compte principal pour accorder l'autorisation
ram:PassRole— consultez la section Accorder l'autorisation PassRole à un utilisateur RAM
Associer le rôle par défaut PAI
Ajoutez le champ suivant au JSON dans la section Service Configuration lors du déploiement :
"options": {
"enable_ram_role": true
}
Une fois cette option activée, l'instance de service peut accéder :
Aux données des projets MaxCompute pour lesquels le propriétaire du service EAS dispose d'autorisations d'exécution, via le SDK PyODPS
Aux données du bucket OSS par défaut prédéfini dans l'espace de travail actuel, via le SDK OSS
Si vous effectuez un déploiement via un JSON direct et souhaitez utiliser le SDK OSS via le rôle par défaut PAI, incluez le champ metadata.workspace_id dans la configuration du service.
Associer un rôle RAM personnalisé
Étape 1 : Créer un rôle RAM
Connectez-vous à la console RAM et créez un rôle RAM.
-
Définissez les paramètres suivants :
Paramètre Valeur Principal Type Cloud Service Principal Name Platform for AI/PAI ( eas.pai.aliyuncs.com) -
Dans l'onglet Trust Policy du nouveau rôle, vérifiez que
eas.pai.aliyuncs.comapparaît dans le tableau principalService. Cette politique de confiance détermine quels services peuvent assumer le rôle. Une politique de confiance correctement configurée se présente comme suit :ImportantL'absence de cette entrée est la cause la plus fréquente de l'erreur de déploiement
failed to assume role. Si le rôle a été créé avec un principal différent (par exemple, un autre service), cliquez sur Edit Trust Policy et ajoutez"eas.pai.aliyuncs.com"au tableauService.{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "eas.pai.aliyuncs.com" ] } } ], "Version": "1" }
Étape 2 : Accorder des autorisations au rôle
Joignez des politiques système ou personnalisées pour permettre au rôle d'accéder aux ressources requises par votre service. Par exemple, joignez la politique AliyunOSSReadOnlyAccess pour autoriser l'accès en lecture à OSS.
Si le service monte des sources de données (NAS ou OSS) ou extrait des images personnalisées lors du déploiement, accordez au rôle les autorisations correspondantes :
Sources de données : Contrôle d'accès NAS ou Contrôle d'accès OSS
Images de conteneur : Container Registry
Étape 3 : Associer le rôle lors du déploiement
Ajoutez les éléments suivants au JSON dans la section Service Configuration . Remplacez role_arn par l'ARN du rôle que vous avez créé. Pour trouver l'ARN, consultez la section Afficher le rôle RAM.
"options": {
"enable_ram_role": true
},
"role_arn": "acs:ram::111*************:role/${RoleName}"
Accorder l'autorisation PassRole à un utilisateur RAM
Si vous déployez des services EAS en tant qu'utilisateur RAM (sous-compte), le compte principal doit vous accorder l'autorisation ram:PassRole . Sans celle-ci, le déploiement échoue avec une erreur de configuration de rôle.
Demandez au compte principal de joindre la politique personnalisée suivante à votre utilisateur RAM. Remplacez ${RoleName} par le nom du rôle RAM associé au service EAS. Pour obtenir de l'aide, consultez les sections Créer une politique d'autorisation personnalisée et Accorder des autorisations à un utilisateur RAM.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram::*:role/${RoleName}"
}
]
}
Obtenir des identifiants d'accès temporaires
Après avoir associé un rôle, l'instance de service peut récupérer des identifiants temporaires STS de trois manières. Ces trois méthodes renvoient les mêmes champs d'identifiants.
Méthode 1 : Outil Credentials
L'outil Credentials lit les identifiants depuis un endpoint local injecté automatiquement dans l'instance de service. Les identifiants sont mis à jour périodiquement ; votre code n'a pas besoin de gérer leur rotation.
Lors du déploiement, installez alibabacloud_credentials dans la section Third-party Library Configuration (ignorez cette étape si elle est déjà présente dans votre image).
Utilisez ensuite le code suivant pour initialiser un client authentifié :
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)
Pour des exemples dans d'autres langages, consultez la section Bonnes pratiques pour l'accès aux API OpenAPI Alibaba Cloud à l'aide d'identifiants d'accès.
Méthode 2 : Appeler l'endpoint local des identifiants
Au sein de l'instance de service, appelez le serveur local injecté automatiquement pour obtenir les identifiants actuels :
# Retrieve temporary credentials for the instance RAM role
curl $ALIBABA_CLOUD_CREDENTIALS_URI
Exemple de réponse :
{
"Code": "Success",
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******",
"Expiration": "2024-05-21T10:39:29Z"
}
| Champ | Description |
|---|---|
SecurityToken |
Le jeton temporaire pour le rôle RAM |
Expiration |
Date d'expiration des identifiants (UTC) |
Méthode 3 : Lire le fichier d'identifiants
PAI-EAS écrit automatiquement les identifiants dans /etc/ram/credentials au sein de l'instance de service et actualise périodiquement le fichier. Lisez ce fichier directement lorsqu'un appel HTTP local n'est pas pratique :
{
"Code": "Success",
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******",
"Expiration": "2024-05-21T10:39:29Z"
}
Exemples
Les exemples suivants montrent comment accéder à OSS et MaxCompute depuis un service EAS en utilisant le rôle RAM. Les deux exemples utilisent providers.DefaultCredentialsProvider(), qui récupère automatiquement les identifiants depuis l'endpoint local injecté.
Les exemples utilisent la page Custom Deployment dans la console PAI. Pour une description complète des paramètres, consultez la section Description des paramètres de déploiement personnalisé via la console.
Fonctionnement des exemples : Montez un script Python sur l'instance de service via Model Configuration , puis définissez la commande d'exécution pour l'exécuter. Cela évite de construire une image personnalisée.
Exemple 1 : Accéder aux données 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)
Remplacez les espaces réservés :
| Espace réservé | Description |
|---|---|
<oss_bucket> |
Nom de votre bucket OSS. Doit correspondre au bucket OSS par défaut prédéfini dans l'espace de travail actuel. |
<oss_endpoint> |
L'endpoint de la région de votre bucket. EAS ne se connecte pas à Internet public par défaut, utilisez donc l'endpoint interne (par exemple, oss-cn-hangzhou-internal.aliyuncs.com). Pour utiliser un endpoint public, configurez un VPC avec accès Internet pour EAS. Consultez la section Configuration réseau. |
Exemple 2 : Accéder à 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)
Remplacez les espaces réservés :
| Espace réservé | Description |
|---|---|
<odps_project> |
Nom de votre projet MaxCompute. Retrouvez-le dans la console MaxCompute sous Workspace > Project Management . Si vous déployez en tant qu'utilisateur RAM, assurez-vous que l'utilisateur dispose des autorisations d'opération pour le projet. Consultez la section Autoriser d'autres utilisateurs. |
<odps_endpoint> |
L'endpoint de la région de votre projet. EAS ne se connecte pas à Internet public par défaut, utilisez donc l'endpoint interne (par exemple, https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api). Pour utiliser un endpoint public, configurez un VPC avec accès Internet pour EAS. Consultez la section Configuration réseau. |
Déployer les exemples
Sur la page Déploiement personnalisé , configurez les paramètres suivants :
| Paramètre | Valeur |
|---|---|
| Run Command (sous Environment Information) | python /mnt/data/xx.py |
| Model Configuration | Montez le répertoire contenant votre script et définissez le chemin de montage sur /mnt/data/ |
| Third-party Library List (sous Third-party Library Configuration) | alibabacloud_credentials , pyodps , oss2 — ignorez si préinstallé dans votre image |
| Service Configuration | Ajoutez "options": { "enable_ram_role": true } au JSON |
Après avoir cliqué sur Deploy , affichez la sortie dans les journaux du service une fois celui-ci en cours d'exécution.
Dépannage
Rôle introuvable
Symptôme : Vous rencontrez une erreur Permission Denied avec le code d'erreur Forbidden.PrivilegeDenied . L'action d'autorisation est ram:PassRole , et le résultat de la vérification des autorisations indique des permissions insuffisantes.
Vérifiez dans la console RAM si le rôle existe.
Le rôle n'existe pas : Mettez à jour la configuration du service pour référencer un nom de rôle existant.
-
Le rôle existe mais l'erreur persiste : L'utilisateur RAM qui déploie le service ne dispose pas de l'autorisation
ram:PassRole. Demandez au compte principal de joindre la politique suivante (remplacez${RoleName}par le nom du rôle). Consultez la section Accorder des autorisations à un utilisateur RAM.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram::*:role/${RoleName}" } ] }
Échec de l'assumption du rôle
Symptôme : L'onglet Deployment Events de la page Elastic Algorithm Service affiche :
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.
La politique de confiance du rôle RAM n'inclut pas eas.pai.aliyuncs.com en tant que principal de confiance. Pour résoudre ce problème :
Connectez-vous à la console RAM en tant qu'administrateur RAM.
Dans le volet de navigation de gauche, choisissez Identities > Roles .
Cliquez sur le nom du rôle RAM cible.
Dans l'onglet Trust Policy , cliquez sur Edit Trust Policy .
Dans le tableau
Service, ajoutez"eas.pai.aliyuncs.com"et cliquez sur OK .
Avant :
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"RAM": ["acs:ram::aaa:root"],
"Service": ["xxx.aliyuncs.com"]
}
}
],
"Version": "1"
}
Après :
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"RAM": ["acs:ram::aaa:root"],
"Service": [
"xxx.aliyuncs.com",
"eas.pai.aliyuncs.com"
]
}
}
],
"Version": "1"
}