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

Terraform资源映射:如何关联KMS密钥到对应S3桶与KMS别名

解决方案

1. KMS别名资源的target_key_id赋值

因为aws_kms_alias和aws_kms_key都是用同一个local.keys作为for_each遍历源,同一个each.key对应同一个密钥的配置,直接关联对应KMS密钥的ID即可:

target_key_id = aws_kms_key.key[each.key].key_id

2. S3桶KMS密钥映射实现

首先需要调整local.buckets的kms_key字段取值:将原本的false替换为对应要绑定的local.keys中的键名,不需要自定义KMS密钥的桶可以设为null(会自动使用AWS托管的S3默认KMS密钥),示例调整如下:

locals {
  buckets = {
    "1" = { 
      name    = "bucket-1", 
      kms_key = "1" // 绑定local.keys中key为"1"的KMS密钥
    },
    "2" = { 
      name    = "bucket-2", 
      kms_key = "il5" // 绑定local.keys中key为"il5"的KMS密钥
    },
    "3" = { 
      name    = "bucket-3", 
      kms_key = "ebs" // 绑定local.keys中key为"ebs"的KMS密钥
    },
    "4" = { 
      name    = "bucket-4", 
      kms_key = null // 使用AWS默认托管S3密钥
    },
    "5" = { 
      name    = "bucket-5", 
      kms_key = "1"
    },
    "6" = { 
      name    = "bucket-6", 
      kms_key = "il5"
    }
  }
  // 原有keys配置保持不变
  keys = {
    "1"     = {
      description = "1"
      alias       = "alias/1-key"
    },
    "il5"      = {
      description = "2"
      alias       = "alias/2-key"
    },
    "ebs"      = {
      description = "3"
      alias       = "alias/3-key"
    }
  }
}

接着修改S3桶资源的kms_master_key_id字段,用HCL三目运算符做条件判断即可:

kms_master_key_id = each.value.kms_key != null ? aws_kms_key.key[each.value.kms_key].key_id : "alias/aws/s3"

完整修改后的代码示例

locals {
  buckets = {
    "1" = { 
      name    = "bucket-1", 
      kms_key = "1"
    },
    "2" = { 
      name    = "bucket-2", 
      kms_key = "il5"
    },
    "3"     = { 
      name    = "bucket-3", 
      kms_key = "ebs"
    },
    "4"     = { 
      name    = "bucket-4", 
      kms_key = null
    },
    "5"        = { 
      name    = "bucket-5", 
      kms_key = "1"
    },
    "6"          = { 
      name    = "bucket-6", 
      kms_key = "il5"
    }
  }
  keys = {
    "1"     = {
      description = "1"
      alias       = "alias/1-key"
    },
    "il5"      = {
      description = "2"
      alias       = "alias/2-key"
    },
    "ebs"      = {
      description = "3"
      alias       = "alias/3-key"
    }
  }
}

resource "aws_kms_key" "key" {
  for_each = local.keys

  description             = each.value.description
  enable_key_rotation     = true
  deletion_window_in_days = 30
}

resource "aws_kms_alias" "this" {
  for_each = local.keys

  name          = each.value.alias
  target_key_id = aws_kms_key.key[each.key].key_id
}

resource "aws_s3_bucket" "bucket" {
  for_each = local.buckets

  bucket = each.value.name
  acl    = "private"

  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm     = "aws:kms"
        kms_master_key_id = each.value.kms_key != null ? aws_kms_key.key[each.value.kms_key].key_id : "alias/aws/s3"
      }
    }
  }
}

如果需要完全关闭未指定KMS密钥的桶的加密,直接调整三目运算符后的返回值和sse_algorithm字段的逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:36:02