新增:提高了使用 亚马逊云科技 开发工具包和工具配置终端节点 URL 时的灵活性

作者:《 肯尼思日报》 | 2023

亚马逊云科技 开发工具包和工具团队很高兴地宣布,通过 AW S 开发工具包和工具共享 的开发工具包配置文件和环境变量,改进了 用于 API 服务请求的终端节点 URL 的配置。

以前,您可以通过在调用 亚马逊云科技 CLI 或向开发工具包客户端构造函数提供终端节点时设置 --endpoint-url 命令行参数来指定用于 AWS 请求的终端节点 URL。在测试和生产环境(例如 亚马逊 D ynamoDB 本地环境和亚马逊 DynamoDB 网络 服务)之间切换时,您必须 直接提供不同的终端节点。 现在,您可以使用与其他 亚马逊云科技 CLI 或 SDK 配置参数相同的机制配置终端节点 URL。此外,您可以指定用于所有 亚马逊云科技 服务或特定 亚马逊云科技 服务的终端节点。

这篇文章演示了在通过 亚马逊云科技 命令行接口 (亚马逊云科技 CLI) 使用 A mazon DynamoDB 本地和 亚马逊云科技 Step F un ctions Local 的 本地实现时如何配置终端节点 URL。

先决条件

要在 亚马逊云科技 CLI 中使用此功能,您必须安装 亚马逊云科技 CLI 1.29.0 或更高版本或 2.13.0 或更高版本。要安装 亚马逊云科技 CLI,请按照《亚马逊云科技 CLI 用户指南 》的 “安装或更新 亚马逊云科技 CLI 的最新版本” 页面中的说明进行操作。

这篇文章使用 Docker 容器镜像在本地实现 亚马逊 D ynamoDB 本地和 亚马逊云科技 Ste p F un ctions Local。 这篇文章假设你可以运行这些 Docker 容器镜像。请参阅每项服务的相应参考文档页面,以了解有关如何在本地运行这些服务的更多信息。

为所有 API 请求配置端点 URL

首先,我们演示如何设置用于使用 亚马逊云科技 CLI 发出的所有 API 请求的终端节点 URL。可以通过以下方式启动 Amazon DynamoDB 本地实现,打开端口 8080 以接受 API 请求并将其定向到 Docker 容器内的端口 8000:

$ docker run --rm -p 8080:8000 amazon/dynamodb-local

注意: --rm 标志表示命令退出时要清理容器。默认情况下,即使容器退出,容器的文件系统仍然存在。

你可以使用 http://localhost:8080 网址连接到此端口 。您可以将此终端节点 URL 与 亚马逊云科技 CLI 的 aws dynamodb 命令一起使用,向 在 Docker 容器中运行的亚马逊 DynamoDB 本地服务发送请求。

以前,您只能将此终端节点 URL 与 --endpoint-url 参数一起使用 AWS CLI。让我们在本地实现中使用 --endpoin t-url 参数创建一个表:

$ aws --endpoint-url http://localhost:8080/ dynamodb create-table \
  --table-name MyLocalTable \
  --attribute-definitions AttributeName=ColumnA,AttributeType=S AttributeName=ColumnB,AttributeType=S \
  --key-schema AttributeName=ColumnA,KeyType=HASH AttributeName=ColumnB,KeyType=RANGE \
  --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

使用环境变量

使用新功能,你可以通过环境变量 AWS_ENDPOINT_URL 设置端点 ,现在你可以列出新创建的 myLocalTable 表:

$ export AWS_ENDPOINT_URL=http://localhost:8080/
$ aws dynamodb list-tables
{
    "TableNames": [
        "MyLocalTable"
    ]
}

要停止使用 AWS_ENDPOINT_URL 配置的终端节点 URL,您必须在您的环境中将其取消设置:

$ unset AWS_ENDPOINT_URL

使用 SDK 共享配置文件

这项新功能还允许您在 SDK 共享配置文件中的配置文件中设置端点 URL。将以下配置文件添加到您的共享配置文件中(默认情况下,此文件位于 ~/.aws/config ):

[profile local]
endpoint_url=http://localhost:8080/

现在你可以在 亚马逊云科技 CLI 命令 中使用 本地配置文件并将一个项目放入 myLocalTable 表 中:

$ aws --profile local dynamodb list-tables
{
    "TableNames": [
        "MyLocalTable"
    ]
}

为特定服务配置端点 URL

通过 AWS_ENDPOINT_URL 环境变量或 endpoint_ur l 配置文件属性设置终端节 点 URL 的一个限制是,所有 API 请求,包括发送到其他 亚马逊云科技 服务的请求,都将定向到该终端节点 URL。如果您只使用单个 亚马逊云科技 服务,或者如果您使用的是 LocalStack 等第三方本地开发环境,这可能会很方便。

但是,您可能需要更好地控制哪些 亚马逊云科技 服务使用不同的终端节点 URL。要仅向端点发送 DynamoDB API 请求,您可以通过环境变量和 SDK 共享配置文件配置服务特定的端点 URL。

使用环境变量

要为亚马逊 DynamoDB API 请求设置服务特定的端点 URL,请 使用 亚马逊云科技_ENDPOINT_URL_DYNAMODB 环境变量 并检索我们之前插入的项目:

$ AWS_ENDPOINT_URL_DYNAMODB=http://localhost:8080/ aws dynamodb list-tables
{
    "TableNames": [
        "MyLocalTable"
    ]
}

此技术适用于任何 亚马逊云科技 服务。可用列表可以在 “服务特定端点的标识符” 文档中找到。

使用 SDK 共享配置文件

现在,您还可以在 SDK 共享配置文件中的配置文件中配置服务特定的端点 URL。为此,您将使用服务部分并将其与配置文件相关联。服务部分包含您要配置的 亚马逊云科技 服务的子部分。通过服务配置文件参数在配置文件中引用服务部分。

此技术适用于任何 亚马逊云科技 服务。可用服务部分名称的完整列表可以在 “服务特定端点的标识符” 文档中找到。

例如,要将 亚马逊云科技 DynamoDB 终端节点配置到本地 Docker 容器,请将以下配置文件和服务部分添加到您的共享配置文件中:

[profile production]
region=us-west-2

[profile local]
region=us-west-2
services=local-services

[services local-services]
dynamodb =
  endpoint_url=http://localhost:8080/

现在,您可以使用 亚马逊云科技 CLI 命令 中的 本地配置文件向 Amazon DynamoDB 本地安装发出请求:

$ aws --profile local dynamodb list-tables
{
    "TableNames": [
        "MyLocalTable"
    ]
}

然后,在不更改其他配置的情况下,您可以指定 生产 配置文件以向 Amazon DynamoDB 网络服务发出请求:

$ aws --profile production dynamodb list-tables

注意:此命令的输出取决于您是否在 Amazon DynamoDB 网络服务中创建了任何表。

这使您能够将决定使用哪个端点 URL 的配置保存在脚本之外并保留在官方支持的配置位置中。

有关指定自定义端点 URL 时共享配置文件语法的详细信息,请参阅 “ 服务特定端点” 文档中的 “使用共享配置文件配置端点 ” 部分。

为多个服务配置端点 URL

您还可以将 亚马逊云科技 CLI 与多个 亚马逊云科技 服务一起使用。这项新功能允许您同时为每项服务配置单独的自定义端点 URL。可以在 “服务特定端点的标识符” 文档页面上找到环境变量和服务 部分名称的列表。例如,要在本地同时使用 AWS Step Func tions 和 Amazon DynamoDB 本地功能,在使用 aws stepfunctions 命令时,您可以使用环境 变量 AWS_ENDPOINT_URL_SFN 或服务部分 sfn 来设置终端节点。

可以使用以下命令启动 亚马逊云科技 Step Functions 的本地实施:

$ docker run --rm -p 8083:8083 amazon/aws-stepfunctions-local

与亚马逊 DynamoDB 本地示例类似,您可以使用 URL http://localhost:8083 连接到此端口。 您可以将此终端节点 URL 与 亚马逊云科技 CLI 的 a ws stepf unctions 命令一起使用,向在 Docker 容器中运行的 AWS Ste p Functions 本地服务发送请求。

要使用这两个本地实现,可以同时将两个环境变量设置为各自的端点 URL:

$ export AWS_ENDPOINT_URL_DYNAMODB=http://localhost:8080/
$ export AWS_ENDPOINT_URL_SFN=http://localhost:8083/

然后使用我们的本地实现创建 亚马逊云科技 Step Functions 状态机:

$ aws stepfunctions create-state-machine \
  --name HelloWorldLocal \
  --definition '{"StartAt": "HelloWorld", "States": {"HelloWorld": {"Type": "Pass", "Result": "Hello World", "End": true}}}' 
  --role-arn "arn:aws:iam::123456789012:role/HelloWorldLocalRole"
{
    "stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLocal",
    "creationDate": "2023-07-12T13:48:26.507000-07:00"
}

现在,列出表和状态机:

$ aws dynamodb list-tables  # Uses the endpoint from AWS_ENDPOINT_URL_DYNAMODB
{
    "TableNames": [
        "MyLocalTable"
    ]
}
$ aws stepfunctions list-state-machines  # Uses the endpoint from AWS_ENDPOINT_URL_SFN
{
    "stateMachines": [
         {
            "stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLocal",
            "name": "HelloWorldLocal",
            "type": "STANDARD",
            "creationDate": "2023-07-12T13:48:26.507000-07:00"
        }
    ]
}

和以前一样,取消设置环境变量以停止使用配置的端点 URL:

$ unset AWS_ENDPOINT_URL_DYNAMODB
$ unset AWS_ENDPOINT_URL_SFN

您还可以在开发工具包共享配置文件中定义这两个终端节点,并在调用 亚马逊云科技 CLI 时指定配置文件。将以下配置文件和服务部分添加到您的共享配置文件中:

[profile local]
region=us-west-2
services=local-services

[services local-services]
dynamodb =
  endpoint_url=http://localhost:8080/
sfn =
  endpoint_url=http://localhost:8083/

使用 --profile local 调用 亚马逊云科技 CLI 将分别使用 aws dynamodb 和 aws stepfunctions 命令的指定亚马逊 Dynamo D B 和 亚马逊云科技 Step Function s 端点网址

$ aws dynamodb list-tables --profile local
{
    "TableNames": [
        "MyLocalTable"
    ]
}
$ aws stepfunctions list-state-machines --profile local
{
    "stateMachines": [
        {
            "stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLocal",
            "name": "HelloWorldLocal",
            "type": "STANDARD",
            "creationDate": "2023-07-12T13:48:26.507000-07:00"
        }
    ]
}

配置端点 URL 的优先顺序

您可以同时使用上述任何一种方法配置端点 URL。使用的终端节点 URL 由 亚马逊云科技 CLI 确定,优先级顺序如下:

  1. --endpoint-url 命令行参数提供的值。
  2. 由服务特定的环境变量(如 AWS_ENDPOINT_URL_ DYNAMODB)提供的值。
  3. 全局端点环境变量 ( AWS_ENDPOINT_ URL) 提供的值。
  4. 共享配置文件中服务定义部分的 endpoint_url 参数提供的值。
  5. 共享配置文件中配置文件中的 endpoint_url 参数提供的值。

如果未以上述任何方式配置终端节点 URL,则 亚马逊云科技 CLI 将使用相应 亚马逊云科技 服务的默认终端节点 URL。

有关 亚马逊云科技 SDK 参数优先顺序的更多信息,请参阅 “ 服务特定终端节点” 文档页面上 的 “设置优先级” 部分。

忽略已配置的端点 URL

如果你想忽略 SDK 共享配置文件或环境变量中配置的端点网址,你可以使用配置文件参数 ignore_configured_endpoint_urls=true 或环境变量 aws_ignore_conf igured_endpoint_urls=Tru e。 请注意,设置这两个参数中的任何一个都不会阻止使用提供给 --endpoint-url 命令行参数的端点。要详细了解如何禁用此功能,请参阅 “服务特定端点” 文档页面。

正在清理

如果你启动了任何 Docker 容器,请务必在完成本文中的示例后,通过终止进程或关闭运行它们的终端来关闭它们。另外,请务必关闭您正在使用的终端窗口或取消设置本文中使用的任何环境变量:

$ unset AWS_ENDPOINT_URL
$ unset AWS_ENDPOINT_URL_DYNAMODB
$ unset AWS_ENDPOINT_URL_SFN

下一步行动

在这篇文章中,我们演示了在使用 亚马逊云科技 CLI 时如何简化终端节点 URL 的配置。这些示例仅描述了使用此功能的一种方法。其他用例包括配置 亚马逊云科技 安全令牌服务 (亚马逊云科技 STS) VPC 终端节点 、兼容 S3 的对象存储或第三方 亚马逊云科技 本地 亚马逊云科技 开发环境,如 LocalStack。

目前支持此功能的 亚马逊云科技 开发工具包和工具包括适用于.NET 的软件开发工具包 、适用于 Python 的 软件开发工具包 、适用于 Ruby 的 软件 开发工具包 、 亚马逊云科技 CLI v1 、亚马逊云科技 CL I v2 和适用 于 Powershell 的 亚马逊云科技 工具 。 要了解其他开发工具包何时支持此功能,请参阅 “ 服务特定终端节点” SD K 文档页面上的 “与 亚马逊云科技 开发工具包的兼容性” 部分。

有关更多信息,请参阅 “服务特定端点” SDK 文档页面。如有任何问题或功能请求,请将问题提交到我们的 GitHub 存储库 。我们期待听到您的 反馈

作者简介:

Kenneth Daily

Kenneth Daily

Kenneth 是一名开发 亚马逊云科技 CLI 的软件开发工程师。你可以在 GitHub 上找到他 @kdaily