了解如何使用带有自定义属性的 Amazon Cloud Map 服务发现 - Amazon Cloud Map
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

了解如何使用带有自定义属性的 Amazon Cloud Map 服务发现

本教程演示了如何使用带有可通过 Amazon Cloud Map API 发现的自定义属性的 Amazon Cloud Map 服务发现。本教程将指导您在使用两个 Lambda 函数将数据写入 DynamoDB 表,然后从表中读取数据的 Amazon Cloud9 环境中创建客户端应用程序。Lambda 函数和 DynamoDB 表已注册为服务实例。 Amazon Cloud Map 客户端应用程序和 Lambda 函数中的代码使用 Amazon Cloud Map 自定义属性来发现执行任务所需的资源。

下图演示了本教程使用的高级架构。

该图显示了本教程的架构设计。
重要

您将在研讨会期间创建 Amazon 资源,这将在您的 Amazon 账户中产生费用。建议在研讨会结束后立即清理资源,以最大限度地降低成本。

先决条件

在开始之前,请完成 设置为使用 Amazon Cloud Map 中的步骤。

步骤 1:创建 Amazon Cloud Map 命名空间

在此步骤中,您将创建一个 Amazon Cloud Map 命名空间。命名空间是一种用于对应用程序的服务进行分组的结构。创建命名空间时,您可以指定如何发现资源。在本教程中,通过使用自定义属性的 Amazon Cloud Map API 调用,即可发现在此命名空间中创建的资源。您将在后面的步骤中详细了解这一点。

  1. 登录 Amazon Web Services Management Console 并打开 Amazon Cloud Map 控制台,网址为 https://console.aws.amazon.com/cloudmap/

  2. 选择 Create namespace (创建命名空间)

  3. 在 “命名空间名称” 中,指定cloudmap-tutorial

  4. (可选)在命名空间描述中,为你打算使用命名空间的内容指定描述。

  5. 对于实例发现,请选择 API 调用

  6. 保留其余的默认值,然后选择创建命名空间

步骤 2:创建 DynamoDB 表

在此步骤中,您将创建一个 DynamoDB 表,该表用于存储和检索本教程后面创建的示例应用程序的数据。

有关如何创建 DynamoDB 的信息,请参阅《Dynamo DB 开发者指南》中的步骤 1:创建表,并使用下表来确定要指定哪些选项。

选项

表名称

云图
分区键

id

保留其余设置的默认值并创建表。

步骤 3:创建 Amazon Cloud Map 数据服务

在此步骤中,您将创建一个 Amazon Cloud Map 服务,然后将上一步中创建的 DynamoDB 表注册为服务实例。

  1. 打开 Amazon Cloud Map 控制台,网址为 https://console.aws.amazon.com/cloudmap/

  2. 从命名空间列表中,选择cloudmap-tutorial命名空间并选择查看详细信息。

  3. 在 “服务” 部分中,选择创建服务并执行以下操作。

    1. 对于服务名称,输入 data-service

    2. 保留其余默认值并选择创建服务

  4. 服务部分,选择data-service服务并选择查看详细信息

  5. 服务实例部分,选择注册服务实例

  6. 注册服务实例页面上,执行以下操作。

    1. 对于实例类型,选择其他资源的识别信息

    2. 对于服务实例 ID,请指定data-instance

    3. 自定义属性部分中,指定以下键值对。

      • =name = datatable

      • =tablename = cloudmap

    4. 验证属性是否与下图相匹配,然后选择注册服务实例

      数据服务实例的自定义属性。

步骤 4:创建 Amazon Lambda 执行角色

在此步骤中,您将创建一个 IAM 角色,我们在下一步中创建的 Amazon Lambda 函数将使用该角色。您可以命名角色cloudmap-role并省略权限边界,因为此 IAM 角色仅用于本教程,之后可以将其删除。

为 Lambda 创建服务角色(IAM 控制台)
  1. 登录 Amazon Web Services Management Console 并打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam/

  2. 在 IAM 控制台的导航窗格中,选择角色,然后选择创建角色

  3. 对于 Trusted entity type(可信实体类型),选择 Amazon Web Service

  4. 对于服务或用例,选择 Lambda,然后选择 Lambda 用例。

  5. 选择下一步

  6. 搜索并选中PowerUserAccess策略旁边的复选框,然后选择下一步

  7. 选择下一步

  8. 在 “角色名称” 中,指定cloudmap-tutorial-role

  9. 检查该角色,然后选择创建角色

步骤 5:创建 Lambda 函数来写入数据

在此步骤中,您将创建一个从头开始编写的 Lambda 函数,通过使用 Amazon Cloud Map API 查询您创建的服务,将数据写入 DynamoDB 表。 Amazon Cloud Map

有关创建 Lambda 函数的信息,请参阅Amazon Lambda 开发人员指南中的使用控制台创建 Lambda 函数,并使用下表来确定要指定或选择哪些选项。

选项

函数名称

写入函数
运行时

Python 3.12

架构

x86_64

权限

使用现有角色

现有角色

cloudmap-tutorial-role

创建函数后,更新示例代码以反映以下 Python 代码,然后部署该函数。请注意,您正在指定与您为 DynamoDB 表创建的 Amazon Cloud Map 服务实例关联的datatable自定义属性。

import json import boto3 import random def lambda_handler(event, context): serviceclient = boto3.client('servicediscovery') response = serviceclient.discover_instances( NamespaceName='cloudmap-tutorial', ServiceName='data-service', QueryParameters={ 'name': 'datatable' }) tablename = response["Instances"][0]["Attributes"]["tablename"] dynamodbclient = boto3.resource('dynamodb') table = dynamodbclient.Table(tablename) response = table.put_item( Item={ 'id': str(random.randint(1,100)), 'todo': event }) return { 'statusCode': 200, 'body': json.dumps(response) }

步骤 6:创建 Amazon Cloud Map 应用程序服务

在此步骤中,您将创建一个 Amazon Cloud Map 服务,然后将 Lambda 写入函数注册为服务实例。

  1. 打开 Amazon Cloud Map 控制台,网址为 https://console.aws.amazon.com/cloudmap/

  2. 在左侧导航栏中,选择命名空间

  3. 从命名空间列表中,选择cloudmap-tutorial命名空间并选择查看详细信息。

  4. 在 “服务” 部分中,选择创建服务并执行以下操作。

    1. 对于服务名称,输入 app-service

    2. 保留其余默认值并选择创建服务

  5. 在 “服务” 部分,选择app-service服务并选择 “查看详细信息”。

  6. 服务实例部分,选择注册服务实例

  7. 注册服务实例页面上,执行以下操作。

    1. 对于实例类型,选择其他资源的识别信息

    2. 对于服务实例 ID,请指定write-instance

    3. 自定义属性部分中,指定以下键值对。

      • =name = writeservice

      • =function = writefunction

    4. 验证属性是否与下图相匹配,然后选择注册服务实例

      写入实例的自定义属性。

步骤 7:创建 Lambda 函数以读取数据

在此步骤中,您将创建一个从头开始编写的 Lambda 函数,用于将数据写入您创建的 DynamoDB 表。

有关创建 Lambda 函数的信息,请参阅Amazon Lambda 开发人员指南中的使用控制台创建 Lambda 函数,并使用下表来确定要指定或选择哪些选项。

选项

函数名称

读取函数
运行时

Python 3.12

架构

x86_64

权限

使用现有角色

现有角色

cloudmap-tutorial-role

创建函数后,更新示例代码以反映以下 Python 代码,然后部署该函数。

import json import boto3 def lambda_handler(event, context): serviceclient = boto3.client('servicediscovery') response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='data-service', QueryParameters={ 'name': 'datatable' }) tablename = response["Instances"][0]["Attributes"]["tablename"] dynamodbclient = boto3.resource('dynamodb') table = dynamodbclient.Table(tablename) response = table.get_item(Key={'id': event}) return { 'statusCode': 200, 'body': json.dumps(response) }

步骤 8:创建 Amazon Cloud Map 服务实例

在此步骤中,您将在之前创建的服务中将 Lambda 读取函数注册为app-service服务实例。

  1. 打开 Amazon Cloud Map 控制台,网址为 https://console.aws.amazon.com/cloudmap/

  2. 在左侧导航栏中,选择命名空间

  3. 从命名空间列表中,选择cloudmap-tutorial命名空间并选择查看详细信息。

  4. 在 “服务” 部分,选择app-service服务并选择 “查看详细信息”。

  5. 服务实例部分,选择注册服务实例

  6. 注册服务实例页面上,执行以下操作。

    1. 对于实例类型,选择其他资源的识别信息

    2. 对于服务实例 ID,请指定read-instance

    3. 自定义属性部分中,指定以下键值对。

      • =name = readservice

      • =function = readfunction

    4. 验证属性是否与下图相匹配,然后选择注册服务实例

      读取实例的自定义属性。

步骤 9:创建开发环境

Amazon Cloud9 是由管理的集成开发环境 (IDE) Amazon。 Amazon Cloud9 IDE 提供了动态编程所需的软件和工具。在此步骤中,我们将创建一个 Amazon Cloud9 环境并对其进行配置, Amazon SDK for Python (Boto3) 以便您使用 Amazon API 进行编程。

有关创建 Amazon Cloud9 环境的信息,请参阅Amazon Cloud9 用户指南中的创建 EC2 环境,并使用下表来确定要指定或选择哪些选项。

选项

名称

云图教程
环境类型

新的 EC2 实例

实例类型

t2.micro

平台

Ubuntu Server 22.04 LTS

其余的默认选项保持不变。创建环境,然后将其打开 Amazon Cloud9。这为你提供了一个可以使用的bash shell。

重要

如果您在打开 Amazon Cloud9 环境时遇到问题,请参阅《Amazon Cloud9 用户指南》中的Amazon Cloud9 疑难解答:无法打开环境

使用 bash shell 运行以下命令来配置环境。

  1. 更新环境。

    sudo apt-get -y update
  2. 验证python3是否已安装。

    python3 --version
  3. 在环境中安装 Boto3 软件包。

    sudo apt install -y python3-boto3

步骤 10:创建前端客户端

使用在上一步中创建的 Amazon Cloud9 开发环境,您可以创建一个前端客户端,该客户端使用的代码可以发现您在中配置的服务 Amazon Cloud Map 并调用这些服务。

  1. 在 Amazon Cloud9 环境中的 “文件” 菜单中,选择 “新建文件”。这将创建一个名为的文件Untitled1

  2. Untitled1文件中,复制并粘贴以下代码。此代码通过在服务中搜索自定义name=writeservice属性来发现用于写入数据的 Lambda 函数。app-service返回负责向 DynamoDB 表写入数据的 Lambda 函数的名称。然后调用 Lambda 函数,传递一个示例有效负载。

    import boto3 serviceclient = boto3.client('servicediscovery') response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'name': 'writeservice' }) functionname = response["Instances"][0]["Attributes"]["function"] lambdaclient = boto3.client('lambda') resp = lambdaclient.invoke(FunctionName=functionname, Payload='"This is a test data"') print(resp["Payload"].read())
  3. 从 “文件” 菜单中选择 “另存为...” 并将文件另存为writeclient.py

  4. 在 Amazon Cloud9 环境中的 bash shell 中,使用以下命令运行 Python 代码。

    python3 writeclient.py

    输出应为200响应,类似于以下内容。

    b'{"statusCode": 200, "body": "{\\"ResponseMetadata\\": {\\"RequestId\\": \\"Q0M038IT0BPBVBJK8OCKK6I6M7VV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"HTTPStatusCode\\": 200, \\"HTTPHeaders\\": {\\"server\\": \\"Server\\", \\"date\\": \\"Wed, 06 Mar 2024 22:46:09 GMT\\", \\"content-type\\": \\"application/x-amz-json-1.0\\", \\"content-length\\": \\"2\\", \\"connection\\": \\"keep-alive\\", \\"x-amzn-requestid\\": \\"Q0M038IT0BPBVBJK8OCKK6I6M7VV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"x-amz-crc32\\": \\"2745614147\\"}, \\"RetryAttempts\\": 0}}"}'
    注意

    如果输出显示任务已超时的错误消息,请更新 Lambd writefunction a 函数的超时值。有关更多信息,请参阅Amazon Lambda 开发人员指南中的配置 Lambda 函数超时

  5. 要验证上一步中的写入是否成功,请创建一个读取客户端。

    1. 登录 Amazon Web Services Management Console 并打开 DynamoDB 控制台,网址为 https://console.aws.amazon.com/dynamodb/。

    2. 在左侧导航窗格中,选择

    3. 从表格列表中,选择您的 cloudmap-table,然后使用操作菜单选择浏览项目。

    4. 在 “退回的商品” 部分中,记下 id(字符串)列中的数值。

      下面显示了一个示例,其中 id(字符串)值为98

      DynamoDB 条目的 id(字符串)值。
    5. 在 Amazon Cloud9 环境中,在 “文件” 菜单中,选择 “新建文件”,这将创建一个名为的文件Untitled1

    6. Untitled1文件中,复制并粘贴以下代码。将该Payload值替换为上id (String)一步中的 DynamoDB 表中的值。此代码从表中读取,并将返回您在上一步中写入表的值。

      import boto3 serviceclient = boto3.client('servicediscovery') response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'name': 'readservice' }) functionname = response["Instances"][0]["Attributes"]["function"] lambdaclient = boto3.client('lambda') resp = lambdaclient.invoke(FunctionName=functionname, InvocationType='RequestResponse', Payload='"98"') print(resp["Payload"].read())
    7. 从 “文件” 菜单中选择 “另存为...” 并将文件另存为readclient.py

    8. 在 Amazon Cloud9 环境中的 bash shell 中,使用以下命令运行 Python 代码。

      python3 readclient.py

      输出应类似于以下内容。

      b'{"statusCode": 200, "body": "{\\"Item\\": {\\"id\\": \\"98\\", \\"todo\\": \\"This is a test data\\"}, \\"ResponseMetadata\\": {\\"RequestId\\": \\"JSO5DLRGF0JUPQN4NCH369ABMBVV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"HTTPStatusCode\\": 200, \\"HTTPHeaders\\": {\\"server\\": \\"Server\\", \\"date\\": \\"Wed, 06 Mar 2024 23:03:38 GMT\\", \\"content-type\\": \\"application/x-amz-json-1.0\\", \\"content-length\\": \\"61\\", \\"connection\\": \\"keep-alive\\", \\"x-amzn-requestid\\": \\"JSO5DLRGF0JUPQN4NCH369ABMBVV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"x-amz-crc32\\": \\"3104232745\\"}, \\"RetryAttempts\\": 0}}"}'
      注意

      如果输出显示任务已超时的错误消息,请更新 Lambd readfunction a 函数的超时值。有关更多信息,请参阅Amazon Lambda 开发人员指南中的配置 Lambda 函数超时

步骤 11:清理资源

完成教程后,请删除资源以免产生额外费用。 Amazon Cloud Map 要求你按相反的顺序清理它们,首先是服务实例,然后是服务,最后是命名空间。以下步骤将引导您清理本教程中使用的 Amazon Cloud Map 资源。

删除 Amazon Cloud Map 资源
  1. 登录 Amazon Web Services Management Console 并打开 Amazon Cloud Map 控制台,网址为 https://console.aws.amazon.com/cloudmap/

  2. 从命名空间列表中,选择cloudmap-tutorial命名空间并选择查看详细信息。

  3. 在命名空间详细信息页面上,从服务列表中选择data-service服务并选择查看详细信息

  4. 在 “服务实例” 部分中,选择data-instance实例并选择 “取消注册”。

  5. 使用页面顶部的痕迹,选择 cloudmap-tutorial.com 以导航回命名空间详细信息页面。

  6. 在命名空间详细信息页面上,从服务列表中选择数据服务并选择删除

  7. app-service服务以及write-instanceread-instance服务实例重复步骤 3-6。

  8. 在左侧导航栏中,选择命名空间

  9. 选择cloudmap-tutorial命名空间并选择 “删除”

下表列出了可用于删除本教程中使用的其他资源的过程。

资源 步骤

DynamoDB 表

步骤 8:(可选)清理亚马逊 DynamoDB 开发者指南中的资源
Lambda 函数和关联的 IAM 执行角色

在《Amazon Lambda 开发者指南》中进行@@ 清理

Amazon Cloud9 环境

在《Amazon Cloud9 用户指南》 Amazon Cloud9中删除环境