Configuración actual: la aplicación python se ejecuta como un contenedor Docker en el clúster de AWS EKS. Las claves de AWS se proporcionan como secretos en el clúster de kubernetes para que el código de python pueda leer, inicializar la sesión de boto3 y trabajar con el depósito de S3.
Cómo me gustaría cambiarlo: asumir el rol de una cuenta de servicio bajo la cual se ejecuta el contenedor Docker en el clúster de AWS EKS y luego inicializar la sesión boto3 con estas credenciales y trabajar con el depósito S3. No quiero proporcionar claves de AWS en cada servicio, ya que tengo muchos de ellos.
¿Hay alguna forma de implementar la configuración deseada?
Gracias.
Token web simplificado de Kubernetes versión 1.12 OIDC JSON, Amazon EKS ahora aloja un punto de enlace de descubrimiento OIDC público por clúster que contiene las claves de firma para los tokens web JSON para que los sistemas externos, como IAM, puedan validar y aceptar los tokens OIDC emitidos por Kubernetes.
La guía de AWS para esto se encuentra en: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
Guía de AWS en github: https://github.com/aws/amazon-eks-pod-identity-webhook/
Los pasos se mencionan a continuación
Obtenga la URL del proveedor de OIDC: aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text
Cree el rol con identidad federada y obtenga el ARN para el rol
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::AWS_ACCOUNT_ID:oidc-provider/OIDC_PROVIDER" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "OIDC_PROVIDER:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME" } } } ] }Tenga en cuenta que debe mencionar NAMESPACE aquí, asegúrese de tener un espacio de nombres con el nombre SERVICE_ACCOUNT_NAMESPACE.
apiVersion: v1 kind: ServiceAccount metadata: name: SERVICE_ACCOUNT_NAME annotations: eks.amazonaws.com/role-arn: ARN_OF_ABOVE_IAM_ROLE apiVersion: v1 kind: Pod metadata: name: my-pod spec: serviceAccountName: SERVICE_ACCOUNT_NAME ...Si todo se hace correctamente, podrá asumir el rol en su pod k8s. Intente ejecutar cualquier secuencia de comandos de python en el contenedor docker como,
import boto3 client = boto3.client('iam') response = client.list_users() for x in response['Users']: print (x['UserName'])Con el permiso para IAM, esto listaría a los usuarios en la cuenta de AWS.
Referencia: