如何为Cloud Posse TF lambda-function模块的子资源添加标签
我在TF Cloud中通过Cloud Posse的lambda-function AWS模块(版本0.5.1)定义了AWS Lambda,配置如下:
module "lambda-function" { source = "cloudposse/lambda-function/aws" version = "0.5.1" environment = var.environment function_name = "${local.service_name}-${var.environment}-restart" description = "AWS lambda to restart ${local.service_name}-${var.environment}" handler = "handler" runtime = "go1.x" filename = data.archive_file.lambda.output_path source_code_hash = filebase64sha256(data.archive_file.lambda.output_path) cloudwatch_logs_retention_in_days = 7 timeout = 60 vpc_config = { security_group_ids = tolist([data.aws_vpc.selected.id]), subnet_ids = tolist(data.aws_subnets.selected.ids) } }
公司Sentinel策略检测报错:
module.lambda-function.aws_iam_role.this[0] has tags_all with value
{Owner: Backend, Repo: https://github.com/xxx Service: xxx-service, Terraform: true, Environment: xxx-service-deploy-dev}
that is missing the required items [Name] from the list: [Name, Environment, Owner, Terraform]
我尝试过以下配置,但无效:
resource "aws_iam_role" "lambda_role_tags" { name = module.lambda-function.role_name # Add the desired tags here tags = { Name = "a tag" } }
请问是否可以单独为这个IAM角色子资源添加Name标签?还是必须修改Sentinel策略?
补充说明:我们已通过AWS Provider的default_tags配置通用标签,但不想给所有资源添加相同的Name标签,通常会为单个资源设置唯一的Name标签,示例如下:
provider "aws" { # ... other configuration ... default_tags { tags = { Owner = "Backend" Repo = "https://github.com/xxx" Service = "xxx-service" Terraform = true Environment = "xxx-service-deploy-dev" } } } resource "aws_ecs_task_definition" "task" { ... tags = { "Name" = "${var.stage}-${local.service_name}-task" } }
可以单独为该IAM角色添加Name标签,无需修改策略,有两种可行方式:
方式1:使用模块内置的标签参数
Cloud Posse的lambda-function模块(v0.5.1)支持通过role_tags参数为内部创建的IAM角色单独设置标签,直接在模块配置中添加即可:
module "lambda-function" { source = "cloudposse/lambda-function/aws" version = "0.5.1" # 保留原有所有配置... environment = var.environment function_name = "${local.service_name}-${var.environment}-restart" # ... 其他配置省略 # 新增角色专属标签 role_tags = { Name = "${local.service_name}-${var.environment}-restart-role" } }
如果模块的tags参数会传递给所有包含的资源(包括IAM角色),也可以使用tags参数,但role_tags是更精准的选择,仅作用于IAM角色。
方式2:用aws_iam_role_tag资源追加标签
你之前直接定义aws_iam_role资源会和模块创建的角色冲突,正确的做法是使用aws_iam_role_tag资源为已存在的角色添加标签:
resource "aws_iam_role_tag" "lambda_role_name_tag" { role = module.lambda-function.role_name key = "Name" value = "${local.service_name}-${var.environment}-restart-role" }
这种方式可以单独给模块生成的IAM角色追加标签,不会与模块的资源定义冲突。
注意事项
- 优先选择方式1,这是Terraform模块设计的标准用法,能保证配置一致性。
- 方式2适用于模块未暴露标签参数的场景,需要确保模块输出了
role_name(你的配置中已引用该输出,说明模块支持)。
内容的提问来源于stack exchange,提问作者gingerbreadboy

