Terraform 0.11

aws_sns_topic_subscription




terraform

aws_sns_topic_subscription

एसएनएस विषयों की सदस्यता के लिए एक संसाधन प्रदान करता है। संलग्न करने के लिए सदस्यता के लिए एक SNS विषय मौजूद है। यह संसाधन आपको SQS कतारों में SNS विषयों पर भेजे गए संदेशों को स्वचालित रूप से रखने की अनुमति देता है, उन्हें HTTP (S) किसी दिए गए अंतिम बिंदु के लिए POST अनुरोध, एसएमएस संदेश भेजने, या डिवाइस / एप्लिकेशन को सूचित करने की अनुमति देता है। Terraform उपयोगकर्ताओं के लिए सबसे अधिक संभावना उपयोग मामला संभवतः SQS कतार होगा।

उदाहरण उपयोग

आप सीधे पंक्ति में एक विषय और ARN की आपूर्ति कर सकते हैं

resource "aws_sns_topic_subscription" "user_updates_sqs_target" {
  topic_arn = "arn:aws:sns:us-west-2:432981146916:user-updates-topic"
  protocol  = "sqs"
  endpoint  = "arn:aws:sqs:us-west-2:432981146916:terraform-queue-too"
}

वैकल्पिक रूप से आप प्रबंधित SNS विषय और SQS कतार के ARN गुणों का उपयोग कर सकते हैं:

resource "aws_sns_topic" "user_updates" {
  name = "user-updates-topic"
}

resource "aws_sqs_queue" "user_updates_queue" {
  name = "user-updates-queue"
}

resource "aws_sns_topic_subscription" "user_updates_sqs_target" {
  topic_arn = "${aws_sns_topic.user_updates.arn}"
  protocol  = "sqs"
  endpoint  = "${aws_sqs_queue.user_updates_queue.arn}"
}

आप विभिन्न Amazon खातों और क्षेत्रों में SQS कतारों में SNS विषयों की सदस्यता ले सकते हैं:

/*
#
# Variables
#
*/
variable "sns" {
  default = {
    account-id    = "111111111111"
    role-name     = "service/service-hashicorp-terraform"
    name          = "example-sns-topic"
    display_name  = "example"
    region        = "us-west-1"
  }
}

variable "sqs" {
  default = {
    account-id    = "222222222222"
    role-name     = "service/service-hashicorp-terraform"
    name          = "example-sqs-queue"
    region        = "us-east-1"
  }
}

data "aws_iam_policy_document" "sns-topic-policy" {
  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.sns["account-id"]}",
      ]
    }

    effect = "Allow"

    principals {
      type        = "AWS"
      identifiers = ["*"]
    }

    resources = [
      "arn:aws:sns:${var.sns["region"]}:${var.sns["account-id"]}:${var.sns["name"]}",
    ]

    sid = "__default_statement_ID"
  }

  statement {
    actions = [
      "SNS:Subscribe",
      "SNS:Receive",
    ]

    condition {
      test     = "StringLike"
      variable = "SNS:Endpoint"

      values = [
        "arn:aws:sqs:${var.sqs["region"]}:${var.sqs["account-id"]}:${var.sqs["name"]}",
      ]
    }

    effect = "Allow"

    principals {
      type        = "AWS"
      identifiers = ["*"]
    }

    resources = [
      "arn:aws:sns:${var.sns["region"]}:${var.sns["account-id"]}:${var.sns["name"]}",
    ]

    sid = "__console_sub_0"
  }
}

data "aws_iam_policy_document" "sqs-queue-policy" {
  policy_id = "arn:aws:sqs:${var.sqs["region"]}:${var.sqs["account-id"]}:${var.sqs["name"]}/SQSDefaultPolicy"

  statement {
    sid    = "example-sns-topic"
    effect = "Allow"

    principals {
      type        = "AWS"
      identifiers = ["*"]
    }

    actions = [
      "SQS:SendMessage",
    ]

    resources = [
      "arn:aws:sqs:${var.sqs["region"]}:${var.sqs["account-id"]}:${var.sqs["name"]}",
    ]

    condition {
      test     = "ArnEquals"
      variable = "aws:SourceArn"

      values = [
        "arn:aws:sns:${var.sns["region"]}:${var.sns["account-id"]}:${var.sns["name"]}",
      ]
    }
  }
}

# provider to manage SNS topics
provider "aws" {
  alias  = "sns"
  region = "${var.sns["region"]}"

  assume_role {
    role_arn     = "arn:aws:iam::${var.sns["account-id"]}:role/${var.sns["role-name"]}"
    session_name = "sns-${var.sns["region"]}"
  }
}

# provider to manage SQS queues
provider "aws" {
  alias  = "sqs"
  region = "${var.sqs["region"]}"

  assume_role {
    role_arn     = "arn:aws:iam::${var.sqs["account-id"]}:role/${var.sqs["role-name"]}"
    session_name = "sqs-${var.sqs["region"]}"
  }
}

# provider to subscribe SQS to SNS (using the SQS account but the SNS region)
provider "aws" {
  alias  = "sns2sqs"
  region = "${var.sns["region"]}"

  assume_role {
    role_arn     = "arn:aws:iam::${var.sqs["account-id"]}:role/${var.sqs["role-name"]}"
    session_name = "sns2sqs-${var.sns["region"]}"
  }
}

resource "aws_sns_topic" "sns-topic" {
  provider     = "aws.sns"
  name         = "${var.sns["name"]}"
  display_name = "${var.sns["display_name"]}"
  policy       = "${data.aws_iam_policy_document.sns-topic-policy.json}"
}

resource "aws_sqs_queue" "sqs-queue" {
  provider = "aws.sqs"
  name     = "${var.sqs["name"]}"
  policy   = "${data.aws_iam_policy_document.sqs-queue-policy.json}"
}

resource "aws_sns_topic_subscription" "sns-topic" {
  provider  = "aws.sns2sqs"
  topic_arn = "${aws_sns_topic.sns-topic.arn}"
  protocol  = "sqs"
  endpoint  = "${aws_sqs_queue.sqs-queue.arn}"
}

तर्क संदर्भ

निम्नलिखित तर्क समर्थित हैं:

  • topic_arn - (आवश्यक) सदस्यता लेने के लिए SNS विषय का ARN
  • protocol - (आवश्यक) प्रोटोकॉल का उपयोग करने के लिए। इसके लिए संभावित मूल्य हैं: sqs , sms , sqs , application । ( http या https आंशिक रूप से समर्थित हैं, नीचे देखें) ( email विकल्प है लेकिन असमर्थित है, नीचे देखें)।
  • endpoint - (आवश्यक) डेटा भेजने के लिए एंडपॉइंट, सामग्री प्रोटोकॉल के साथ अलग-अलग होगी। (अधिक जानकारी के लिए नीचे देखें)
  • endpoint_auto_confirms - (वैकल्पिक) बूलियन यह दर्शाता है कि क्या अंतिम बिंदु सदस्यता की पुष्टि करने में सक्षम ऑटो है जैसे, पेजडूट (डिफ़ॉल्ट गलत है)
  • confirm_timeout_in_minutes - (वैकल्पिक) पूर्णांक को विफलता के रूप में चिह्नित करने से पहले सदस्यता प्राप्त करने के लिए पुन: मोड में प्रतीक्षा करने के लिए मिनटों की संख्या का संकेत देता है। केवल http और https प्रोटोकॉल के लिए लागू है (डिफ़ॉल्ट 1 मिनट है)।
  • raw_message_delivery - (वैकल्पिक) बूलियन यह दर्शाता है कि कच्चे संदेश वितरण को सक्षम करने या न करने के लिए (मूल संदेश सीधे पारित किया जाता है, संदेश संपत्ति में मूल संदेश के साथ JSON में लपेटा नहीं गया है) (डिफ़ॉल्ट गलत है)।
  • filter_policy - (वैकल्पिक) विषय सदस्यता के लिए एक फ़िल्टर नीति का पाठ।

प्रोटोकॉल का समर्थन किया

समर्थित SNS प्रोटोकॉल में शामिल हैं:

  • lambda - एक लैम्ब्डा फ़ंक्शन के लिए JSON- एन्कोडेड संदेश की डिलीवरी
  • sqs - अमेज़न SQS कतार में JSON- एन्कोडेड संदेश का वितरण
  • application - मोबाइल एप्लिकेशन और डिवाइस के लिए एंडपॉइंट के लिए JSON- एन्कोडेड संदेश की डिलीवरी
  • sms - वितरण पाठ संदेश

आंशिक रूप से समर्थित SNS प्रोटोकॉल में शामिल हैं:

  • http - HTTP के माध्यम से JSON- एन्कोडेड संदेशों की डिलीवरी। केवल अंत बिंदुओं के लिए समर्थित है जो ऑटो सदस्यता की पुष्टि करता है।
  • https - HTTPS के माध्यम से JSON- एन्कोडेड संदेशों की डिलीवरी। केवल अंत बिंदुओं के लिए समर्थित है जो ऑटो सदस्यता की पुष्टि करता है।

असमर्थित प्रोटोकॉल में निम्नलिखित शामिल हैं:

  • email - एसएमटीपी के माध्यम से संदेश का वितरण
  • email-json - एसएमटीपी के माध्यम से JSON- एन्कोडेड संदेश का वितरण

ये असमर्थित हैं क्योंकि समापन बिंदु को अधिकृत करने की आवश्यकता है और जब तक लक्ष्य ईमेल पते को मान्य नहीं किया गया है तब तक ARN उत्पन्न नहीं होता है। यह टेराफॉर्म मॉडल को तोड़ता है और परिणामस्वरूप वर्तमान में समर्थित नहीं है।

समापन बिंदु निर्दिष्ट करना

एंडपॉइंट्स को चुने गए प्रोटोकॉल के अनुसार अलग-अलग प्रारूप की आवश्यकताएं हैं।

  • SQS समापन बिंदु SQS कतार के ARN (कतार का URL नहीं) के रूप में आते हैं जैसे: arn:aws:sqs:us-west-2:432981146916:terraform-queue-too
  • एप्लिकेशन एंडपॉइंट भी मोबाइल ऐप और डिवाइस के लिए एंडपॉइंट एआरएन हैं।

संदर्भ संदर्भित करता है

उपरोक्त सभी तर्कों के अलावा, निम्नलिखित विशेषताएँ निर्यात की जाती हैं:

  • id - सदस्यता का एआरएन
  • topic_arn - topic_arn का ARN topic_arn संबंधित है
  • protocol - प्रोटोकॉल का उपयोग किया जा रहा है
  • endpoint - (एसक्यूएस एआरएन, एचटीटीपी (एस) यूआरएल, एप्लीकेशन एआरएन, एसएमएस, आदि) को डेटा भेजने के लिए पूर्ण समापन बिंदु।
  • arn - सदस्यता का ARN अधिक उपयोगकर्ता के अनुकूल संपत्ति के रूप में संग्रहीत

आयात

SNS विषय सदस्यता subscription arn , जैसे का उपयोग कर आयात किया जा सकता है

$ terraform import aws_sns_topic_subscription.user_updates_sqs_target arn:aws:sns:us-west-2:0123456789012:my-topic:8a21d249-4329-4871-acc6-7be709c6ea7f