Passer au contenu

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

Lecture de 6 minute(s)
0

J’essaie d’utiliser un rôle Gestion des identités et des accès AWS (AWS IAM) pour un compte AWS de service (IRSA). Cependant, mon pod Amazon Elastic Kubernetes Service (Amazon EKS) ne peut pas endosser le rôle IAM attribué. Ou bien, mon pod utilise le rôle IAM par défaut qui est attribué au nœud Amazon EKS à la place.

Résolution

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'interface.

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

Créez un fournisseur IAM OpenID Connect (OIDC) pour votre cluster, si vous n’en avez pas déjà un. Vous devez disposer d'un fournisseur OIDC pour que votre cluster puisse utiliser un IRSA.

Puis, procédez comme suit pour vérifier que vous avez correctement configuré le fournisseur OIDC :

  1. Ouvrez la console IAM.
  2. Dans le volet de navigation, choisissez Fournisseurs d'identité.
  3. Sous Fournisseur, identifiez et notez l'URL du fournisseur OIDC.
  4. Dans un onglet ou une fenêtre distinct, ouvrez la console Amazon EKS.
  5. Dans le volet de navigation, sélectionnez Clusters.
  6. Sélectionnez votre cluster, puis choisissez l’onglet Configuration.
  7. Sous Détails, vérifiez la valeur de l'URL du fournisseur OpenID Connect. Vérifiez qu'elle correspond à l'URL du fournisseur OIDC dans la console IAM.
  8. Si les URL ne correspondent pas, vous devez créer un nouveau fournisseur IAM OIDC.

Valider vos politiques de rôle IAM et la configuration de votre politique d’approbation

Les problèmes IAM surviennent lorsque votre rôle IAM ne dispose pas de toutes les autorisations requises. La politique de relation d’approbation de votre rôle IAM peut é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’interface de ligne de commande AWS.

Pour valider vos politiques de rôle IAM et vérifier la présence d’erreurs de syntaxe dans votre politique d’approbation, procédez comme suit :

  1. Ouvrez la console IAM.
  2. Dans le volet de navigation, choisissez Rôles, puis sélectionnez votre rôle.
  3. Choisissez l'onglet Autorisations, puis vérifiez que vous avez attribué toutes les autorisations requises pour votre configuration au rôle.
  4. Cliquez sur l’onglet Relations d’approbation, puis sélectionnez Modifier la relation d’approbation.
  5. Dans le document de politique relatif à 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",
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }
    Dans votre politique JSON, vérifiez le format de la ligne de propriété Fédérée et de la ligne de propriété StringEquals. Pour Fédéré, vérifiez que vous avez correctement formaté le code de région AWS, l'ID de compte AWS et l'identifiant OIDC unique. Pour StringEquals, vérifiez que vous avez correctement formaté le code de région, l'identifiant unique d’OIDC, l'espace de noms Kubernetes et le nom du compte de service Kubernetes.
  6. Si vous modifiez votre document de politique pour corriger des erreurs de mise en forme, choisissez Mettre à jour la politique d’approbation.

Vérifier que votre compte de service existe et qu’il inclut une annotation correctement formatée pour l’Amazon Resource Name (ARN) du rôle IAM

Procédez comme suit :

  1. Pour confirmer l'existence de votre compte de service Kubernetes, exécutez la commande suivante :
    kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml
    Remarque : Remplacez YOUR_ACCOUNT_NAME par le nom de votre compte et YOUR_NAMESPACE par votre espace de noms.
    Si la commande précédente ne renvoie pas de nom de compte de service, créez-en un. Pour plus d’informations, consultez la section Utiliser plusieurs comptes de service sur le site Web de Kubernetes.
  2. Vérifier que votre compte de service porte le nom escompté. Vérifiez également que vous avez correctement formaté son annotation role-arn. 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

Vérifier que le compte de service fonctionne à l’aide d’un pod de test

Exécutez un pod de test pour vérifier que le compte de service fonctionne correctement, qu'il peut monter des variables d'environnement et qu'il peut endosser le rôle IAM spécifié. Procédez comme suit :

  1. Créez un fichier YAML local appelé awscli-pod.yaml. 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 le nom de votre compte de service Kubernetes.

  2. Pour créer le pod de test à partir du fichier YAML de votre espace de noms, exécutez la commande suivante :

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

    Remarque : Remplacez YOUR_NAMESPACE par votre espace de noms.

  3. Pour vérifier que le pod awscli comporte les variables d'environnement AWS_ROLE_ARN et AWS_WEB_IDENTITY_TOKEN_FILE, exécutez la commande suivante :

    kubectl exec -n YOUR_NAMESPACE awscli -- env | grep AWS

    Exemple de 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. Pour vérifier que le pod de test utilise le rôle IAM correct, exécutez la commande suivante :

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

    Exemple de sortie :

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

    Notez la valeur de Arn. Assurez-vous que le rôle IAM est celui que vous souhaitez utiliser dans le pod.

  5. Pour supprimer le pod awscli, exécutez la commande suivante :

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

    Remarque : Remplacez YOUR_NAMESPACE par votre espace de noms.

Si le pod awscli affiche le rôle IAM correct, la fonctionnalité des rôles IAM pour les comptes de service fonctionne comme prévu. Les étapes précédentes confirment que vous avez correctement monté le jeton IAM sur le pod. Si votre application ne parvient toujours pas à utiliser correctement le fichier de jeton IAM, il se peut qu’un problème soit survenu au niveau de l’application ou du SDK. Par exemple, des problèmes liés à la façon dont l'application utilise les informations d'identification AWS ou aux versions du SDK non prises en charge peuvent être survenus. Pour plus d'informations, consultez la section Utilisation de la chaîne de fournisseurs d'informations d'identification par défaut et Utilisation de l'IRSA avec le kit de développement logiciel AWS.

AWS OFFICIELA mis à jour il y a 9 mois