Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 
      中国的 Amazon Web Services 服务入门
         (PDF)。
    本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
创建 Amazon SNS 主题
Amazon SNS 主题是一个逻辑访问点,可充当通信通道。主题允许您对多个终端节点(例如 Amazon SQS Amazon Lambda、HTTP/S 或电子邮件地址)进行分组。
要广播使用需要其消息的多个其他服务(例如,结算和执行系统)的消息创建器系统(例如,电子商务网站)的消息,您可以为创建器系统创建主题。
第一个也是最常见的 Amazon SNS 任务是创建主题。本页显示了如何使用 Amazon Web Services Management Console 适用于 Java 的 Amazon SDK、和, 适用于 .NET 的 Amazon SDK 来创建主题。
在创建过程中,您可以选择主题类型(标准或 FIFO)并命名主题。创建主题后,无法更改主题类型或名称。在创建主题期间,所有其他配置选项都是可选的,您可以稍后对其进行编辑。
请勿在主题名称中添加个人身份信息 (PII) 或其他机密或敏感信息。其他 Amazon Web Services 可以访问主题名称,包括 CloudWatch 日志。主题名称不适合用于私有或敏感数据。
 
		要使用创建主题 Amazon Web Services Management Console
		在 Amazon SNS 中创建主题为消息分发奠定了基础,使您能够发布可以扇出给多个订阅用户的消息。此步骤对于配置主题的类型、加密设置和访问策略至关重要,可确保主题符合组织的安全、合规性和运营要求。
		登录 Amazon SNS 控制台。
- 
				
请执行以下操作之一:
				
				
			 - 
				
在 Topics(主页)页面上,选择 Create topic(创建主题)。
			 - 
				
在 Create topic(创建主题)页面上,在 Details(详细信息)部分中,执行以下操作:
				- 
						
对于 Type(类型),选择主题类型(标准或者FIFO)。
					 - 
						
输入主题的名称。对于 FIFO 主题,将 .fifo 添加到名称的末尾。
					 - 
						
(可选)输入主题的显示名称。
						订阅电子邮件端点时,Amazon SNS 主题显示名称和发送电子邮件地址(例如 no-reply@sns.amazonaws.com)的组合字符计数不得超过 320 个 UTF-8 字符。在为 Amazon SNS 主题配置显示名称之前,您可以使用第三方编码工具验证发送地址的长度。
 
					 - 
						
(可选)对于 FIFO 主题,您可以选择基于内容的消息重复数据删除以启用默认的消息重复数据删除。有关更多信息,请参阅 FIFO 主题的 Amazon SNS 消息重复数据删除。
					 
			 - 
				
(可选)展开加密部分并执行以下操作。有关更多信息,请参阅 使用服务器端加密保护 Amazon SNS 数据安全。
				- 
						
选择启用加密。
					 - 
						
指定密 Amazon KMS 钥。有关更多信息,请参阅 关键术语。
						对于每个 KMS 类型,都会显示 Description(描述)、Account(账户)和 KMS ARN。
						如果您不是 KMS 的拥有者,或者您登录的账户没有 kms:ListAliases 和 kms:DescribeKey 权限,则无法在 Amazon SNS 控制台上查看有关 KMS 的信息。
要求 KMS 的拥有者授予您这些权限。有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的 Amazon KMS API 权限:操作和资源参考。
 
						
							 
							 
							 
						- 
								
默认选择适用于 Amazon SNS 的 Amazon 托管 KMS(默认)alias/aws/sns。
								  - 
								
要使用 Amazon 账户中的自定义 KMS,请选择 KMS 密钥字段,然后从列表中选择自定义 KMS。
								有关创建自定义密钥的说明 KMSs,请参阅《Amazon Key Management Service 开发者指南》中的创建密钥
 
							 - 
								
要使用来自您的 Amazon 账户或其他账户的自定义 KMS ARN,请将其输入到 KMS 密钥字段中。 Amazon 
							 
 
					 
			 - 
				
(可选)默认情况下,只有主题拥有者才能发布或订阅主题。要配置其他访问权限,请展开访问策略部分。有关更多信息,请参阅Amazon SNS 中的 Identity and Access Management和用于 Amazon SNS 访问控制的示例案例。
				使用控制台创建主题时,默认策略使用 aws:SourceOwner 条件键。此密钥类似于 aws:SourceAccount。
 
			 - 
				
				
(可选)要配置 Amazon SNS 重试失败消息传输尝试的方式,请展开 Delivery retry policy (HTTP/S)(传输重试策略 (HTTP/S))部分。有关更多信息,请参阅 Amazon SNS 消息传输重试。
			 - 
				
				
(可选)要配置 Amazon SNS 如何记录向其发送的消息 CloudWatch,请展开传送状态记录部分。有关更多信息,请参阅 Amazon SNS 消息传输状态。
			 - 
				
(可选)要将元数据标签添加到主题中,请展开标签部分,输入一个键和值(可选),然后选择添加标签。有关更多信息,请参阅 Amazon SNS 主题标记。
			 - 
						
选择创建主题。
						主题已创建并显示MyTopic页面。
						主题的名称、ARN、(可选)显示名称和主题所有者的 Amazon 账户 ID 显示在详细信息部分中。
					 - 
						
将主题 ARN 复制到剪贴板,例如:
						arn:aws:sns:us-east-2:123456789012:MyTopic
					 
 
	 
		使用 Amazon SDK 创建主题
		要使用 S Amazon DK,必须使用您的凭据对其进行配置。有关更多信息,请参阅《工具参考指南》和《工具参考指南》中的共享配置Amazon SDKs 和凭据文件。
		
以下代码示例演示如何使用 CreateTopic。
		
    - .NET
 - 
            
     
        - 适用于 .NET 的 Amazon SDK
 
        - 
             
                    
使用特定的名称创建主题。
                
                    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;
    }
             
            
         
    
 
         
    - C++
 - 
            
     
        - SDK for C++
 
        - 
             
                
                
//! 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();
}
             
            
         
    
 
         
    - CLI
 - 
            
     
        - Amazon 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"
}
             
             
                    有关更多信息,请参阅《 Amazon 命令行界面用户指南》中的在 Amazon SQS 和 Amazon SNS 中使用命令Amazon 行界面。
             
            
         
    
 
         
    - Go
 - 
            
     
        - 适用于 Go V2 的 SDK
 
        - 
             
                
                
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
}
             
            
         
    
 
         
    - Java
 - 
            
     
        - 适用于 Java 的 SDK 2.x
 
        - 
             
                
                
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 "";
    }
}
             
            
         
    
 
         
    - JavaScript
 - 
            
     
        - 适用于  JavaScript  (v3) 的软件开发工具包
 
        - 
             
                    
在单独的模块中创建客户端并将其导出。
                
                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
 
        - 
             
                
                
suspend fun createSNSTopic(topicName: String): String {
    val request =
        CreateTopicRequest {
            name = topicName
        }
    SnsClient.fromEnvironment { region = "us-east-1" }.use { snsClient ->
        val result = snsClient.createTopic(request)
        return result.topicArn.toString()
    }
}
             
            
         
    
 
         
    - PHP
 - 
            
     
        - 适用于 PHP 的 SDK
 
        - 
             
                
                
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 的 SDK (Boto3)
 
        - 
             
                
                
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
             
            
         
    
 
         
    - Ruby
 - 
            
     
        - 适用于 Ruby 的 SDK
 
        - 
             
                
                
# 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
 
        - 
             
                
                
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(())
}
             
            
         
    
 
         
    - SAP ABAP
 - 
            
     
        - 适用于 SAP ABAP 的 SDK
 
        - 
             
                
                
    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.
             
            
         
    
 
         
    - Swift
 - 
            
     
        - 适用于 Swift 的 SDK
 
        - 
             
                
                
import AWSSNS
        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
        }