如何通过Helm Chart或Kubernetes Init Container创建AWS IAM角色与策略
一、使用Helm Chart实现
方案思路
借助Helm的Job资源,在Chart安装/升级时执行AWS CLI命令,完成IAM策略、角色的创建及关联操作。需要确保执行Job的Pod具备调用AWS IAM API的权限(可通过给Pod绑定IAM角色实现)。
具体步骤
准备IAM策略文件
在Helm Chart的files目录下创建策略文件(例如iam-policy.json),定义所需权限:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::my-bucket"] } ] }编写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配置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 }}配置Values参数
在values.yaml中定义必要参数:aws: region: us-east-1 accountId: "123456789012" serviceAccountName: aws-iam-sa iam: policyName: my-s3-list-policy roleName: my-ec2-role安装Chart
确保目标K8s集群中已存在具备IAM权限的ServiceAccount,然后执行安装命令:helm install my-iam-chart ./path/to/chart
二、使用Kubernetes初始化容器实现
方案思路
在Deployment的Init Container中运行AWS CLI,在业务容器启动前完成IAM资源的创建。同样需要给Pod绑定具备IAM权限的角色。
具体步骤
编写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配置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等必要权限。部署资源
执行命令部署Deployment和ServiceAccount:kubectl apply -f service-account.yaml kubectl apply -f deployment.yaml
关键注意事项
- 幂等性处理:所有AWS命令需加入判断逻辑,避免重复创建资源导致报错(例如
|| true或先查询资源是否存在)。 - 权限控制:严格控制执行命令的Pod权限,遵循最小权限原则。
- 资源清理:Helm Job可通过
hook-delete-policy设置完成后自动删除,避免集群中残留无用资源。
内容的提问来源于stack exchange,提问作者iwhitepanther

