如何通过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
相关产品推荐
相关产品推荐

