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

如何通过AWS CDK扩展ALB控制器默认IAM策略?解决类型错误

解决ALB Controller自定义IAM策略时的TypeError: policy.Statement is not iterable错误

问题根源

你传入albController.policy的是CDK的iam.Policy资源对象,但该属性预期接收的是**IAM策略文档(PolicyDocument)**或JSON格式的策略语句数组,而非IAM Policy资源实例。解析时无法找到可迭代的Statement字段,因此抛出错误。

解决方案

提供两种可行的修复方式:

方式一:传递PolicyDocument对象

将自定义语句组装成PolicyDocument,直接传入policy属性:

const elbAllowAddTags = new iam.PolicyStatement({
  resources: ["*"],
  effect: iam.Effect.ALLOW,
  actions: ["elasticloadbalancing:AddTags"],
  conditions: { "StringEquals": { "elasticloadbalancing:CreateAction": "CreateTargetGroup" } }
});

// 创建策略文档而非IAM Policy资源
const elbPolicyDocument = new iam.PolicyDocument({
  statements: [elbAllowAddTags],
});

const eksCluster = new eks.Cluster(scope, id, {
  albController: {
    // ... 保留其他原有配置
    policy: elbPolicyDocument,
  },
});

方式二:直接传入JSON格式策略

跳过CDK的Policy类,直接传递JSON结构的策略:

const eksCluster = new eks.Cluster(scope, id, {
  albController: {
    // ... 保留其他原有配置
    policy: {
      Version: "2012-10-17",
      Statement: [
        {
          Effect: "Allow",
          Action: ["elasticloadbalancing:AddTags"],
          Resource: ["*"],
          Condition: { "StringEquals": { "elasticloadbalancing:CreateAction": "CreateTargetGroup" } }
        }
      ]
    },
  },
});

额外建议:保留默认策略的同时添加自定义权限

如果不想覆盖ALB控制器的默认IAM策略(避免丢失必要权限),可以直接给控制器角色附加自定义语句,无需指定policy属性:

const eksCluster = new eks.Cluster(scope, id, {
  albController: {
    // ... 保留其他原有配置,不要设置policy字段
  },
});

// 给ALB控制器角色添加自定义权限
eksCluster.albControllerRole?.addToPrincipalPolicy(elbAllowAddTags);

内容的提问来源于stack exchange,提问作者rytis-valiukas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:32:13