当前位置: 首页 > 知识库问答 >
问题:

从AWS EKS中的服务帐户担任AWS角色

闻人德庸
2023-03-14

当前设置:python应用程序在AWS EKS集群中作为Docker容器运行。AWS密钥在kubernetes集群中作为机密提供,以便python代码可以读取、初始化boto3会话并使用S3 bucket。

我想如何更改它:假设Docker容器在AWS EKS集群中运行的serviceaccount角色,然后使用此凭据初始化boto3会话并使用S3 bucket。我不想为每个服务提供AWS密钥,因为我有很多密钥。

有没有办法实现所需的配置?

谢谢你。

共有1个答案

颜永怡
2023-03-14

简化的Kubernetes版本1.12 OIDC JSON web令牌,Amazon EKS现在为每个集群托管一个公共OIDC发现endpoint,其中包含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描述-集群--namecluster_name--Query"cluster.identity.oidc.issuer"--输出文本

    创建具有联合标识的角色并获取角色的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"
            }
          }
        }
      ]
    }
    

    请记住,您需要在这里提到名称空间,确保您有名称为SERVICE\u ACCOUNT\u 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
      ...
    

    如果一切都做得好,你将能够在你的k8s吊舱中扮演这个角色

    参考:

    • https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html
    • https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
    • https://github.com/aws/amazon-eks-pod-identity-webhook/

  •  类似资料:
    • 我开发了以下代码,用于自动执行我的一些实例的启动/停止任务,这些实例不需要一直运行,而是在特定范围内运行。 这是我的代码:https://github.com/maartinpii/gcp-shst 我按照谷歌云平台指南(参考:https://cloud.google.com/iam/docs/understanding-service-accounts https://cloud.google.

    • 我在AWS云服务中设置了一个项目。在那里我使用了EC2实例、AMI、弹性IP、互联网门路、NACL、路由表、安全组、自定义VPC、私有和公共子网、弹性负载平衡、自动伸缩、启动配置、KMS-key、Lambda、RDS Aurora实例、S3桶、简单电子邮件服务、简单队列服务、简单通知服务、云观察日志。现在我的客户要求将所有服务从现有的AWS帐户迁移到新的AWS帐户。

    • 获取错误 引起原因:org.springframework.beans.BeanInstantiationExc0019:未能实例化[software.amazon.awssdk.services.dynamodb.DynamoDbClient]:工厂方法'amazonDynamoDB'抛出异常;嵌套异常java.lang.NullPointerExc0019: STS客户端不得为空。atspri

    • 问题内容: 我有两个AWS账户-假设A和B. 在帐户B中,我定义了一个角色,该角色允许从帐户A中访问另一个角​​色。我们称其为角色B 在帐户A中,我定义了一个角色,该角色允许root用户承担角色。让我们称之为角色A 角色A附加了以下策略 作为帐户A的用户,我担任角色A。现在使用此临时凭据,我想承担角色B并访问帐户B拥有的资源。我有以下代码 该代码适用于我从客户端获得的一组角色,但不适用于我在我有权

    • 我目前正在使用KubernetesPodoperator在库伯内特斯集群上运行Pod。我收到以下错误: 库伯内特斯。客户RestApiException:(403)原因:禁止 HTTP响应标头:HTTPHeaderDict({'Auding-Id': '', 'Cache-Control':'no-cache, Private','Content-Type':'Application/json',

    • 我有两个AWS帐户(A和B)。在我的帐户A上,我有一个lambda功能,需要访问帐户B的资源。确切地说,我的帐户A上的lambda需要更新我帐户B上托管的Route53区域中的记录。 与S3相反,我在Route53中没有看到任何资源访问策略。所以我有点迷路了。我试图扮演IAM的跨账户角色,但这似乎对lambda不起作用。 如何允许帐户a上的lambda函数访问我的帐户B的资源?