Создать AWS SNS Topic через Terraform — шаги и политика

Введение
В статье мы создаём SNS topic с политикой доступа, которая позволяет вашему аккаунту AWS выполнять все действия SNS по этой теме. Все шаги выполняются с помощью Terraform. Предполагается базовое знание AWS SNS и Terraform. Если вы хотите альтернативный пример, у меня есть статья о создании SNS topic через CloudFormation (ссылка в исходном материале).
Важно: перед началом убедитесь, что у вас есть доступ к AWS (access_key и secret_key) у IAM-пользователя с правами на создание SNS тем и политик.
Что потребуется
- Базовые знания Terraform.
- Установленный Terraform на вашем компьютере.
- AWS-аккаунт.
- access_key и secret_key IAM-пользователя с нужными правами.
Что мы сделаем
- Напишем конфигурационные файлы Terraform для SNS Topic.
- Создадим SNS Topic с помощью Terraform.
- Удалим созданную тему с помощью terraform destroy.
Файлы Terraform: main.tf, variables.tf, terraform.tfvars
Первым создайте файл main.tf с описанием провайдера, ресурса aws_sns_topic и aws_sns_topic_policy. В примере указан регион eu-west-3 — при необходимости поменяйте.
Github Link:
https://github.com/shivalkarrahul/DevOps/blob/master/aws/terraform/create-sns-topic/main.tfFile: main.tfprovider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "eu-west-3"
}
resource "aws_sns_topic" "my_first_sns_topic" {
name = var.sns_name
}
resource "aws_sns_topic_policy" "my_sns_topic_policy" {
arn = aws_sns_topic.my_first_sns_topic.arn
policy = data.aws_iam_policy_document.my_custom_sns_policy_document.json
}
data "aws_iam_policy_document" "my_custom_sns_policy_document" {
policy_id = "__default_policy_ID"
statement {
actions = [
"SNS:Subscribe",
"SNS:SetTopicAttributes",
"SNS:RemovePermission",
"SNS:Receive",
"SNS:Publish",
"SNS:ListSubscriptionsByTopic",
"SNS:GetTopicAttributes",
"SNS:DeleteTopic",
"SNS:AddPermission",
]
condition {
test = "StringEquals"
variable = "AWS:SourceOwner"
values = [
var.account_id,
]
}
effect = "Allow"
principals {
type = "AWS"
identifiers = ["*"]
}
resources = [
aws_sns_topic.my_first_sns_topic.arn,
]
sid = "__default_statement_ID"
}
}Создайте файл terraform.tfvars и поместите туда ваши access_key и secret_key.
Github Link:
https://github.com/shivalkarrahul/DevOps/blob/master/aws/terraform/create-sns-topic/terraform.tfvarsFile: terraform.tfvarsaccess_key = " "
secret_key = " "Определения переменных находятся в variables.tf — задайте там account_id и при желании имя темы sns_name.
Github Link:
https://github.com/shivalkarrahul/DevOps/blob/master/aws/terraform/create-sns-topic/variables.tfFile: variables.tfvariable "access_key" {
description = "Access key of AWS IAM user"
}
variable "secret_key" {
description = "Secret key of AWS IAM user"
}
variable "sns_name" {
description = "Name of the SNS Topic to be created"
default = "my_first_sns"
}
variable "account_id" {
description = "My Accout Number"
default = " "
}
Совет: не храните реальные ключи в репозиториях. Для CI/CD используйте переменные окружения или секреты в системе управления секретами.
Инициализация и создание ресурсов Terraform
После того как main.tf, terraform.tfvars и variables.tf находятся в одной директории, выполните стандартную последовательность команд Terraform.
- Инициализация рабочего каталога — загружает провайдеры и модули:
terraform init
- Создание плана — показывает, какие ресурсы будут созданы или изменены:
terraform plan
- Применение изменений — создаёт SNS topic и привязанную политику:
terraform apply
После успешного выполнения вы можете подтвердить создание темы в AWS Console (SNS).

Удаление ресурса
Когда тема больше не нужна, удалите её командой:
terraform destroyКоманда запросит подтверждение и затем удалит все ресурсы, которые описаны в конфигурации. Операция необратима — будьте внимательны при выполнении в production.

Рекомендации по безопасности и лучшие практики
- Минимизируйте права: в policy оставьте только нужные действия, избегайте “*” для идентификаторов, где это возможно.
- Не храните access_key/secret_key в репозитории в открытом виде.
- Используйте IAM роли для EC2/CI вместо статических ключей, когда это возможно.
- Включите аудит (CloudTrail) и мониторинг (CloudWatch) для отслеживания операций с темой.
- Ограничьте доступ по условию (condition) по AWS:SourceOwner и по ARN источников, если тема будет использоваться только внутри аккаунта.
Важно: текущий пример политики разрешает широкие действия для указанного владельца аккаунта. Для production чаще используют более узкие политики и отдельные роли для сервисов, которые публикуют/подписываются на тему.
Альтернативные подходы (когда использовать что)
- Terraform: хорошо подходит для декларативного управления инфраструктурой и версионирования состояния.
- CloudFormation: если у вас стандартная инфраструктура в AWS и вы хотите использовать нативные шаблоны AWS.
- AWS CLI / SDK: удобно для ad-hoc операций и автоматизации скриптами, но сложнее масштабировать как IaC.
Выбор зависит от процессов в вашей команде и требований к управлению состоянием.
Когда этот подход может не подойти
- Если у вас строгая политика запрета хранения state-файлов вне защищённого бэкенда — настройте удалённый state (S3 + DynamoDB Lock).
- Если нужна интеграция с CI/CD без секретов — используйте IAM роли для агента и провайдера.
- Если требуется динамическое создание тем в высоконагруженной среде — продумайте управление именами и конфликты ресурсов.
План принятия решения — мерчандайзинг (Mermaid)
flowchart TD
A[Нужно ли управлять SNS как кодом?] -->|Да| B{Имеется ли Terraform в стеке?}
B -->|Да| C[Использовать Terraform]
B -->|Нет| D{Предпочитаете CloudFormation?}
D -->|Да| E[Использовать CloudFormation]
D -->|Нет| F[Использовать AWS CLI/SDK с шаблонами]
A -->|Нет| G[Управлять вручную через Console]Роль-базовый чеклист (кто что проверяет)
- DevOps-инженер:
- Проверить конфигурацию provider и backend для state.
- Настроить CI/CD с безопасными секретами.
- Сетевой/Безопасность:
- Проверить политику доступа и условия (conditions).
- Подтвердить аудит и логирование действий с темой.
- Разработчик приложения:
- Убедиться, что приложение использует корректные ARN и права для Publish/Subscribe.
Критерии приёмки
- SNS topic создан и отображается в AWS Console.
- Политика темы содержит statement с требуемыми действиями и account_id.
- Terraform state отражает созданные ресурсы.
- Удаление terraform destroy корректно удаляет ресурс без остаточных зависимостей.
Глоссарий (в одну строку)
- SNS: Simple Notification Service — сервис AWS для pub/sub уведомлений.
- Terraform: инструмент для декларативного управления инфраструктурой.
- ARN: Amazon Resource Name — уникальный идентификатор ресурса в AWS.
Типичные ошибки и способы устранения
- Ошибка авторизации: проверьте access_key/secret_key и права IAM.
- Конфликты имён темы: измените переменную sns_name или используйте префиксы.
- State corruption: используйте remote backend (S3) и блокировки (DynamoDB).
Заключение
Мы прошли полный путь: создали SNS topic через Terraform, прикрепили политику доступа, выполнили проверку в консоли и показали, как удалить ресурс. Пример даёт рабочую базу; для production адаптируйте политику под принцип наименьших привилегий и интегрируйте безопасное хранение секретов.
Важно: перед применением в проде всегда выполняйте terraform plan и проверяйте, какие изменения будут внесены.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента