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 AWS Identity and Access Management (IAM) pour un compte de service. Mon pod Amazon Elastic Kubernetes Service (Amazon EKS) ne parvient pas à assumer le rôle IAM attribué avec une erreur d’autorisation. Ou bien, mon espace essaie d’utiliser le rôle IAM par défaut attribué au nœud Amazon EKS au lieu du rôle IAM attribué à mon espace.

Résolution

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

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 que votre cluster puisse 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. Dans le volet de navigation, choisissez Fournisseurs d'identité.
  2. Dans la colonne Fournisseur, identifiez et notez l’URL du fournisseur OIDC.
  3. Dans un onglet ou une fenêtre distinct, ouvrez la console Amazon EKS. Choisissez ensuite Clusters dans le volet de navigation.
  4. Choisissez votre cluster, puis cliquez sur 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 de confiance

Votre rôle IAM ne dispose peut-être pas de toutes les autorisations nécessaires. La politique de relation de confiance 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 de confiance, procédez comme suit :

  1. Ouvrez la console IAM.
  2. Dans le volet de navigation, choisissez Rôles, puis choisissez votre rôle.
  3. Choisissez l’onglet Autorisations sur la page de votre rôle, puis vérifiez que toutes les autorisations requises sont attribuées au rôle.
  4. Cliquez sur l’onglet Relations de confiance, puis choisissez Modifier la relation de confiance.
  5. Dans le document de stratégie relatif à votre relation de confiance, vérifiez que le format de votre stratégie 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. Sur la ligne Fédérée, vérifiez que votre code de région AWS (your-region-code), votre identifiant de compte (your-account-id) et votre identifiant OIDC unique (EXAMPLE_OIDC_IDENTIFIER) sont correctement formatés. Dans la ligne StringEquals, vérifiez que votre code de région (your-region-code), votre identifiant unique OIDC (EXAMPLE_OIDC_IDENTIFIER), votre espace de noms Kubernetes (your-namespace) et le nom de compte de service Kubernetes (your-namespace) sont correctement formatés.
  6. Si vous modifiez votre document de politique pour corriger des erreurs de mise en forme, choisissez Mettre à jour la politique de confiance.

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

  1. Vérifiez que votre compte de service Kubernetes existe :

    $ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml

    Remarque : remplacez YOUR_ACCOUNT_NAME par le nom de votre 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-en un. Pour plus d’informations, consultez la section Utiliser plusieurs ServiceAccount sur le site Web de Kubernetes.

  2. Vérifiez que votre compte de service porte le nom que vous attendez. Vérifiez également 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 module de test pour vérifier que le compte de service fonctionne

Exécutez un module de test pour vérifier que le compte de service fonctionne correctement. Vérifiez ensuite si le pod peut monter correctement les variables d’environnement et assumer le rôle IAM spécifié.

  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 le nom de votre 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. Vérifiez que le pod awscli possède les bonnes variables d’environnement :

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

    Les résultats se présentent de la manière suivante :

    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. Vérifiez que le rôle IAM du module de test est correct :

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

    Les résultats se présentent de la manière suivante :

    {
        "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 que vous recevez dans cette sortie.

  5. Après avoir vérifié le rôle IAM, supprimez le pod awscli :

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

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

Les étapes précédentes confirment que le jeton IAM est correctement monté sur le pod. Si votre application ne parvient toujours pas à utiliser correctement le fichier de jeton, il se peut qu’il y ait un problème au niveau de l’application ou du SDK. Ce problème peut être lié à la façon dont l’application ingère les informations d’identification AWS ou au fait que la version du SDK n’est pas prise en charge. Pour plus d’informations, consultez les sections Utilisation de la chaîne de fournisseurs d’informations d’identification par défaut, Informations d’identification sur le site Web de Boto3 et Utilisation d'un SDK AWS pris en charge.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 8 mois