

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将消息队列从 Microsoft Azure 服务总线迁移到 Amazon SQS
<a name="migrate-a-messaging-queue-from-microsoft-azure-service-bus-to-amazon-sqs"></a>

*Nisha Gambhir，Amazon Web Services*

## Summary
<a name="migrate-a-messaging-queue-from-microsoft-azure-service-bus-to-amazon-sqs-summary"></a>

此模式介绍如何使用 Microsoft Azure 服务总线队列消息传送平台将 .NET Framework 或 .NET Core Web 或控制台应用程序迁移到 Amazon Simple Queue Service（Amazon SQS）。

应用程序使用消息传递服务向其他应用程序发送数据以及从其他应用程序接收数据。这些服务有助于在云中构建解耦、高度可扩展的微服务、分布式系统和无服务器应用程序。

Azure 服务总线队列是支持队列和消息传递的更广泛的 Azure publish/subscribe 消息传递基础架构的一部分。 

Amazon SQS 是一种完全托管的消息队列服务，使您能够分离和扩展微服务、分布式系统和无服务器应用程序。Amazon SQS 消除了与管理和操作面向消息的中间件相关的复杂性和开销，使开发人员能够专注于差异化工作。使用 Amazon SQS，您可以在软件组件之间以任意卷发送、存储和接收消息，而不会丢失消息或要求其他服务可用。

## 先决条件和限制
<a name="migrate-a-messaging-queue-from-microsoft-azure-service-bus-to-amazon-sqs-prerequisites-and-limitations"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account 
+ 使用 Azure 服务总线队列的 .NET Framework 或 .NET Core Web 或控制台应用程序（附加示例代码）

**产品版本**
+ .NET Framework 3.5 或更高版本，或 .NET Core 1.0.1、2.0.0 或更高版本

## 架构
<a name="migrate-a-messaging-queue-from-microsoft-azure-service-bus-to-amazon-sqs-architecture"></a>

**源技术堆栈**
+ 使用 Azure 服务总线队列发送消息的 .NET（Core 或 Framework）Web 或控制台应用程序

 

**目标技术堆栈**
+ Amazon SQS

## 工具
<a name="migrate-a-messaging-queue-from-microsoft-azure-service-bus-to-amazon-sqs-tools"></a>

**工具**
+ Microsoft Visual Studio

**代码**

要为 Amazon SQS 创建 AWS Identity and Access Management (IAM) policy，请执行以下操作：

1. 登录 AWS 管理控制台并在上打开 IAM 控制台[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

2. 在左侧的导航窗格中，选择 **Policies (策略)**，然后选择 **Create policy (创建策略)**。

3. 选择 **JSON** 选项卡，然后粘贴以下代码：

```
{
   "Version": "2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "VisualEditor0",
         "Effect": "Allow",
         "Action": [
            "sqs:DeleteMessage",
            "sqs:GetQueueUrl",
            "sqs:ChangeMessageVisibility",
            "sqs:SendMessageBatch",
            "sqs:ReceiveMessage",
            "sqs:SendMessage",
            "sqs:GetQueueAttributes",
            "sqs:ListQueueTags",
            "sqs:ListDeadLetterSourceQueues",
            "sqs:DeleteMessageBatch",
            "sqs:PurgeQueue",
            "sqs:DeleteQueue",
            "sqs:CreateQueue",
            "sqs:ChangeMessageVisibilityBatch",
            "sqs:SetQueueAttributes"
         ],
         "Resource": "arn:aws:sqs:*:<AccountId>:*"
      },
      {
         "Sid": "VisualEditor1",
         "Effect": "Allow",
         "Action": "sqs:ListQueues",
         "Resource": "*"
      }
   ]
}
```

4. 选择**查看策略**，键入名称，然后选择**创建策略**。

5. 将新创建的策略附加到现有 IAM 角色或创建新角色。

## 操作说明
<a name="migrate-a-messaging-queue-from-microsoft-azure-service-bus-to-amazon-sqs-epics"></a>

### 在 AWS 中设置 Amazon SQS
<a name="set-up-amazon-sqs-in-aws"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为 Amazon SQS 创建 IAM policy。 | 创建将提供对 Amazon SQS 的访问权限的 IAM policy。有关示例策略，请参阅“代码”部分。 | 系统工程师 | 
| 创建 AWS 配置文件。 | 通过运行适用于 PowerShell 命令集的 AWS 工具来创建新的配置文件AWSCredential。此命令将您的访问密钥和秘密密钥存储在您指定的配置文件名称下的默认凭证文件中。将您之前创建的 Amazon SQS 策略与此账户链接。保存 AWS 访问密钥 ID 和秘密访问密钥。在接下来的步骤中将需要这些内容。 | 系统工程师 | 
| 创建 SQS 队列。 | 您可以创建标准队列或先进先出 (FIFO) 队列。有关说明，请参阅“参考”部分中的链接。 | 系统工程师 | 

### 修改 .NET 应用程序代码
<a name="revise-your-net-application-code"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 AWS Toolkit for Visual Studio。 | 此工具包是 Microsoft Visual Studio 的扩展，可让您更轻松地在 AWS 中构建和部署 .NET 应用程序。有关安装和使用说明，请参阅“参考”部分中的链接。 | 应用程序开发者 | 
| 安装 AWSSDK .SQS NuGet 软件包。 | 你可以通过在 Visual Studio 中选择 “管理软件 NuGet 包” 或运行 “Install-Package AWSSDK .SQS” 命令来安装 AWSSDK .SQS。 | 应用程序开发者 | 
| 在您的.NET 应用程序中创建 AWSCredentials 对象。 | 附件中的示例应用程序显示了如何创建继承自 AWSCredentials的 Basic AWSCredentials 对象。您可以使用之前的访问密钥 ID 和秘密访问密钥，也可以让对象在运行时从 .aws 文件夹中选取它们作为用户配置文件的一部分。 | 应用程序开发人员 | 
| 创建 SQS 客户端对象。 | 为.NET 框架创建 SQS 客户端对象 (AmazonSQSClient)。这是 Amazon.SQS 命名空间的一部分。这个对象是必需的，而不是 IQueue客户端，后者是 Microsoft.Azure 的一部分。 ServiceBus 命名空间。 | 应用程序开发者 | 
| 调用 SendMessageAsync 方法向 SQS 队列发送消息。 | 将向队列发送消息的代码更改为使用 amazonSqsClient。 SendMessageAsync 方法。有关详细信息，请参阅随附的代码示例。 | 应用程序开发者 | 
| 调用 ReceiveMessageAsync 方法接收来自 SQS 队列的消息。 | 将接收消息的代码更改为使用 amazonSqsClient。 ReceiveMessageAsync 方法。有关详细信息，请参阅随附的代码示例。 | 应用程序开发者 | 
| 调用 DeleteMessageAsync 方法从 SQS 队列中删除消息。 | 要删除消息，请更改 QueueClient 中的代码。 CompleteAsync 方法 amazonSqsClient. DeleteMessageAsync 方法。有关详细信息，请参阅随附的代码示例。 | 应用程序开发人员 | 

## 相关资源
<a name="migrate-a-messaging-queue-from-microsoft-azure-service-bus-to-amazon-sqs-related-resources"></a>
+ [适用于 .NET 的 AWS SDK 开发人员指南](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/welcome.html)
+ [使用 Amazon SQS 进行消息收发](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/sqs-apis-intro.html)
+ [通过 适用于 .NET 的 AWS SDK 创建和使用 Amazon SQS 队列](https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/how-to-sqs.html)
+ [发送 Amazon SQS 消息](https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/SendMessage.html)
+ [接收来自 Amazon SQS 队列的消息](https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/ReceiveMessage.html)
+ [删除来自 Amazon SQS 队列的消息](https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/DeleteMessage.html)
+ [AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html)

## 附加信息
<a name="migrate-a-messaging-queue-from-microsoft-azure-service-bus-to-amazon-sqs-additional-information"></a>

此模式包括两个示例应用程序（请参阅附件部分）：
+ **AzureSbTestApp**包括使用 Azure 服务总线队列的代码。
+ **AmazonSqsTestApp**使用亚马逊 SQS。这是一个使用 .NET Core 2.2 的控制台应用程序，包括用于发送和接收消息的示例。

备注：
+ QueueClient 是 Client 的对象， IQueue客户机是 Microsoft.Azure 的一部分。 ServiceBus 命名空间（包含在 Microsoft.Azure 中。 ServiceBus NuGet 包裹）。
+ amazonSqsClient 是亚马逊的一个对象SQSClient，它是 Amazon.sqs 命名空间的一部分（包含在.SQS 包中） AWSSDK。 NuGet 
+ 根据代码的运行位置（比如代码是否在运行） EC2，角色需要拥有写入 SQS 队列的权限。

## 附件
<a name="attachments-25334709-7000-4f60-87ed-ea41acb41a99"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/25334709-7000-4f60-87ed-ea41acb41a99/attachments/attachment.zip)