Гид по технологиям

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

• 4 min read • DevOps • Обновлено 17 Nov 2025
Создать AWS SNS Topic через Terraform
Создать AWS SNS Topic через Terraform

Обложка: AWS и Terraform, иллюстрация создания SNS Topic

Введение

В статье мы создаём 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-пользователя с нужными правами.

Что мы сделаем

  1. Напишем конфигурационные файлы Terraform для SNS Topic.
  2. Создадим SNS Topic с помощью Terraform.
  3. Удалим созданную тему с помощью 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.tf
File: main.tf
provider "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.tfvars
File: terraform.tfvars
access_key = ""
secret_key = ""

Определения переменных находятся в variables.tf — задайте там account_id и при желании имя темы sns_name.

Github Link:
https://github.com/shivalkarrahul/DevOps/blob/master/aws/terraform/create-sns-topic/variables.tf
File: variables.tf
variable "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.

  1. Инициализация рабочего каталога — загружает провайдеры и модули:
terraform init

Вывод команды terraform init в консоли

  1. Создание плана — показывает, какие ресурсы будут созданы или изменены:
terraform plan

Результат terraform plan — план изменений

  1. Применение изменений — создаёт SNS topic и привязанную политику:
terraform apply

terraform apply — создание темы SNS в AWS

После успешного выполнения вы можете подтвердить создание темы в AWS Console (SNS).

Консоль AWS: созданная тема SNS

Удаление ресурса

Когда тема больше не нужна, удалите её командой:

terraform destroy

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

Вывод terraform destroy — удаление ресурсов

Рекомендации по безопасности и лучшие практики

  • Минимизируйте права: в 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 и проверяйте, какие изменения будут внесены.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро