

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

# 聊天示例
<a name="examples-chat"></a>

Amazon Q Developer 聊天可帮助开发者完成各种任务，从编码、测试和升级应用程序，到诊断错误、执行安全扫描和修复以及优化 AWS 资源。本节介绍与 Amazon Q 聊天如何支持开发者完成典型的编程任务，例如：
+ [询问 AWS 服务](#services-chat)
+ [生成代码](#code-chat)
+ [生成单元测试](#tests-chat)
+ [解释代码](#explain-chat)

## 询问 AWS 服务
<a name="services-chat"></a>

用户可以向 Amazon Q Developer 提问 AWS 服务，例如寻找合适的服务或了解最佳实践。

### 聊一聊 AWS 服务
<a name="chat-services"></a>

用户：

如果我需要保持较低的成本，哪种容器服务最适合用来运行我的工作负载？

亚马逊 Q：

根据提供的信息，您似乎正在寻找一种经济实惠的容器服务来运行您的工作负载。在这种情况下，我建议考虑将亚马逊弹性容器服务 (Amazon ECS) 与 Fargate 配合使用。[1]

带有 Fargate 的 Amazon ECS 是一款适用于容器的无服务器计算引擎，它允许您运行容器，而无需管理任何底层基础设施。有了 Fargate，你无需配置或管理服务器，Fargate 会为你处理这个问题。这有助于保持较低的成本，因为您只需为容器实际使用的计算资源付费，而不必为闲置的服务器容量付费。[2]

将 Amazon ECS 与 Fargate 配合使用的一些主要好处：

• 无需管理服务器或集群 — Fargate 为您处理基础设施的配置和管理。

• Pay-as-you-go 定价 — 您只需为容器使用的计算资源付费，无需为闲置容量付费。

• 自动扩展 — Fargate 可以根据需求自动向上和向下扩展容器。

• 与其他功能（ AWS 服务 例如负载平衡、日志记录和监控）紧密集成。

提供的资源还提到，ECS 服务在容器调度和放置方面提供了灵活性，这有助于进一步优化成本。

我建议您在 AWS 网站上查看带有 Fargate 的 Amazon ECS 的定价详情，以便根据您的具体工作负载要求更好地了解成本。当然，如果您还有其他问题，请随时告诉我！

源

[1] 哪种 AWS 容器服务最适合您？

[aptgetops.tech >--你 aws-container-services-which one-is-right-for](https://aptgetops.tech/aws-container-services-which-one-is-right-for-you)

[2] Java 非 HTTP 工作负载的容器选项

[stackoverflow.com > 问题 > 43417016](https://stackoverflow.com/questions/43417016/java-container-options-for-non-http-worloads)

**结束关于 Amazon Q 的聊天 AWS 服务**

## 生成代码
<a name="code-chat"></a>

用户可以向 Amazon Q 开发者寻求帮助以编写代码片段。

### 聊聊编写代码
<a name="chat-writing"></a>

用户：

能否举个例子，说明如何使用列出所有 S3 存储桶？ AWS SDK for Python (Boto)

亚马逊 Q：

当然，以下是如何使用 AWS SDK for Python (Boto)[1] 列出所有 S3 存储桶的示例：

```
import boto3
# Create an S3 client
s3 = boto3.client('s3')

# List all the buckets
response = s3.list_buckets()

# Print the name of each bucket
for bucket in response['Buckets']:
    print(bucket['Name'])
```

代码的工作原理如下：

1. 我们首先导入 boto3 库，这是适用于 Python 的软件开发工具包。

1. 我们使用创建 S3 客户端`boto3.client('s3')`。

1. 我们在 S3 客户端上调用该`list_buckets()`方法，它会返回一个包含账户中所有存储桶列表的响应。

1. 然后，我们遍历响应中的`Buckets`列表并打印出每个存储桶的名称。

这是一个基本示例，但为使用 Amazon S3 AWS SDK for Python (Boto) 提供了许多更高级的功能，例如创建、删除和管理存储桶中的对象，设置存储桶策略等。您可以在 AWS SDK for Python (Boto)) 文档中找到更多示例和文档。[2]

请记住，在使用时 AWS 服务，请务必遵循处理凭证和敏感信息的最佳实践，例如将 AWS 访问密钥存储在环境变量中，而不是在代码中对其进行硬编码。

来源：[1] [使用适用于 Python 的软件开发工具包的亚马逊 S3 示例 (Boto3)-SDK 代码示例 docs.aws.amazon.com > 代码 AWS 库 >](https://docs.aws.amazon.com/code-library/latest/ug/python_3_s3_code_examples.html) latest-1x >... > python-s3.html

[2] [开始使用 SDK 使用亚马逊 S3 存储桶和对象——S AWS D AWS K 代码示例 docs.aws.amazon.com > 代码库 > latest-1x >... > s3\$1example\$1s](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_Scenario_GettingStarted_section.html) 3\$1buckets\$1 \$1sect... GettingStarted 

**结束关于编写代码的 Amazon Q 聊天**

## 生成单元测试
<a name="tests-chat"></a>

用户可以将选定的代码作为提示发送给 Amazon Q Developer，在那里会应用其他说明，例如生成单元测试。有关 step-by-step说明，请参阅 [Amazon Q *开发者用户指南中的向 Amazon Q* 发送代码](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/explain-update-code.html#send-code)。

### 聊聊单元测试
<a name="chat-unit"></a>

用户：

为以下函数编写一个包含模拟数据的单元测试：

```
 // poll messages from Amazon SQS queue name
    public List<String> pollMessages(String queueName) {
        List<String> messages = new ArrayList<>();
        // poll messages from queue
        ReceiveMessageResult = sqsClient.receiveMessage(new ReceiveMessageRequest().
        for (Message : receiveMessageResult.getMessages()) {
            messages.add(message.getBody());
        }
        return messages;
        }
```

亚马逊 Q：

要为 PollMessages 函数编写带有模拟数据的单元测试，我们可以使用像 Mockito 这样的模拟框架。示例如下：

```
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.amazonaws.services.sqs.model.ReceiveMessageResult;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;

import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

@ExtendWith(MockitoExtension.class)
public class SQSUtilsTest {

    @Mock
    private AmazonSQS sqsClient;

    @InjectMocks
    private SQSUtils sqsUtils;

    @Test
    public void testPollMessages() {
        // Arrange
        String queueName = "test-queue";
        Message message1 = new Message().withBody("message1");
        Message message2 = new Message().withBody("message2");
        ReceiveMessageResult receiveMessageResult = new ReceiveMessageResult().withMessages(message1, message2);
        Mockito.when(sqsClient.receiveMessage(new ReceiveMessageRequest().withQueueUrl(queueName)))
                .thenReturn(receiveMessageResult);

        // Act
        List<String> messages = sqsUtils.pollMessages(queueName);

        // Assert
        assertEquals(Arrays.asList("message1", "message2"), messages);
    }
}
```

在此示例中，我们使用 Mockito 来模拟 AmazonSQS 客户端，并设置 ReceiveMessage 方法的预期行为，以便它返回两条正文为 “message1” 和 “message2” 的模拟消息。然后，我们调用 pollMessages 方法并断言返回的消息列表与预期值相匹配。

关键点是：

1. 我们使用 @ ExtendWith (MockitoExtension.class) 注解来启用 Mockito 与的集成。 JUnit

1. 我们使用 @Mock 注解来创建 AmazonSQS 客户端的模拟实例。

1. 我们使用 @ InjectMocks 注解将模拟 AmazonSQS 客户端注入到课堂中。 SQSUtils 

1. 在测试方法中，我们使用 mockito.when () .thenReturn () 设置了 receiveMessage 方法的预期行为。

1. 我们调用 pollMessages 方法并断言返回的消息列表与预期值相匹配。

这种方法使我们能够在不实际与 Amazon SQS 服务交互的情况下测试 PollMessages 方法，这可以使测试更快、更可靠。

**结束****关于单元测试的 Amazon Q 聊天**

## 解释代码
<a name="explain-chat"></a>

对于代码审查流程，开发人员可以向 Amazon Q Developer 发送代码选择以更好地理解代码。此外，Amazon Q 提供的解释也可以用于文档目的。在以下示例中，Amazon Q 使用函数解释了处理 AWS Lambda 函数，然后提出了文档字符串。

### 聊一聊解释代码
<a name="chat-explain"></a>

用户：

解释一下我的代码的以下部分：

```
def lambda_handler(event, context):
    dynamodb = boto3.resource('dynamodb')
    s3_client = boto3.client('s3')
    table = dynamodb.Table('DYNAMODB_TABLE')
    # Get s3 object from the event
    print(event)
    print(context)
    # get object from event
    bucket_key = event['Records'][0]['s3']['object']['key']
    object_key = unquote_plus(bucket_key)
    fullText = detect_text(object_key, bucket)

    response = s3_client.head_object(Bucket=bucket, Key=object_key)
    print(response)
    print(fullText)
    metadata = response['ResponseMetadata']
    metadata = json.dumps(metadata)

    now = datetime.now()
    current_time = now.strftime("%A %d %B, %Y %H:%M:%S")
    print("Current Time =", current_time + "\n\n")
    reason, outcome = detect_restaurant_closure(fullText, current_time)
    table.put_item(
        Item={
            'id': object_key,
            'creationTime': now.strftime("%Y-%m-%d %H:%M:%S"),
            'reason': reason,
            'text': fullText,
            'metadata': metadata
        }
    )
```

亚马逊 Q：

提供的代码块似乎是一个写入的 AWS Lambda 函数 Python。 让我解释一下这段代码的关键方面：

1. 该函数名为 lambda\$1handler，它是 Lambda 函数的入口点。

1. 它使用 boto3 库与 AWS DynamoDB 和 S3 服务进行交互。

1. 该函数从传入的事件数据中检索 S3 对象密钥和存储桶名称。

1. 然后，它会调用 detect\$1text 函数（未显示在提供的代码中）来提取 S3 对象的全文内容。

1. 该函数还使用 head\$1object 方法检索有关 S3 对象的元数据。

1. 然后，它提取当前时间并调用 detect\$1restaurant\$1closure 函数（也未显示），以根据提取的文本确定餐厅关闭的原因和结果。

1. 最后，该函数将以下信息存储在 DynamoDB 表中：
   + 将 S3 对象密钥作为 id
   + 创建时间
   + 餐厅关闭的原因和结果
   + 提取的 S3 对象文本

总体而言，这个 Lambda 函数似乎是一个更大的系统的一部分，该系统处理 S3 对象，提取文本内容，分析其中的餐厅关闭信息，并将结果存储在 DynamoDB 表中。要完全理解此代码的功能，需要获取 detect\$1text 和 detect\$1restaurant\$1closure 函数的具体细节。

**亚马逊 Q 回复已结束**

用户：将此解释汇总成此 lambda\$1handler 函数的文档字符串

Amazon Q：以下是 lambda\$1handler 函数 [1] 的建议文档字符串：

```
def lambda_handler(event, context):
    """
    AWS Lambda function that processes an S3 object, extracts text content, analyzes it, and stores the results.
    Args:
        event (dict): The event data that triggered the Lambda function, containing information about the S3 object.
        context (object): The context object provided by AWS Lambda, containing information about the runtime environment.
    
    Returns:
        None
    """
    
    # function implementation details...
```

这个 docstring 概述了函数的用途、它期望的输入参数以及预期的返回值（在本例中为缺少返回值）。它使用户可以清楚地了解 lambda\$1handler 函数的作用，而无需深入研究实现细节。

来源：[1] 在 C\$1 中定义 Lambda 函数处理程序- AWS Lambda [https://docs.aws.amazon.com/lambda/latest/dg/csharp-handler.html-: \$1: text=Lambda 函数处理程序是、、退](https://docs.aws.amazon.com/lambda/latest/dg/csharp-handler.html#:~:text=The%20Lambda%20function%20handler%20is,%2C%20exits%2C%20or%20times%20out.)出或超时。

**关于解释代码的 Amazon Q 聊天已结束**