islamelkadi/terraform-aws-sns
GitHub: islamelkadi/terraform-aws-sns
生产级 Terraform 模块,用于创建符合多项安全标准的 AWS SNS 主题,内置加密、访问控制和环境感知的安全控制机制。
Stars: 0 | Forks: 0
# Terraform AWS SNS 模块
[](https://github.com/islamelkadi/terraform-aws-sns/actions/workflows/terraform-security.yaml)
[](https://github.com/islamelkadi/terraform-aws-sns/actions/workflows/terraform-lint.yaml)
[](https://github.com/islamelkadi/terraform-aws-sns/actions/workflows/terraform-docs.yaml)
一个可复用的 Terraform 模块,用于创建带有订阅、加密和交付策略的 AWS SNS 主题。
## 目录
- [前置条件](#prerequisites)
- [安全性](#security)
- [功能](#features)
- [用法](#usage)
- [要求](#requirements)
- [MCP 服务器](#mcp-servers)
## 前置条件
本模块专为 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。
## 安全性
### 安全控制
本模块实施安全控制以符合以下标准:
- AWS Foundational Security Best Practices (FSBP)
- CIS AWS Foundations Benchmark
- NIST 800-53 Rev 5
- NIST 800-171 Rev 2
- PCI DSS v4.0
### 已实施的控制
- [x] **加密**:使用客户托管密钥进行 KMS 静态加密
- [x] **传输中加密**:所有消息传递使用 TLS 1.2+
- [x] **访问控制**:用于主题访问管理的 IAM 策略
- [x] **安全控制覆盖**:具有审计理由的可扩展覆盖系统
- [ ] **交付状态日志记录**:用于记录交付失败的 CloudWatch Logs(计划功能)
### 安全最佳实践
**生产环境主题:**
- 使用 KMS 客户托管密钥进行加密
- 为关键主题启用交付状态日志记录
- 使用 IAM 策略限制主题访问
- 为失败的交付配置死信队列
- 在 CloudWatch 中监控交付指标
**开发环境主题:**
- 仍然建议使用 KMS 加密
- 交付日志记录可选,以节省成本
有关完整的安全标准和实施细节,请参阅 [AWS 安全标准](../../../.kiro/steering/aws/aws-security-standards.md)。
### 基于环境的安全控制
安全控制通过 [terraform-aws-metadata](https://github.com/islamelkadi/terraform-aws-metadata?tab=readme-ov-file#security-profiles) 模块的安全配置文件根据环境自动应用:
| 控制项 | 开发环境 | 预发布环境 | 生产环境 |
|---------|-----|---------|------|
| KMS 加密 | 可选 | 必需 | 必需 |
| 传输中加密 (TLS 1.2+) | 必需 | 必需 | 必需 |
| 访问控制 (IAM) | 强制执行 | 强制执行 | 强制执行 |
| 死信队列 | 可选 | 推荐 | 必需 |
有关安全配置文件以及控制如何随环境变化的完整详细信息,请参阅 [安全配置文件](https://github.com/islamelkadi/terraform-aws-metadata?tab=readme-ov-file#security-profiles) 文档。
### 安全扫描抑制
本模块抑制了某些 Checkov 安全检查,这些检查要么不适用于示例/演示代码,要么代表可选功能。以下检查在 `.checkov.yaml` 中被抑制:
**模块源版本控制 (CKV_TF_1, CKV_TF_2)**
- 被抑制是因为我们使用语义版本标签(`?ref=v1.0.0`)而不是提交哈希,以便于维护和阅读
- 语义版本控制是稳定版本的有效且广泛接受的版本控制策略
**KMS IAM 策略 (CKV_AWS_111, CKV_AWS_356, CKV_AWS_109)**
- 在示例代码中被抑制,其中 KMS 模块使用灵活的 IAM 策略用于演示目的
- 生产部署应根据特定的安全要求自定义 KMS 策略,并应用最小权限原则
## 功能
- 带有 KMS 加密的 SNS 主题
- 多种订阅类型(Email, SMS, Lambda, SQS, HTTPS)
- FIFO 主题支持
- 自定义交付策略
- 安全控制集成
## 使用示例
### 基本示例
```
module "sns_topic" {
source = "github.com/islamelkadi/terraform-aws-sns"
namespace = "example"
environment = "prod"
name = "alerts"
region = "us-east-1"
display_name = "Corporate Actions Alerts"
kms_key_arn = module.kms.key_arn
email_subscriptions = [
"ops-team@example.com"
]
lambda_subscriptions = [
module.alert_processor.function_arn
]
tags = {
Project = "CorporateActions"
}
}
```
### 具有多项订阅的生产主题
```
module "sns_topic" {
source = "github.com/islamelkadi/terraform-aws-sns"
security_controls = module.metadata.security_controls
namespace = "example"
environment = "prod"
name = "corporate-actions-events"
region = "us-east-1"
display_name = "Corporate Actions Events"
kms_key_arn = module.kms.key_arn
# Multiple subscription types
email_subscriptions = [
"ops-team@example.com",
"compliance@example.com"
]
lambda_subscriptions = [
module.event_processor.function_arn,
module.audit_logger.function_arn
]
sqs_subscriptions = [
module.event_queue.queue_arn
]
# Custom delivery policy
delivery_policy = jsonencode({
http = {
defaultHealthyRetryPolicy = {
minDelayTarget = 20
maxDelayTarget = 20
numRetries = 3
numMaxDelayRetries = 0
numNoDelayRetries = 0
numMinDelayRetries = 0
backoffFunction = "linear"
}
}
})
tags = {
Project = "CorporateActions"
Purpose = "EventNotification"
Compliance = "PCI-DSS"
}
}
```
### 用于有序消息的 FIFO 主题
```
module "fifo_topic" {
source = "github.com/islamelkadi/terraform-aws-sns"
security_controls = module.metadata.security_controls
namespace = "example"
environment = "prod"
name = "ordered-events"
region = "us-east-1"
# FIFO configuration
fifo_topic = true
content_based_deduplication = true
kms_key_arn = module.kms.key_arn
# FIFO topics can only subscribe to FIFO SQS queues
sqs_subscriptions = [
module.fifo_queue.queue_arn
]
tags = {
Project = "CorporateActions"
Type = "FIFO"
}
}
```
## 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) 步骤外,不需要额外的安装。
## 用法
```
module "notifications" {
source = "github.com/islamelkadi/terraform-aws-sns"
namespace = var.namespace
environment = var.environment
name = var.name
region = var.region
display_name = var.display_name
# Subscription types
email_subscriptions = [var.email_endpoint]
sqs_subscriptions = [var.sqs_queue_arn]
kms_key_arn = var.kms_key_arn
tags = var.tags
}
```
## 要求
| 名称 | 版本 |
|------|---------|
| [terraform](#requirement\_terraform) | >= 1.14.3 |
| [aws](#requirement\_aws) | >= 6.34 |
## Providers
| 名称 | 版本 |
|------|---------|
| [aws](#provider\_aws) | >= 6.34 |
## 模块
| 名称 | 源 | 版本 |
|------|--------|---------|
| [metadata](#module\_metadata) | github.com/islamelkadi/terraform-aws-metadata | v1.1.0 |
## 资源
| 名称 | 类型 |
|------|------|
| [aws_sns_topic.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sns_topic) | resource |
| [aws_sns_topic_policy.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sns_topic_policy) | resource |
| [aws_sns_topic_subscription.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sns_topic_subscription) | resource |
## 输入
| 名称 | 描述 | 类型 | 默认值 | 必需 |
|------|-------------|------|---------|:--------:|
| [attributes](#input\_attributes) | 用于命名的额外属性 | `list(string)` | `[]` | no |
| [content\_based\_deduplication](#input\_content\_based\_deduplication) | 为 FIFO 主题启用基于内容的去重 | `bool` | `false` | no |
| [delimiter](#input\_delimiter) | 用于名称组件之间的分隔符 | `string` | `"-"` | no |
| [delivery\_policy](#input\_delivery\_policy) | 主题的 JSON 编码交付策略 | `string` | `null` | no |
| [display\_name](#input\_display\_name) | SNS 主题的显示名称 | `string` | `""` | no |
| [email\_subscriptions](#input\_email\_subscriptions) | 要订阅主题的电子邮件地址列表 | `list(string)` | `[]` | no |
| [environment](#input\_environment) | 环境名称 (dev, staging, prod) | `string` | n/a | yes |
| [fifo\_topic](#input\_fifo\_topic) | 该主题是否为 FIFO 主题 | `bool` | `false` | no |
| [https\_subscriptions](#input\_https\_subscriptions) | 要订阅主题的 HTTPS 端点列表 | `list(string)` | `[]` | no |
| [kms\_key\_arn](#input\_kms\_key\_arn) | 用于加密的 KMS 密钥 ARN。如未提供,则使用 AWS 托管密钥 | `string` | `null` | no |
| [lambda\_subscriptions](#input\_lambda\_subscriptions) | 要订阅主题的 Lambda 函数 ARN 列表 | `list(string)` | `[]` | no |
| [name](#input\_name) | SNS 主题的名称 | `string` | n/a | yes |
| [namespace](#input\_namespace) | 命名空间(组织/团队名称) | `string` | n/a | yes |
| [region](#input\_region) | 将创建资源的 AWS 区域 | `string` | n/a | yes |
| [security\_control\_overrides](#input\_security\_control\_overrides) | 以书面理由覆盖特定的安全控制 |
object({
disable_kms_requirement = optional(bool, false)
justification = optional(string, "")
}) | {
"disable_kms_requirement": false,
"justification": ""
} | no |
| [security\_controls](#input\_security\_controls) | 来自元数据模块的安全控制配置 | object({
encryption = object({
require_kms_customer_managed = bool
require_encryption_at_rest = bool
require_encryption_in_transit = bool
enable_kms_key_rotation = bool
})
logging = object({
require_cloudwatch_logs = bool
min_log_retention_days = number
require_access_logging = bool
require_flow_logs = bool
})
monitoring = object({
enable_xray_tracing = bool
enable_enhanced_monitoring = bool
enable_performance_insights = bool
require_cloudtrail = bool
})
compliance = object({
enable_point_in_time_recovery = bool
require_reserved_concurrency = bool
enable_deletion_protection = bool
})
}) | `null` | no |
| [sms\_subscriptions](#input\_sms\_subscriptions) | 要订阅主题的电话号码列表 | `list(string)` | `[]` | no |
| [sqs\_subscriptions](#input\_sqs\_subscriptions) | 要订阅主题的 SQS 队列 ARN 列表 | `list(string)` | `[]` | no |
| [tags](#input\_tags) | 应用于资源的额外标签 | `map(string)` | `{}` | no |
| [topic\_policy](#input\_topic\_policy) | JSON 编码的主题策略。如未提供,则使用默认策略 | `string` | `null` | no |
## 输出
| 名称 | 描述 |
|------|-------------|
| [subscription\_arns](#output\_subscription\_arns) | 订阅 ARN 的映射 |
| [tags](#output\_tags) | 应用于 SNS 主题的标签 |
| [topic\_arn](#output\_topic\_arn) | SNS 主题的 ARN |
| [topic\_id](#output\_topic\_id) | SNS 主题的 ID |
| [topic\_name](#output\_topic\_name) | SNS 主题的名称 |
| [topic\_owner](#output\_topic\_owner) | 主题所有者的 AWS 账户 ID |
## 示例
请参阅 [example/](example/) 以获取包含所有功能的完整工作示例。
标签:AWS, CIS, DPI, EC2, ECS, GitHub Actions, IaC, KMS加密, NIST, PCI-DSS, SNS, Terraform, Tflint, 人工智能安全, 企业级, 发布订阅, 合规性, 模块, 消息队列, 特权提升, 自动化部署, 自动笔记, 身份与访问管理, 逆向工具, 错误基检测, 静态代码分析