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

如何通过Helm Chart或Kubernetes Init Container创建AWS IAM角色与策略

通过Helm Chart或Kubernetes初始化容器创建AWS IAM角色与策略

一、使用Helm Chart实现

方案思路

借助Helm的Job资源,在Chart安装/升级时执行AWS CLI命令,完成IAM策略、角色的创建及关联操作。需要确保执行Job的Pod具备调用AWS IAM API的权限(可通过给Pod绑定IAM角色实现)。

具体步骤

  1. 准备IAM策略文件
    在Helm Chart的files目录下创建策略文件(例如iam-policy.json),定义所需权限:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": ["arn:aws:s3:::my-bucket"]
        }
      ]
    }
    
  2. 编写Helm Job模板
    在templates目录下创建iam-setup-job.yaml,定义执行AWS命令的Job:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: {{ .Release.Name }}-iam-setup
      annotations:
        "helm.sh/hook": post-install,post-upgrade
        "helm.sh/hook-delete-policy": hook-succeeded
    spec:
      template:
        spec:
          serviceAccountName: {{ .Values.aws.serviceAccountName }}
          containers:
          - name: aws-cli
            image: amazon/aws-cli:latest
            command:
            - /bin/sh
            - -c
            - |
              # 创建IAM策略(如果不存在)
              aws iam create-policy --policy-name {{ .Values.iam.policyName }} --policy-document file:///policy/iam-policy.json --region {{ .Values.aws.region }} || true
              # 创建IAM角色(如果不存在)
              aws iam create-role --role-name {{ .Values.iam.roleName }} --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"},"Action":"sts:AssumeRole"}]}' --region {{ .Values.aws.region }} || true
              # 关联策略到角色
              aws iam attach-role-policy --role-name {{ .Values.iam.roleName }} --policy-arn arn:aws:iam::{{ .Values.aws.accountId }}:policy/{{ .Values.iam.policyName }} --region {{ .Values.aws.region }} || true
            volumeMounts:
            - name: policy-volume
              mountPath: /policy
          volumes:
          - name: policy-volume
            configMap:
              name: {{ .Release.Name }}-iam-policy
          restartPolicy: OnFailure
    
  3. 配置ConfigMap挂载策略文件
    在templates目录下创建iam-policy-configmap.yaml,将策略文件转为ConfigMap:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-iam-policy
    data:
      iam-policy.json: |-
        {{ .Files.Get "iam-policy.json" | nindent 4 }}
    
  4. 配置Values参数
    在values.yaml中定义必要参数:

    aws:
      region: us-east-1
      accountId: "123456789012"
      serviceAccountName: aws-iam-sa
    iam:
      policyName: my-s3-list-policy
      roleName: my-ec2-role
    
  5. 安装Chart
    确保目标K8s集群中已存在具备IAM权限的ServiceAccount,然后执行安装命令:

    helm install my-iam-chart ./path/to/chart
    

二、使用Kubernetes初始化容器实现

方案思路

在Deployment的Init Container中运行AWS CLI,在业务容器启动前完成IAM资源的创建。同样需要给Pod绑定具备IAM权限的角色。

具体步骤

  1. 编写Deployment YAML
    定义包含Init Container的Deployment,执行IAM创建命令:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app-with-iam-setup
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          serviceAccountName: aws-iam-sa
          initContainers:
          - name: iam-setup
            image: amazon/aws-cli:latest
            command:
            - /bin/sh
            - -c
            - |
              # 幂等创建策略
              POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='my-s3-list-policy'].Arn" --output text --region us-east-1)
              if [ -z "$POLICY_ARN" ]; then
                aws iam create-policy --policy-name my-s3-list-policy --policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:ListBucket"],"Resource":["arn:aws:s3:::my-bucket"]}]}' --region us-east-1
              fi
              # 幂等创建角色
              ROLE_ARN=$(aws iam list-roles --query "Roles[?RoleName=='my-ec2-role'].Arn" --output text --region us-east-1)
              if [ -z "$ROLE_ARN" ]; then
                aws iam create-role --role-name my-ec2-role --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"},"Action":"sts:AssumeRole"}]}' --region us-east-1
              fi
              # 关联策略(避免重复绑定)
              POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='my-s3-list-policy'].Arn" --output text --region us-east-1)
              aws iam attach-role-policy --role-name my-ec2-role --policy-arn $POLICY_ARN --region us-east-1 || true
          containers:
          - name: my-app
            image: nginx:latest
            ports:
            - containerPort: 80
          restartPolicy: Always
    
  2. 配置Pod权限
    创建具备IAM权限的ServiceAccount,例如(针对EKS集群的IRSA方式):

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: aws-iam-sa
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/k8s-pod-iam-role
    

    确保绑定的IAM角色拥有iam:CreatePolicy、iam:CreateRole、iam:AttachRolePolicy等必要权限。

  3. 部署资源
    执行命令部署Deployment和ServiceAccount:

    kubectl apply -f service-account.yaml
    kubectl apply -f deployment.yaml
    

关键注意事项

  • 幂等性处理:所有AWS命令需加入判断逻辑,避免重复创建资源导致报错(例如|| true或先查询资源是否存在)。
  • 权限控制:严格控制执行命令的Pod权限,遵循最小权限原则。
  • 资源清理:Helm Job可通过hook-delete-policy设置完成后自动删除,避免集群中残留无用资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:02:21