You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从GKE集群中的Pod连接到AWS S3私有存储桶

在GKE工作负载中连接AWS S3私有存储桶的实现方案

方案一:使用AWS IAM角色进行跨云身份验证(推荐)

这种方式无需硬编码AWS密钥,通过OIDC联合身份自动获取临时凭证,安全性更高,是生产环境的首选方案。

步骤1:创建AWS IAM角色并配置信任关系

  1. 登录AWS IAM控制台,创建新角色,选择**Web身份或OpenID Connect(OIDC)**作为信任实体类型。
  2. 输入GKE集群的OIDC提供商URL,格式为:
    https://container.googleapis.com/v1/projects/[GCP_PROJECT_ID]/locations/[CLUSTER_LOCATION]/clusters/[CLUSTER_NAME]
    
  3. 设置信任政策,允许指定的GKE服务账号扮演该AWS角色。替换占位符后的示例政策:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::[AWS_ACCOUNT_ID]:oidc-provider/container.googleapis.com/v1/projects/[GCP_PROJECT_ID]/locations/[CLUSTER_LOCATION]/clusters/[CLUSTER_NAME]"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "container.googleapis.com/v1/projects/[GCP_PROJECT_ID]/locations/[CLUSTER_LOCATION]/clusters/[CLUSTER_NAME]:sub": "system:serviceaccount:[GCP_NAMESPACE]:[GKE_SERVICE_ACCOUNT_NAME]"
            }
          }
        }
      ]
    }
    
  4. 给该IAM角色附加S3权限政策,仅授予访问目标私有桶的必要权限。示例政策:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:GetObject",
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::[YOUR_S3_BUCKET_NAME]",
            "arn:aws:s3:::[YOUR_S3_BUCKET_NAME]/*"
          ]
        }
      ]
    }
    

步骤2:配置GKE工作负载使用指定服务账号

在GKE的Deployment或Pod配置中,指定对应上述信任政策的服务账号:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-workload
spec:
  template:
    spec:
      serviceAccountName: [GKE_SERVICE_ACCOUNT_NAME]
      containers:
      - name: your-app
        image: your-app-image:tag

步骤3:在工作负载中访问S3

使用AWS SDK时,会自动通过GKE服务账号的OIDC令牌获取临时AWS凭证,无需手动配置密钥。以Python的boto3为例:

import boto3

# SDK自动处理凭证获取流程
s3_client = boto3.client('s3')
response = s3_client.list_objects_v2(Bucket='[YOUR_S3_BUCKET_NAME]')
print(response['Contents'])

方案二:使用AWS IAM用户密钥(仅临时测试或特殊场景)

这种方式需要存储AWS密钥,存在泄露风险,不推荐长期在生产环境使用。

步骤1:创建AWS IAM用户并生成密钥

  1. 在AWS IAM控制台创建新用户,附加能访问目标S3私有桶的权限政策。
  2. 生成该用户的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,妥善保存这两个值。

步骤2:在GKE中存储密钥为Secret

通过kubectl创建Kubernetes Secret存储AWS密钥:

kubectl create secret generic aws-s3-credentials \
  --from-literal=AWS_ACCESS_KEY_ID=[YOUR_ACCESS_KEY] \
  --from-literal=AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_KEY]

步骤3:在工作负载中挂载Secret

将Secret作为环境变量注入容器,让AWS SDK自动读取:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-workload
spec:
  template:
    spec:
      containers:
      - name: your-app
        image: your-app-image:tag
        env:
        - name: AWS_ACCESS_KEY_ID
          valueFrom:
            secretKeyRef:
              name: aws-s3-credentials
              key: AWS_ACCESS_KEY_ID
        - name: AWS_SECRET_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              name: aws-s3-credentials
              key: AWS_SECRET_ACCESS_KEY

关键注意事项

  • 最小权限原则:无论是IAM角色还是用户,仅授予访问目标S3桶所需的最小操作权限(如仅GetObject而非所有S3权限),降低泄露风险。
  • 网络连通性:确保GKE集群节点能访问AWS S3和STS服务(若GKE集群在私有VPC,需配置Cloud NAT实现互联网访问)。
  • 权限验证:可在工作负载容器内安装AWS CLI,执行aws s3 ls s3://[YOUR_BUCKET_NAME]快速验证访问权限。

内容的提问来源于stack exchange,提问作者Abhinav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:12:44