Рубрики
Uncategorized

LifeSaver: предотвратить подписки AWS SNS, чтобы стать «плавать»

TL; DR Когда тема SNS (случайно) удалена, когда все еще удерживая подписки, те … помечены облаком, AWS, DEVOPS, архитектурой.

TL; доктор

Когда тема SNS (случайно) удалена во время проведения подписок, эти подписки станут «плавать» и больше не получат трафик. Это проблема без простого исправления с потенциально довольно каким-том. Эта статья предлагает решение для мониторинга и предотвращения этого.

Шаблон

Те, кто знаком с AWS SNS, знает, что это общий шаблон, чтобы иметь тему Sns, проживающую в одном счете, в то время как подписка проживает в другом. В таком случае у вас есть разделяемая модель ответственности, которая выглядит как следующее:

Это обязанности для каждого ресурса:

  • Владелец темы (аккаунт х) : Отвечает за управление темой SNS и политику темы, чтобы разрешить подписки (с других учетных записей).
  • Подписчики (аккаунт Y) Управляйте самой подпиской. Подписки могут существовать в счетах, которые отличаются от текущей учетной записи. Подписчик полностью отвечает за управление подпиской.

Что такое «плавающие» подписки?

Если вы используете SNS, то шансы большие, что вы уже наткнулись на явление, которое мне нравится называть «плавающие» подписки. Видите ли, когда тема (случайно) удаляется, не удаляя все свои подписки, остальные подписки станут «плавать». Что это значит, что подписка будет сохранять существующие Но это больше не будет получать трафик. Это связано с этим моментом, подписка больше не связана с темой.

Сторона Примечание. Особенно при использовании инфраструктуры в качестве кода иногда легко неправильно проверить результаты изменения кода. Переименование ресурса в облачном отформации может привести к полной замене ресурсов на заднем плане. Это, на свою очередь, может привести к противным побочным эффектам (как потерянная подписка). Большую часть времени, которое то, что вы изучите трудный путь. 😉

Не так неловкое поведение?

Первый раз я столкнулся с «плавающей» подпиской, я не мог поверить, что происходит. Дайвинг глубже, я был удивлен, чтобы обнаружить, что он ожидается поведение. Однако, как только вы дадите ей вторую мысль, легко понять, почему поведение реализуется таким образом. Особенно в настройке нескольких учетных записей было бы невообразимо, что ресурс (в этом случае подписка) у вас нет, будет удален с учетной записи, которую вы не управляете. Таким образом, лучшие AWS могут сделать, когда вы удаляете тему с прикрепленными подписками, это просто разрезать подключенные провода.

Влияние

Яд «плавающей» подписки заключается в том, что он часто остается под радаром в течение довольно некоторого времени.

В случае случайного делеции темы вещи еще хуже. Нет волшебного исправления, чтобы перевесить плавающие подписки, напротив, Нет никакого способа запросить подписки, связанные с несуществующими темами Отказ Кроме того, вам понадобится помощь всех потребителей, чтобы воссоздать подписки, чтобы вытащить вас из болота.

Сетка безопасности

Прежде всего, потребитель должен всегда следить за количеством входящих сообщений для своих подписок. Если возможно, он также должен создать предупреждение, когда количество входящих сообщений падает до нуля в течение определенного периода. Как отделение темы, это хорошая привычка для создания этой осведомленности всякий раз, когда вы открываете политику темы, чтобы позволить подписки.

Лучший способ предотвратить «плавающие» подписки — затвердевает делецию темы. Для достижения этого добавить Deny-Delete к политике темы (это блоки IAC, CLI и веб-консоль):

"PolicyDocument" : {
  "Version": "2008-10-17",
  "Statement": [
    ...
    {
      "Sid": "DenyDeleteTopic",
      "Effect": "Deny",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "sns:DeleteTopic"
      ],
      "Resource": "*"
    }

В облачном отформации это выглядит так:

  SomeSnsTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      Topics:
        - !Ref SomeSnsTopic
      PolicyDocument:
        Id: SomeSnsTopicPolicy
        Version: '2012-10-17'
        Statement:
          - Sid : deny-delete-topic
            Effect: Deny
            Principal:
              AWS: "*"
            Resource: "*"
            Action: sns:DeleteTopic

Если вы используете облачность, есть две другие возможности. Эти решения также указывают на труднодоступное удаление темы из облачной информации, но они не предлагают защиты для удаления, срабатываемой веб-консолью или CLI.

Вариант 1: предотвратить обновление и удаление, используя UpdatereAnePolicy и Делитицироватьpolicy атрибут по ресурсам облака.

  SomeSnsTopic:
    Type: AWS::SNS::Topic
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Properties:
      DisplayName: Some SNS Topic
      TopicName: some-topic-name

Вариант 2: предотвратить обновление и удаление с помощью политики стека.

{
  "Statement" : [
    {
      "Effect" : "Deny",
      "Action" : ["Update:Replace", "Update:Delete"],
      "Principal": "*",
      "Resource" : "*",
      "Condition" : {
        "StringEquals" : {
          "ResourceType" : ["AWS::SNS::Topic"]
        }
      }
    },
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    }
  ]
}

Итак, это многое безопасное сейчас 😄

Наслаждайтесь и до следующего раза!

Оригинал: «https://dev.to/aws-builders/a-lifesaver-prevent-aws-sns-subscriptions-to-become-floating-22oc»