LifeSaver:AWS SNSのサブスクリプションを防ぐには


TLドクター


SNSのトピックが(誤って)まだサブスクリプションを保持しながら削除されているときは、これらのサブスクリプションは'浮動小数点'になり、もはやトラフィックを受信しません.それは潜在的にかなりの影響を簡単に修正せずに問題です.この記事は、これが起こるのをモニターして、防ぐ解決を提供します.

模様


AWS SNSに精通している人々は、サブスクリプションが別のものにある間、それが1つの口座に住んでいるSNSトピックを持つ一般的なパターンであるということを知っています.このような場合、以下のような共有責任モデルがあります.

これらはそれぞれのリソースに対する責任です.

  • トピックの所有者(アカウントX):SNSトピックを管理するための責任とサブスクリプション(他のアカウントから)を許可するトピックポリシー.

  • 加入者(アカウントY)はサブスクリプション自体を管理します.サブスクリプションは、トピックアカウントとは異なるアカウントに存在することができます.加入者は完全にサブスクリプションを管理する責任があります.
  • どのようなフローティング'サブスクリプションですか?


    あなたがSNSを使うならば、チャンスは大きいです.あなたは、トピックが(誤って)最初にすべてのサブスクリプションを削除せずに削除された場合、残りのサブスクリプションは'浮動小数点'になります.これは何を意味するサブスクリプションが存在し続けるが、それはもはやトラフィックを受信しません.これは、その瞬間から、サブスクリプションはもはやトピックに接続されていないためです.

    側の注意:特にコードとしてインフラストラクチャを使用するとき、コード変更の結果をmispredictするのは時々簡単です.CloudFormationでリソースの名前を変更すると、バックグラウンドで完全なリソース置換を行うことができます.それは、そのターンでは、厄介な副作用(失われたサブスクリプションのような結果)することができます.あなたが難しい方法を学ぶ何かであるほとんどの時間.😉

    これは厄介な行動ではないか。


    初めて「フローティング」のサブスクリプションに出会った時、何が起こっているのか信じられなかった.ダイビングはより深く、私はそれが予想される行動であることを発見するために驚いた.しかし、あなたがそれを第2の考えを与えるとすぐに、ふるまいがこのように実行される理由を理解するのは簡単です.特にマルチアカウントの設定では、あなたが所有していないリソース(この場合、サブスクリプション)が管理していないアカウントから削除されます.ですから、購読されたサブスクリプションでトピックを削除するときには、AWSができるのは、単に接続されているワイヤを切断することです.

    衝撃


    'フローティング'サブスクリプションの毒は、それはしばしばいくつかの時間のためのレーダーの下に滞在することです.
    偶然の話題削除の場合には、事態はさらに悪いです.フローティングサブスクリプションを再配線するマジックフィックスはありません.反対に、存在しないトピックにリンクされたサブスクリプションをクエリする方法はありません.その上に、あなたは湿地からあなたを得るためにサブスクリプションを再現するためにすべての消費者の助けを必要とします.

    安全網


    まず第一に、消費者はいつも彼の購読のために着信メッセージの数をモニターしなければなりません.可能であれば、彼はまた、着信メッセージの量が一定期間の間ゼロになると警告を作成する必要があります.トピックの所有者として、サブスクリプションを許可するトピックポリシーを開くたびに、この意識を作成するのは良い習慣です.
    'フローティング'サブスクリプションを防ぐ最良の方法はトピック削除を厳しくすることです.これを実現するには、トピックのポリシーに対して拒否を削除します.
    "PolicyDocument" : {
      "Version": "2008-10-17",
      "Statement": [
        ...
        {
          "Sid": "DenyDeleteTopic",
          "Effect": "Deny",
          "Principal": {
            "AWS": "*"
          },
          "Action": [
            "sns:DeleteTopic"
          ],
          "Resource": "*"
        }
    
    Cloudformationではこうです.
      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
    
    あなたがCloudFormationを使用するならば、2つの他の可能性があります.これらの解決策はまた、CloudFormationの中からトピックを削除することを難しくしますが、WebコンソールまたはCLIによって引き起こされる削除に対する保護を提供しません.
    オプション1 : CloudFormationリソースのUpdateReplacePolicyDeletionPolicy属性を使用して更新と削除を防ぐ.
      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" : "*"
        }
      ]
    }
    
    だから、今はもっと安全です😄
    次回までお楽しみください!