建立 Amazon SNS 主題 - Amazon Simple Notification Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

建立 Amazon SNS 主題

Amazon SNS 主題是做為通訊頻道的邏輯存取點。主題可讓您將多個端點 (例如 AWS Lambda Amazon SQS、HTTP/S 或電子郵件地址) 分組。

若要廣播訊息生產者系統 (例如,電子商務網站) 的訊息,而此系統會搭配需要其訊息的其他多個服務 (例如,結帳和履行系統),您可以為生產者系統建立主題。

第一個最常見的 Amazon SNS 任務是建立主題。此頁面說明如何使用 AWS Management Console、 AWS SDK for Java和 AWS SDK for .NET 來建立主題。

在建立期間,您可以選擇主題類型 (標準或 FIFO) 並命名主題。建立主題後,即無法變更主題類型或名稱。所有其他組態選項在建立主題期間都是可選的,您可以稍後編輯它們。

重要

請勿在主題名稱中新增個人身分識別資訊 (PII) 或其他機密或敏感資訊。包括 CloudWatch Logs 在內的其他 Amazon Web Services 可存取主題名稱。主題名稱不適用於私有或敏感資料。

使用 建立主題 AWS Management Console

在 Amazon SNS 中建立主題可建立訊息分發的基礎,讓您能夠發佈可發散給多個訂閱用戶的訊息。此步驟對於設定主題的類型、加密設定和存取政策至關重要,可確保主題符合組織的安全性、合規性和操作需求。

  1. 登入 Amazon SNS 主控台

  2. 執行以下任意一項:

    • 如果 AWS 帳戶 之前沒有在您的 下建立主題,請閱讀首頁上的 Amazon SNS 說明。

    • 如果主題先前已在 下建立 AWS 帳戶 ,請在導覽面板上選擇主題

  3. 主題頁面上,選擇建立主題

  4. Create topic (建立主題) 頁面上,於 Details (詳細資訊) 區段中,執行以下作業:

    1. 對於 Type (類型),選擇主題類型 (Standard (標準)或FIFO

    2. 輸入新主題的名稱。對於FIFO 主題,新增.fifo到名稱的結尾。

    3. (選用) 為主題輸入 Display name (顯示名稱)。

      重要

      訂閱電子郵件端點時,Amazon SNS 主題顯示名稱和傳送電子郵件地址 (例如 no-reply@sns.amazonaws.com) 的組合字元計數不得超過 320 個 UTF-8 字元。在為 Amazon SNS 主題設定顯示名稱之前,您可以使用第三方編碼工具來驗證傳送地址的長度。

    4. (選用) 對於 FIFO 主題,您可以選擇內容型訊息重複資料刪除功能,以啟用預設的重複訊息刪除功能。如需詳細資訊,請參閱FIFO 主題的 Amazon SNS 訊息重複資料刪除

  5. (選用) 展開 Encryption (加密) 區段並執行下列動作。如需詳細資訊,請參閱使用伺服器端加密保護 Amazon SNS 資料

    1. 選擇 Enable encryption (啟用加密)。

    2. 指定 AWS KMS 金鑰。如需詳細資訊,請參閱重要用語

      每個 KMS 類型均會顯示 Description (描述)Account (帳戶)KMS ARN

      重要

      若您並非 KMS 的擁有者,或者您登入的帳戶並無 kms:ListAliaseskms:DescribeKey 的許可,即無法在 Amazon SNS 主控台上檢視 KMS 相關資訊。

      請要求 KMS 的擁有者授與您這些許可。如需詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的AWS KMS API 許可:動作和資源參考

      • 預設會選取 Amazon SNS (預設) alias/aws/sns 的 AWS 受管 KMS。

        注意

        請謹記以下幾點:

        • 第一次使用 AWS Management Console 為主題指定 Amazon SNS 的 AWS 受管 KMS 時, 會 AWS KMS 建立 Amazon SNS 的受 AWS 管 KMS。

        • 或者,當您第一次在已啟用 SSE 的主題上使用 Publish動作時, 會 AWS KMS 建立 Amazon SNS 的 AWS 受管 KMS。

      • 若要從 AWS 您的帳戶使用自訂 KMS,請選擇 KMS 金鑰欄位,然後從清單中選擇自訂 KMS。

        注意

        如需建立自訂 KMS 的說明,請參閱 AWS Key Management Service 開發人員指南中的建立金鑰

      • 若要從您的帳戶或其他 AWS 帳戶使用自訂 KMS ARN AWS ,請在 KMS 金鑰欄位中輸入它。

  6. (選用) 根據預設,只有主題擁有者可以發布或訂閱主題。若要設定其他存取許可,請展開 Access policy (存取政策) 區段。如需詳細資訊,請參閱 Amazon SNS 中的 Identity and Access ManagementAmazon SNS 存取控制的範例案例

    注意

    當您使用主控台建立主題時,預設政策會使用 aws:SourceOwner 條件金鑰。此金鑰類似於 aws:SourceAccount

  7. (選用) 若要設定 Amazon SNS 如何在訊息傳遞嘗試失敗後重試,請展開 Delivery retry policy (HTTP/S) (傳遞重試政策 (HTTP/S)) 區段。如需詳細資訊,請參閱Amazon SNS 訊息傳遞重試

  8. (選用) 若要設定 Amazon SNS 如何將訊息傳遞情形記錄到 CloudWatch,請展開 Delivery status logging (傳遞狀態記錄) 區段。如需詳細資訊,請參閱Amazon SNS 訊息傳遞狀態

  9. (選用) 若要將中繼資料標籤新增至主題,請展開 Tags (標籤) 區段,輸入 Key(金鑰) 和 Value (值) (選用),然後選擇 Add tag (新增標籤)。如需詳細資訊,請參閱Amazon SNS 主題標記

  10. 請選擇建立主題

    該主題隨即建立,並且 MyTopic 頁面即會顯示。

    主題的名稱ARN、(選用) 顯示名稱主題擁有者 AWS 的帳戶 ID 會顯示在詳細資訊區段中。

  11. 將主題 ARN 複製到剪貼簿,例如:

    arn:aws:sns:us-east-2:123456789012:MyTopic

使用 AWS SDK 建立主題

若要使用 AWS SDK,您必須使用 登入資料進行設定。如需詳細資訊,請參閱 AWS SDK和工具參考指南中的共享的配置和認證文件

下列程式碼範例示範如何使用 CreateTopic

.NET
AWS SDK for .NET
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

建立具有特定名稱的主題。

using System; using System.Threading.Tasks; using Amazon.SimpleNotificationService; using Amazon.SimpleNotificationService.Model; /// <summary> /// This example shows how to use Amazon Simple Notification Service /// (Amazon SNS) to add a new Amazon SNS topic. /// </summary> public class CreateSNSTopic { public static async Task Main() { string topicName = "ExampleSNSTopic"; IAmazonSimpleNotificationService client = new AmazonSimpleNotificationServiceClient(); var topicArn = await CreateSNSTopicAsync(client, topicName); Console.WriteLine($"New topic ARN: {topicArn}"); } /// <summary> /// Creates a new SNS topic using the supplied topic name. /// </summary> /// <param name="client">The initialized SNS client object used to /// create the new topic.</param> /// <param name="topicName">A string representing the topic name.</param> /// <returns>The Amazon Resource Name (ARN) of the created topic.</returns> public static async Task<string> CreateSNSTopicAsync(IAmazonSimpleNotificationService client, string topicName) { var request = new CreateTopicRequest { Name = topicName, }; var response = await client.CreateTopicAsync(request); return response.TopicArn; } }

建立具有名稱、特定 FIFO 和重複資料刪除屬性的新主題。

/// <summary> /// Create a new topic with a name and specific FIFO and de-duplication attributes. /// </summary> /// <param name="topicName">The name for the topic.</param> /// <param name="useFifoTopic">True to use a FIFO topic.</param> /// <param name="useContentBasedDeduplication">True to use content-based de-duplication.</param> /// <returns>The ARN of the new topic.</returns> public async Task<string> CreateTopicWithName(string topicName, bool useFifoTopic, bool useContentBasedDeduplication) { var createTopicRequest = new CreateTopicRequest() { Name = topicName, }; if (useFifoTopic) { // Update the name if it is not correct for a FIFO topic. if (!topicName.EndsWith(".fifo")) { createTopicRequest.Name = topicName + ".fifo"; } // Add the attributes from the method parameters. createTopicRequest.Attributes = new Dictionary<string, string> { { "FifoTopic", "true" } }; if (useContentBasedDeduplication) { createTopicRequest.Attributes.Add("ContentBasedDeduplication", "true"); } } var createResponse = await _amazonSNSClient.CreateTopicAsync(createTopicRequest); return createResponse.TopicArn; }
  • 如需 API 詳細資訊,請參閱 AWS SDK for .NET API 參考中的 CreateTopic

C++
適用於 C++ 的 SDK
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

//! Create an Amazon Simple Notification Service (Amazon SNS) topic. /*! \param topicName: An Amazon SNS topic name. \param topicARNResult: String to return the Amazon Resource Name (ARN) for the topic. \param clientConfiguration: AWS client configuration. \return bool: Function succeeded. */ bool AwsDoc::SNS::createTopic(const Aws::String &topicName, Aws::String &topicARNResult, const Aws::Client::ClientConfiguration &clientConfiguration) { Aws::SNS::SNSClient snsClient(clientConfiguration); Aws::SNS::Model::CreateTopicRequest request; request.SetName(topicName); const Aws::SNS::Model::CreateTopicOutcome outcome = snsClient.CreateTopic(request); if (outcome.IsSuccess()) { topicARNResult = outcome.GetResult().GetTopicArn(); std::cout << "Successfully created an Amazon SNS topic " << topicName << " with topic ARN '" << topicARNResult << "'." << std::endl; } else { std::cerr << "Error creating topic " << topicName << ":" << outcome.GetError().GetMessage() << std::endl; topicARNResult.clear(); } return outcome.IsSuccess(); }
  • 如需 API 詳細資訊,請參閱《AWS SDK for C++ API 參考》中的 CreateTopic

CLI
AWS CLI

建立 SNS 主題

下列 create-topic 範例會建立名為 my-topic 的 SNS 主題。

aws sns create-topic \ --name my-topic

輸出:

{ "ResponseMetadata": { "RequestId": "1469e8d7-1642-564e-b85d-a19b4b341f83" }, "TopicArn": "arn:aws:sns:us-west-2:123456789012:my-topic" }

如需詳細資訊,請參閱《 AWS 命令列界面使用者指南》中的搭配 Amazon SQS 和 Amazon SNS 使用命令列界面。 AWS

  • 如需 API 詳細資訊,請參閱《AWS CLI 命令參考》中的 CreateTopic

Go
SDK for Go V2
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

import ( "context" "encoding/json" "log" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/sns" "github.com/aws/aws-sdk-go-v2/service/sns/types" ) // SnsActions encapsulates the Amazon Simple Notification Service (Amazon SNS) actions // used in the examples. type SnsActions struct { SnsClient *sns.Client } // CreateTopic creates an Amazon SNS topic with the specified name. You can optionally // specify that the topic is created as a FIFO topic and whether it uses content-based // deduplication instead of ID-based deduplication. func (actor SnsActions) CreateTopic(ctx context.Context, topicName string, isFifoTopic bool, contentBasedDeduplication bool) (string, error) { var topicArn string topicAttributes := map[string]string{} if isFifoTopic { topicAttributes["FifoTopic"] = "true" } if contentBasedDeduplication { topicAttributes["ContentBasedDeduplication"] = "true" } topic, err := actor.SnsClient.CreateTopic(ctx, &sns.CreateTopicInput{ Name: aws.String(topicName), Attributes: topicAttributes, }) if err != nil { log.Printf("Couldn't create topic %v. Here's why: %v\n", topicName, err) } else { topicArn = *topic.TopicArn } return topicArn, err }
  • 如需 API 詳細資訊,請參閱 適用於 Go 的 AWS SDK API 參考中的 CreateTopic

Java
SDK for Java 2.x
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.CreateTopicRequest; import software.amazon.awssdk.services.sns.model.CreateTopicResponse; import software.amazon.awssdk.services.sns.model.SnsException; /** * Before running this Java V2 code example, set up your development * environment, including your credentials. * * For more information, see the following documentation topic: * * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html */ public class CreateTopic { public static void main(String[] args) { final String usage = """ Usage: <topicName> Where: topicName - The name of the topic to create (for example, mytopic). """; if (args.length != 1) { System.out.println(usage); System.exit(1); } String topicName = args[0]; System.out.println("Creating a topic with name: " + topicName); SnsClient snsClient = SnsClient.builder() .region(Region.US_EAST_1) .build(); String arnVal = createSNSTopic(snsClient, topicName); System.out.println("The topic ARN is" + arnVal); snsClient.close(); } public static String createSNSTopic(SnsClient snsClient, String topicName) { CreateTopicResponse result; try { CreateTopicRequest request = CreateTopicRequest.builder() .name(topicName) .build(); result = snsClient.createTopic(request); return result.topicArn(); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; } }
  • 如需 API 詳細資訊,請參閱《AWS SDK for Java 2.x API 參考》中的 CreateTopic

JavaScript
SDK for JavaScript (v3)
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

在單獨的模組中建立用戶端並將其匯出。

import { SNSClient } from "@aws-sdk/client-sns"; // The AWS Region can be provided here using the `region` property. If you leave it blank // the SDK will default to the region set in your AWS config. export const snsClient = new SNSClient({});

匯入 SDK 和用戶端模組,然後呼叫 API。

import { CreateTopicCommand } from "@aws-sdk/client-sns"; import { snsClient } from "../libs/snsClient.js"; /** * @param {string} topicName - The name of the topic to create. */ export const createTopic = async (topicName = "TOPIC_NAME") => { const response = await snsClient.send( new CreateTopicCommand({ Name: topicName }), ); console.log(response); // { // '$metadata': { // httpStatusCode: 200, // requestId: '087b8ad2-4593-50c4-a496-d7e90b82cf3e', // extendedRequestId: undefined, // cfId: undefined, // attempts: 1, // totalRetryDelay: 0 // }, // TopicArn: 'arn:aws:sns:us-east-1:xxxxxxxxxxxx:TOPIC_NAME' // } return response; };
Kotlin
SDK for Kotlin
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

suspend fun createSNSTopic(topicName: String): String { val request = CreateTopicRequest { name = topicName } SnsClient { region = "us-east-1" }.use { snsClient -> val result = snsClient.createTopic(request) return result.topicArn.toString() } }
PHP
SDK for PHP
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

require 'vendor/autoload.php'; use Aws\Exception\AwsException; use Aws\Sns\SnsClient; /** * Create a Simple Notification Service topics in your AWS account at the requested region. * * This code expects that you have AWS credentials set up per: * https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html */ $SnSclient = new SnsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => '2010-03-31' ]); $topicname = 'myTopic'; try { $result = $SnSclient->createTopic([ 'Name' => $topicname, ]); var_dump($result); } catch (AwsException $e) { // output error message if fails error_log($e->getMessage()); }
Python
SDK for Python (Boto3)
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

class SnsWrapper: """Encapsulates Amazon SNS topic and subscription functions.""" def __init__(self, sns_resource): """ :param sns_resource: A Boto3 Amazon SNS resource. """ self.sns_resource = sns_resource def create_topic(self, name): """ Creates a notification topic. :param name: The name of the topic to create. :return: The newly created topic. """ try: topic = self.sns_resource.create_topic(Name=name) logger.info("Created topic %s with ARN %s.", name, topic.arn) except ClientError: logger.exception("Couldn't create topic %s.", name) raise else: return topic
  • 如需 API 詳細資訊,請參閱 AWS SDK for Python (Boto3) API 參考中的 CreateTopic

Ruby
SDK for Ruby
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

# This class demonstrates how to create an Amazon Simple Notification Service (SNS) topic. class SNSTopicCreator # Initializes an SNS client. # # Utilizes the default AWS configuration for region and credentials. def initialize @sns_client = Aws::SNS::Client.new end # Attempts to create an SNS topic with the specified name. # # @param topic_name [String] The name of the SNS topic to create. # @return [Boolean] true if the topic was successfully created, false otherwise. def create_topic(topic_name) @sns_client.create_topic(name: topic_name) puts "The topic '#{topic_name}' was successfully created." true rescue Aws::SNS::Errors::ServiceError => e # Handles SNS service errors gracefully. puts "Error while creating the topic named '#{topic_name}': #{e.message}" false end end # Example usage: if $PROGRAM_NAME == __FILE__ topic_name = 'YourTopicName' # Replace with your topic name sns_topic_creator = SNSTopicCreator.new puts "Creating the topic '#{topic_name}'..." unless sns_topic_creator.create_topic(topic_name) puts 'The topic was not created. Stopping program.' exit 1 end end
Rust
SDK for Rust
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

async fn make_topic(client: &Client, topic_name: &str) -> Result<(), Error> { let resp = client.create_topic().name(topic_name).send().await?; println!( "Created topic with ARN: {}", resp.topic_arn().unwrap_or_default() ); Ok(()) }
  • 如需 API 詳細資訊,請參閱適用於 Rust API 的AWS SDK 參考中的 CreateTopic

SAP ABAP
適用於 SAP ABAP 的開發套件
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

TRY. oo_result = lo_sns->createtopic( iv_name = iv_topic_name ). " oo_result is returned for testing purposes. " MESSAGE 'SNS topic created' TYPE 'I'. CATCH /aws1/cx_snstopiclimitexcdex. MESSAGE 'Unable to create more topics. You have reached the maximum number of topics allowed.' TYPE 'E'. ENDTRY.
  • 如需 API 詳細資訊,請參閱《適用於 SAP ABAP API 的AWS SDK 參考》中的 CreateTopic

Swift
SDK for Swift
注意

GitHub 上提供更多範例。尋找完整範例,並了解如何在 AWS 程式碼範例儲存庫中設定和執行。

let config = try await SNSClient.SNSClientConfiguration(region: region) let snsClient = SNSClient(config: config) let output = try await snsClient.createTopic( input: CreateTopicInput(name: name) ) guard let arn = output.topicArn else { print("No topic ARN returned by Amazon SNS.") return }
  • 如需 API 詳細資訊,請參閱 AWS SDK for Swift API 參考中的 CreateTopic