Pourquoi ne puis-je pas utiliser un rôle IAM pour le compte de service dans mon pod Amazon EKS ?

Date de la dernière mise à jour : 05/10/2021

J'essaie d'utiliser un rôle AWS Identity and Access Management (IAM) pour un compte de service. Mais mon pod Amazon Elastic Kubernetes Service (Amazon EKS) ne parvient pas à assumer le rôle IAM attribué. Je reçois une erreur d'autorisation. Ou bien, mon pod tente d'utiliser le rôle IAM par défaut attribué au nœud Amazon EKS au lieu du rôle IAM attribué à mon pod.

Brève description

Pour résoudre les problèmes à l'aide de la fonction des rôles IAM pour les comptes de service, procédez comme suit :

  • Vérifiez que vous disposez d'un fournisseur d'identité IAM OpenID Connect (OIDC) pour votre cluster Amazon EKS
  • Validez vos politiques de rôle IAM et la configuration de votre politique d'approbation
  • Confirmez que votre compte de service existe et possède une annotation correctement formatée pour l'ARN du rôle IAM
  • Utilisez un pod de test pour vérifier que le compte de service fonctionne

Remarque : si vous recevez des messages d'erreurs lors de l'exécution de commandes depuis l'AWS Command Line Interface (AWS CLI), vérifiez que vous utilisez la version la plus récente d'AWS CLI.

Résolution

Vérifiez que vous disposez d'un fournisseur d'identité IAM OIDC pour votre cluster Amazon EKS

Créez un fournisseur IAM OIDC pour votre cluster, si vous n'en avez pas déjà un. Vous devez disposer d'un fournisseur d'identité OIDC pour votre cluster afin d'utiliser un rôle IAM pour votre compte de service.

Vérifiez ensuite que le fournisseur d'identité OIDC est correctement configuré :

1.    Ouvrez la console IAM, puis choisissez Identity providers (Fournisseurs d'identité) dans le panneau de navigation.

2.    Dans la colonne Fournisseur, identifiez et notez l'URL du fournisseur OIDC.

3.    Dans un onglet ou une fenêtre séparé(e), ouvrez la console Amazon EKS, puis choisissez Clusters dans le panneau de navigation.

4.    Choisissez votre cluster, puis choisissez l'onglet Configuration.

5.    Dans la section Détails, notez la valeur de la propriété URL du fournisseur OpenID Connect.

6.    Vérifiez que l'URL du fournisseur OIDC de la console Amazon EKS (étape 5) correspond à l'URL du fournisseur OIDC de la console IAM (étape 2).

Si l'URL du fournisseur OIDC de votre cluster Amazon EKS ne correspond à aucune des URL du fournisseur OIDC de la console IAM, vous devez créer un nouveau fournisseur OIDC IAM.

Validez vos politiques de rôle IAM et la configuration de votre politique d'approbation

Il se peut que votre rôle IAM ne dispose pas de la plage complète d'autorisations que vous pensez être attribuées à ce rôle. La politique de relation d'approbation de votre rôle IAM pourrait également comporter des erreurs de syntaxe, si vous avez créé votre rôle IAM à l'aide de la Console de gestion AWS ou de l'AWS CLI.

Pour valider vos politiques de rôle IAM et vérifier l'absence d'erreurs de syntaxe dans votre politique d'approbation, procédez comme suit :

1.    Ouvrez la console IAM.

2.    Dans le panneau de navigation, choisissez Roles (Rôles), puis choisissez votre rôle.

3.    Choisissez l'onglet Permissions (Autorisations) sur la page de votre rôle, puis vérifiez que toutes les autorisations requises sont attribuées au rôle.

4.    Choisissez l'onglet Trust Relationships (Relations d'approbation), puis cliquez sur Edit trust relationship (Modifier la relation d'approbation).

5.    Dans le document de politique de votre relation d'approbation, vérifiez que le format de votre politique correspond au format de la politique JSON suivante :

  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::your-account-id:oidc-provider/oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:sub": "system:serviceaccount:your-namespace:your-service-account"
        }
      }
    }
  ]
}

Dans la politique JSON précédente, vérifiez le format de la ligne de propriété Federated et de la ligne de propriété StringEquals. Dans la ligne Federated, confirmez que votre code de région AWS (your-region-code), votre ID de compte (your-account-id) et votre identifiant OIDC unique (EXAMPLE_OIDC_IDENTIFIER) sont formatés correctement. Dans la ligne StringEquals, confirmez que votre code de région (your-region-code), l'identifiant unique OIDC (EXAMPLE_OIDC_IDENTIFIER), l'espace de noms Kubernetes (your-namespace) et le nom du compte de service Kubernetes (your-namespace) sont formatés correctement.

6.    Si vous modifiez votre document de politique pour corriger les erreurs de formatage, sélectionnez Update Trust Policy (Mettre à jour la politique d'approbation).

Confirmez que votre compte de service existe et possède une annotation correctement formatée pour l'ARN du rôle IAM

1.    Confirmez que votre compte de service Kubernetes existe :

$ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml

Remarque : remplacez YOUR_ACCOUNT_NAME par votre nom de compte. Remplacez YOUR_NAMESPACE par votre espace de noms.

Si la commande précédente ne renvoie pas de nom de compte de service, créez un compte de service (sur le site Web de Kubernetes).

2.    Confirmez que votre compte de service a le nom que vous attendez et que son annotation role-arn est correctement formatée. Par exemple :

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/my-example-iam-role
  name: my-example-serviceaccount
  namespace: my-test-namespace

Utilisez un pod de test pour vérifier que le compte de service fonctionne

Vous pouvez vérifier si le compte de service fonctionne correctement en exécutant un pod de test. Vérifiez ensuite si le pod peut monter les variables d'environnement correctement et peut assumer le rôle IAM spécifié.

Remarque : vous pouvez rencontrer un problème lié aux informations d'identification de votre application même si la fonction des rôles IAM pour les comptes de service fonctionne correctement. Vous pouvez également rencontrer ce problème si votre pod possède les variables d'environnement correctes. Pour éviter ce problème, vous pouvez utiliser une image de conteneur AWS CLI pour la vérification.

1.    Créez un fichier YAML local appelé awscli-pod.yaml. Par exemple :

apiVersion: v1
kind: Pod
metadata:
  name: awscli
  labels:
    app: awscli
spec:
  serviceAccountName: YOUR_SERVICE_ACCOUNT
  containers:
  - image: amazon/aws-cli
    command:
      - "sleep"
      - "604800"
    imagePullPolicy: IfNotPresent
    name: awscli
  restartPolicy: Always

Remarque : remplacez YOUR_SERVICE_ACCOUNT par votre nom de compte de service Kubernetes.

2.    Créez le pod de test (à partir du fichier YAML) dans votre espace de noms :

$ kubectl apply -f ./awscli-pod.yaml -n YOUR_NAMESPACE

Remarque : remplacez YOUR_NAMESPACE par votre espace de noms.

3.    Confirmez que le pod awscli possède les variables d'environnement correctes :

$ kubectl exec -n YOUR_NAMESPACE awscli env | grep AWS

Sortie :

AWS_ROLE_ARN=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token

4.    Confirmez que le pod de test utilise le rôle IAM correct :

$ kubectl exec -it awscli -n YOUR_NAMESPACE -- aws sts get-caller-identity

Sortie :

{
    "UserId": "REDACTEDY471234567890:botocore-session-1632772568",
    "Account": "012345678912",
    "Arn": "arn:aws:sts::012345678912:assumed-role/your-iam-role/botocore-session-1632772568"
}

Notez la valeur Arn, y compris le nom du rôle IAM (your-iam-role), que vous recevez dans la sortie de la commande de l'étape 4.

5.    Supprimez le pod awscli après avoir vérifié le rôle IAM :

$ kubectl delete -f ./awscli-pod.yaml -n YOUR_NAMESPACE

Si le pod awscli affiche le rôle IAM correct, alors la fonction des rôles IAM pour les comptes de service fonctionne correctement.

Les étapes précédentes confirment que le jeton IAM est correctement monté au pod. Si votre application ne peut toujours pas utiliser correctement le fichier de jeton, il y a probablement un problème au niveau de l'application ou du SDK. Ce problème est probablement lié à la façon dont l'application intègre les informations d'identification AWS. Pour plus d'informations, consultez Utilisation de la chaîne de fournisseurs d'informations d'identification par défaut et Informations d'identification, sur le site Web de Boto3.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?