建立 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 帳戶 之前沒有在您的 下建立任何主題,請閱讀首頁SNS上的 Amazon 說明。

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

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

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

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

    2. 輸入新主題的 名稱 (Name)。對於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類型,KMSARN都會顯示描述 帳戶 和 。

      重要

      如果您不是 的擁有者KMS,或者如果您使用沒有 kms:ListAliaseskms:DescribeKey許可的帳戶登入,您將無法在 Amazon SNS主控台KMS上檢視 的相關資訊。

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

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

        注意

        請謹記以下幾點:

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

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

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

        注意

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

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

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

    注意

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

  7. (選用) 若要設定 Amazon SNS 重試訊息傳遞嘗試失敗的方式,請展開傳遞重試政策 (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 SDKs 工具參考指南 中的共用組態和憑證檔案

下列程式碼範例示範如何使用 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詳細資訊,請參閱 參考 CreateTopic中的 。 AWS SDK for .NET API

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

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

CLI
AWS CLI

建立 SNS 主題

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

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 搭配使用SNSAWS

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

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

Java
SDK 適用於 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詳細資訊,請參閱 參考 CreateTopic中的 。 AWS SDK for Java 2.x API

JavaScript
SDK 適用於 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 適用於 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() } }
  • 如需API詳細資訊,請參閱CreateTopic中的 AWS SDK for Kotlin API參考

PHP
適用於 PHP 的 SDK
注意

還有更多 。 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詳細資訊,請參閱 CreateTopic 中的 AWS SDK for Python (Boto3) API參考

Ruby
SDK 適用於 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詳細資訊,請參閱 CreateTopic 中的 AWS SDK for Rust API參考

SAP ABAP
SDK 適用於 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詳細資訊,請參閱CreateTopic中的 AWS SDK 以取得SAPABAPAPI參考