Sta*_*nko 6 python amazon-web-services boto3 amazon-eks
当前设置:python 应用程序作为 AWS EKS 集群中的 Docker 容器运行。AWS 密钥作为 kubernetes 集群中的机密提供,以便 python 代码可以读取、初始化 boto3 会话并使用 S3 存储桶。
我想如何更改它:承担 Docker 容器在 AWS EKS 集群中运行的服务帐户的角色,然后使用此凭证初始化 boto3 会话并使用 S3 存储桶。我不想为每项服务提供 AWS 密钥,因为我有很多密钥。
有什么方法可以实现所需的配置吗?
谢谢。
这是通过 AWS 所谓的 IRSA(serviceaccount 的 IAM 角色)来完成的
简化的 Kubernetes 版本 1.12 OIDC JSON Web 令牌,Amazon EKS 现在为每个集群托管一个公共 OIDC 发现终端节点,其中包含 JSON Web 令牌的签名密钥,因此外部系统(例如 IAM)可以验证和接受 Kubernetes 颁发的 OIDC 令牌。
AWS 指南位于: https: //kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
github 上的 AWS 指南:https ://github.com/aws/amazon-eks-pod-identity-webhook/
步骤如下所述
获取 OIDC 提供商 URL:aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text
创建具有联合身份的角色并获取角色的 ARN
{
  "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"
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)
请记住,您需要在此处提及 NAMESPACE,确保您拥有名为 SERVICE_ACCOUNT_NAMESPACE 的命名空间。
apiVersion: v1
kind: ServiceAccount
metadata:
  name: SERVICE_ACCOUNT_NAME
  annotations:
    eks.amazonaws.com/role-arn: ARN_OF_ABOVE_IAM_ROLE
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: SERVICE_ACCOUNT_NAME
  ...
Run Code Online (Sandbox Code Playgroud)
如果一切顺利,您将能够在 k8s pod 中承担该角色。尝试在 docker 容器中运行任何 python 脚本,例如,
import boto3
client = boto3.client('iam') 
response = client.list_users()
for x in response['Users']:
print (x['UserName']) 
Run Code Online (Sandbox Code Playgroud)
授予 IAM 权限后,这将列出 AWS 账户中的用户。
参考:
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           6440 次  |  
        
|   最近记录:  |