islamelkadi/terraform-aws-metadata

GitHub: islamelkadi/terraform-aws-metadata

一个为 AWS 基础设施提供标准化命名、安全控件和合规性标签的 Terraform 模块,帮助企业实现跨环境的一致性资源治理。

Stars: 0 | Forks: 0

# Terraform AWS Metadata 模块 一个 Terraform 模块,用于为 AWS 资源生成标准化的命名规范、安全控件和合规性标签。该模块是跨 AWS 基础设施实现一致资源管理的基础。 ## 目录 - [前置条件](#prerequisites) - [功能特性](#features) - [安全性](#security) - [安全控件](#security-controls) - [安全控件覆盖模式](#security-control-override-pattern) - [安全配置文件](#security-profiles) - [安全标签](#security-tags) - [快速入门](#quick-start) - [支持的资源类型](#supported-resource-types) - [优势](#benefits) - [区域配置](#region-configuration) - [MCP 服务器](#mcp-servers) - [要求](#requirements) ## 前置条件 本模块专为 macOS 设计。您的机器上必须已安装以下软件: - Python 3 和 pip - [Kiro](https://kiro.dev) 和 Kiro CLI - [Homebrew](https://brew.sh) 要安装其余开发工具,请运行: ``` make bootstrap ``` 这将安装/升级:tfenv、Terraform(通过 tfenv)、tflint、terraform-docs、checkov 和 pre-commit。 ## 功能特性 - **标准化命名**:以 `organization-project-environment-resourcetype` 格式生成一致的资源前缀 - **安全配置文件**:环境感知的安全控件(dev、staging、prod) - **合规性支持**:内置支持 FCAC、PCI DSS、SOC2、HIPAA、ISO27001 - **区域缩写**:将 AWS 区域名称转换为短代码(例如,`us-east-1` → `use1`) - **资源类型代码**:提供常见 AWS 资源类型的缩写代码 - **路径生成**:为 IAM 和其他资源创建层级路径 - **长度验证**:确保生成的名称不超过 AWS 命名限制(64 个字符) - **组织上下文**:自动获取 AWS 账户 ID 和组织 ID ## 安全性 ### 安全控件 `security_controls` 输出提供了一个全面的对象,其中安全设置按类别组织: - **encryption**:KMS、静态/传输加密、密钥轮换 - **logging**:CloudWatch Logs、保留期、访问日志、流日志 - **network**:私有子网、VPC 终端节点、公有访问、IMDSv2 - **iam**:最小权限、通配符限制、MFA、服务角色 - **data_protection**:版本控制、MFA 删除、备份、公有访问、生命周期 - **monitoring**:X-Ray、增强监控、Performance Insights、CloudTrail - **high_availability**:多可用区、跨区域备份 - **compliance**:PITR、预留并发、删除保护 **在模块中使用安全控件:** ``` # 在 module 中 (例如, terraform-aws-s3) module "metadata" { source = "github.com/islamelkadi/terraform-aws-metadata" namespace = var.namespace environment = var.environment project_name = var.name resource_type = "s3" } # 使用安全控制 locals { versioning_required = module.metadata.security_controls.data_protection.require_versioning kms_required = module.metadata.security_controls.encryption.require_kms_customer_managed log_retention = module.metadata.security_controls.logging.min_log_retention_days } # 应用安全标签 resource "aws_s3_bucket" "this" { bucket = module.metadata.resource_prefix tags = merge(module.metadata.security_tags, var.tags) } ``` ### 安全控件覆盖模式 模块应允许在提供理由的情况下覆盖安全控件: ``` variable "security_control_overrides" { description = "Override specific security controls with documented justification" type = object({ disable_versioning_requirement = optional(bool, false) disable_kms_requirement = optional(bool, false) justification = optional(string, "") }) default = {} } locals { versioning_required = module.metadata.security_controls.data_protection.require_versioning && !var.security_control_overrides.disable_versioning_requirement } ``` ### 安全配置文件 该模块提供三种安全配置文件,可根据您的环境自动配置安全控件: #### Dev 配置文件 **用途**:开发和测试环境 **特点**: - 宽松的安全控件,便于更快迭代 - 较短的日志保留期(7 天) - 可选加密,使用 AWS 托管密钥 - 允许单可用区部署 - 允许公有访问以进行测试 - 无删除保护(便于销毁) **用例**:本地开发、功能分支、概念验证、成本优化 #### Staging 配置文件 **用途**:预生产测试和验证 **特点**: - 类生产环境的安全控件 - 90 天日志保留期 - 需要客户托管的 KMS 密钥 - 数据库需多可用区 - 需要私有子网 - 启用完整监控 - 启用删除保护 **用例**:集成测试、性能测试、安全测试、UAT 环境 #### Prod 配置文件 **用途**:生产工作负载 **特点**: - 最高级别的安全控件 - 365 天日志保留期(符合 PCI DSS 合规性) - 需要客户托管的 KMS 密钥 - 所有关键资源需多可用区 - 启用跨区域备份 - S3 启用 MFA 删除 - Lambda 预留并发 - 完整监控和追踪 **用例**:生产应用程序、面向客户的服务、受监管的工作负载、关键任务系统 ### 安全标签 `security_tags` 输出提供标准的安全和合规性标签: - **Organization**:组织名称(SCREAMING_SNAKE_CASE) - **Project**:项目名称(SCREAMING_SNAKE_CASE) - **Environment**:环境(DEV、STAGING、PROD) - **Region**:区域代码(USE1、EUW1 等) - **ResourceType**:资源类型代码(SCREAMING_SNAKE_CASE) - **ManagedBy**:TERRAFORM - **Repository**:CORPORATE_ACTIONS_ORCHESTRATOR - **SecurityProfile**:DEV、STAGING 或 PROD - **DataClass**:CONFIDENTIAL、INTERNAL 或 PUBLIC - **ComplianceFrameworks**:逗号分隔列表(FCAC、PCI_DSS 等) - **ComplianceRequired**:TRUE(如果指定了框架) - **AuditRequired**:TRUE(如果指定了框架) ## 快速入门 ### 基本用法 ``` module "metadata" { source = "github.com/islamelkadi/terraform-aws-metadata?ref=v1.0.0" namespace = "myorg" project_name = "myapp" environment = "prod" region = "us-east-1" resource_type = "lambda" } resource "aws_lambda_function" "example" { function_name = "${module.metadata.resource_prefix}-handler" # Results in: myorg-myapp-prod-lambda-handler tags = module.metadata.security_tags } ``` ### 使用安全控件 ``` module "metadata" { source = "github.com/islamelkadi/terraform-aws-metadata?ref=v1.0.0" namespace = "myorg" project_name = "myapp" environment = "prod" region = "us-east-1" resource_type = "s3" security_profile = "prod" compliance_frameworks = ["FCAC", "PCI_DSS"] } resource "aws_s3_bucket" "example" { bucket = module.metadata.resource_prefix tags = module.metadata.security_tags } resource "aws_s3_bucket_versioning" "example" { count = module.metadata.security_controls.data_protection.require_versioning ? 1 : 0 bucket = aws_s3_bucket.example.id versioning_configuration { status = "Enabled" } } ``` ## 支持的资源类型 该模块支持一套全面的 AWS 资源类型及其直观的缩写。您可以使用全名或常用别名。 ### 计算服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `lambda` | `lambda` | AWS Lambda function | | `lambda-layer` | `layer` | Lambda layer | | `sfn`, `step-functions` | `sfn` | Step Functions state machine | ### 存储服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `s3`, `s3-bucket` | `s3` | S3 bucket | ### 数据库服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `dynamodb`, `dynamodb-table` | `ddb` | DynamoDB table | | `rds`, `rds-cluster` | `rds` | RDS database instance/cluster | | `rds-proxy` | `rdsprx` | RDS Proxy | | `aurora` | `aurora` | Aurora cluster | ### 网络服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `vpc` | `vpc` | Virtual Private Cloud | | `subnet` | `subnet` | VPC Subnet | | `sg`, `security-group` | `sg` | Security Group | | `nacl` | `nacl` | Network ACL | | `nat`, `nat-gateway` | `nat` | NAT Gateway | | `vpce`, `vpc-endpoint` | `vpce` | VPC Endpoint | ### 安全与身份服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `kms`, `kms-key` | `kms` | KMS key | | `secret`, `secrets-manager` | `secret` | Secrets Manager secret | | `iam-role` | `role` | IAM role | | `iam-policy` | `policy` | IAM policy | | `iam-user` | `user` | IAM user | | `iam-group` | `group` | IAM group | ### 身份服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `cognito-user-pool` | `userpool` | Cognito User Pool | | `cognito-user-pool-client` | `upclient` | Cognito User Pool Client | | `cognito-user-pool-domain` | `updomain` | Cognito User Pool Domain | | `cognito-identity-pool` | `idpool` | Cognito Identity Pool | ### 监控与日志服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `logs`, `log-group` | `logs` | CloudWatch Log Group | | `alarm`, `cloudwatch-alarm` | `alarm` | CloudWatch Alarm | ### 集成服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `eventbridge` | `eb` | EventBridge bus | | `eventbridge-rule` | `ebrule` | EventBridge rule | | `sns`, `sns-topic` | `sns` | SNS topic | | `sqs`, `sqs-queue` | `sqs` | SQS queue | | `apigateway`, `api-gateway`, `apigw-rest` | `apigw` | API Gateway REST API | | `apigw-http` | `httpapi` | API Gateway HTTP API | | `apigw-websocket` | `wsapi` | API Gateway WebSocket API | ### AI/ML 服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `bedrock` | `bedrock` | Bedrock agent/model | | `bedrock-agent` | `agent` | Bedrock agent | | `bedrock-kb` | `kb` | Bedrock knowledge base | ### 内容分发服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `cloudfront`, `cloudfront-dist` | `cf` | CloudFront distribution | ### 治理与管理服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `config` | `config` | AWS Config | | `config-aggregator` | `cfgagg` | Config aggregator | | `config-rule` | `cfgrule` | Config rule | ### 应用程序服务 | 资源类型 | 缩写 | 描述 | |--------------|--------------|-------------| | `app` | `app` | Generic application | ### 使用示例 ``` # Lambda function resource_type = "lambda" # → acme-payments-prod-lambda # DynamoDB table resource_type = "dynamodb" # → acme-payments-prod-ddb # API Gateway (多个别名) resource_type = "apigateway" # → acme-payments-prod-apigw resource_type = "api-gateway" # → acme-payments-prod-apigw resource_type = "apigw-rest" # → acme-payments-prod-apigw # Cognito User Pool resource_type = "cognito-user-pool" # → acme-payments-prod-userpool ``` ## 优势 1. **集中化策略管理**:安全策略一次定义,到处应用 2. **环境感知**:根据环境自动配置安全控件 3. **合规性支持**:内置支持合规性框架 4. **一致的标签**:对所有资源应用标准标签 5. **审计追踪**:在代码中记录覆盖理由 6. **灵活性**:可以在需要时通过提供理由来覆盖控件 7. **标准化命名**:所有基础设施使用一致的资源名称 ## 区域配置 `region` 变量是基础设施中一致的资源命名和标记所必需的。虽然 AWS provider 配置可以从凭证或环境变量中自动检测区域,但将区域显式传递给此模块可确保: 1. **CI/CD 流水线控制**:在使用 Terragrunt 或类似工具的自动化流水线(GitHub Actions、GitLab CI 等)中,您可以显式控制资源部署到哪个区域 2. **一致的命名**:区域缩写(例如,`us-east-1` → `use1`)包含在资源名称和路径中 3. **多区域部署**:当部署到多个区域时,每个模块实例可以拥有自己特定于区域的命名 **在 CI/CD 中的使用**: ``` # 在你的 Terragrunt 或 Terraform 配置中 module "metadata" { source = "github.com/islamelkadi/terraform-aws-metadata" namespace = "myorg" project_name = "myapp" environment = "prod" region = var.region # Passed from pipeline or tfvars resource_type = "lambda" } ``` **设置区域**: - 通过变量:`region = "us-east-1"` - 通过环境变量:`export TF_VAR_region="us-east-1"` - 通过 tfvars 文件:在 `terraform.tfvars` 中设置 `region = "us-east-1"` - 通过 AWS provider:如果区域为 null,模块将使用 `data.aws_region.current` 作为回退 ## MCP 服务器 本模块包含两个在 `.kiro/settings/mcp.json` 中配置的 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) 服务器,用于 Kiro: | 服务器 | 包 | 描述 | |--------|---------|-------------| | `aws-docs` | `awslabs.aws-documentation-mcp-server@latest` | 提供对 AWS 文档的访问,用于服务功能、API 参考和最佳实践的上下文查找。 | | `terraform` | `awslabs.terraform-mcp-server@latest` | 支持直接从 IDE 执行 Terraform 操作(init、validate、plan、fmt、tflint),并为常见工作流提供自动批准的命令。 | 这两个服务器都通过 `uvx` 运行,除了 [引导](#prerequisites) 步骤外,不需要额外的安装。 ## 要求 | 名称 | 版本 | |------|---------| | [terraform](#requirement\_terraform) | >= 1.14.3 | | [aws](#requirement\_aws) | >= 6. | ## Providers | 名称 | 版本 | |------|---------| | [aws](#provider\_aws) | >= 6.34 | ## Modules No modules. ## Resources | 名称 | 类型 | |------|------| | [aws_caller_identity.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity) | data source | | [aws_organizations_organization.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/organizations_organization) | data source | | [aws_region.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/region) | data source | ## Inputs | 名称 | 描述 | 类型 | 默认值 | 必填 | |------|-------------|------|---------|:--------:| | [compliance\_frameworks](#input\_compliance\_frameworks) | 要强制执行的合规性框架列表(例如:FCAC、PCI\_DSS、SOC2) | `list(string)` | `[]` | no | | [environment](#input\_environment) | 部署配置聚合器的环境名称(dev、test、prod 等)。用于语义组织。 | `string` | `"dev"` | no | | [namespace](#input\_namespace) | 用于资源命名和标记的命名空间(组织/团队名称)。 | `string` | n/a | yes | | [project\_name](#input\_project\_name) | 分配给此项目的唯一名称。用于语义组织。 | `string` | n/a | yes | | [region](#input\_region) | 部署用的 AWS 区域。用于感知区域的命名,并传递给消费者模块以进行 provider 配置。 | `string` | `null` | no | | [resource\_type](#input\_resource\_type) | 正在创建的资源类型(例如:config-aggregator、s3-bucket 等) | `string` | n/a | yes | | [security\_profile](#input\_security\_profile) | 要应用的安全配置文件(dev、staging、prod)。决定安全控件的默认值。 | `string` | `null` | no | ## Outputs | 名称 | 描述 | |------|-------------| | [account\_id](#output\_account\_id) | AWS 账户 ID。 | | [effective\_security\_profile](#output\_effective\_security\_profile) | 正在应用的有效安全配置文件(dev、staging 或 prod) | | [organization\_id](#output\_organization\_id) | AWS 组织 ID。 | | [region\_code](#output\_region\_code) | AWS 区域代码(缩写)。 | | [region\_name](#output\_region\_name) | AWS 区域名称。 | | [resource\_path](#output\_resource\_path) | 格式为 /organization/project/environment/resourcetype/ 的资源路径 | | [resource\_path\_with\_region](#output\_resource\_path\_with\_region) | 包含区域的资源路径,格式为 /organization/project/environment/region/resourcetype/ | | [resource\_prefix](#output\_resource\_prefix) | 格式为 organization-project-environment-resourcetype 的资源前缀 | | [resource\_prefix\_with\_region](#output\_resource\_prefix\_with\_region) | 包含区域的资源前缀,格式为 organization-project-environment-region-resourcetype | | [resource\_type\_code](#output\_resource\_type\_code) | 资源类型代码(缩写)。 | | [security\_controls](#output\_security\_controls) | 基于环境和安全配置文件的安全控件配置 | | [security\_tags](#output\_security\_tags) | 应用于所有资源的标准安全和合规性标签 |
标签:AWS, AWS Organizations, DPI, EC2, ECS, FCAC, HIPAA, IaC, ISO27001, Kiro, PCI DSS, Python, SOC2, Terraform, 云治理, 人工智能安全, 企业级, 合规性, 命名规范, 安全控制, 开发工具库, 无后门, 标签管理, 漏洞利用检测, 自动化运维, 资源元数据, 身份与访问管理, 逆向工具