建立 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) 或其他機密或敏感資訊。主題名稱可供其他 Amazon Web Services 存取,包括 CloudWatch 日誌。主題名稱不適用於私有或敏感資料。

若要使用建立主題 AWS Management Console

  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 主題的重複訊息刪除

  5. (選用) 展開 Encryption (加密) 區段並執行下列動作。如需詳細資訊,請參閱 靜態加密

    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 的 AWS 受管理 KMS (預設) 別名/AWS/SNS

        注意

        請謹記以下幾點:

        • 當您第一次使用 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 帳戶或其他 AWS 帳戶使用自訂 KMS ARN,請在 KMS 金鑰欄位中輸入該自訂 KMS ARN。

  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,請展開交付狀態記錄區段。如需詳細資訊,請參閱 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 設定和執行程式碼範例儲存庫

// 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(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(context.TODO(), &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 詳細資訊,請參閱 AWS SDK for Go API 參考CreateTopic中的。

Java
適用於 Java 2.x 的 SDK
注意

還有更多關於 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
適用於 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
適用於 Kotlin 的 SDK
注意

還有更多關於 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() } }
  • 有關 API 的詳細信息,請參閱 AWS SDK CreateTopic中的 Kotlin API 參考。

PHP
適用於 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
適用於 Python (Boto3) 的 SDK
注意

還有更多關於 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 開發套件CreateTopic中的 Python (博托 3) API 參考。

Ruby
適用於 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
適用於 Rust 的 SDK
注意

還有更多關於 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 的詳細資訊,請參閱 AWS SDK CreateTopic中的 Rust API 參考資料。

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 詳細資訊,請參閱 AWS SDK CreateTopic中的 SAP ABAP API 參考資料。