

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

# 使用 AMS API 和 CLI
<a name="understand-sent-api"></a>

AWS Managed Services (AMS) API 与其他 AWS 服务类似。 APIs 您可以在 AMS API [参考中阅读有关 AMS API](https://docs.aws.amazon.com/managedservices/latest/ApiReference-cm/index.html) 的信息。

## 用于 REST 调用的 AMS API HTTP
<a name="sent-api-endpoints"></a>

除此之外 SDKs，AMS 还提供 CLI；您还可以针对 AMS 端点调用 REST API 调用。

有两个 AMS APIs （两者的终端节点都位于 us-east-1 中）：
+ 变更管理：使用此 API 请求访问或更改您的基础架构，包括创建和更新 RFCs、部署新实例、更新和删除实例、获取相关信息以及创建 AMIs。 CTsHTTP 终端节点是：

  `https://amscm.us-east-1.amazonaws.com`
+ SKMS：使用此 API 获取有关您的基础架构的信息，包括 VPCs堆栈、子网和。 AMIsHTTP 终端节点是：

  `https://amsskms.us-east-1.amazonaws.com`

## 安装或升级 AMS CLI
<a name="install-sent-cli"></a>

AMS CLI 是一种与 AMS API 交互的简便方法，本节的示例中使用了该工具。有关 AWS CLI 和 AMS CLI 的使用惯例，请参阅[使用 AWS 命令行界面](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-using.html)。

有关安装 SAML 的信息，请参阅[AD FS 声明规则和 SAML 设置](adfs-claim-rule-saml.md)。

要安装或升级 AMS CLI，请按照以下说明进行操作：
**注意**  
您必须具有管理员凭据才能执行此过程。

AWS CLI 是使用 AWS Managed Services (AMS) CLIs （变更管理和 SKMS）的先决条件。

1. 要安装 AWS CLI，请参阅[安装 AWS 命令行界面](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)，然后按照相应的说明进行操作。请注意，该页面底部有使用不同安装程序（[Linux](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-linux.html)、[MS Windows、mac [O](https://docs.aws.amazon.com/cli/latest/userguide/cli-install-macos.html) S](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html)、[虚拟](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-virtualenv.html)环境、[捆绑安装程序（Linux、macOS 或 Unix](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-bundle.html)）的说明。

   安装完成后，运行`aws help`以验证安装。

1. 安装 AWS CLI 后，要安装或升级 AMS CLI，请下载 AMS AMS C **LI 或 AMS** **SDK** 可分发文件 zip 文件并解压缩。您可以通过 AMS 控制台左侧导航栏中的[https://console.aws.amazon.com/managedservices/developerResources](https://console.aws.amazon.com/managedservices/developerResources)链接访问 AMS CLI 发行版。

1. README 文件提供了任何安装的说明。

   打开任一选项：
   + CLI zip：仅提供 AMS CLI。
   + 软件开发工具包压缩包：提供所有 AMS APIs 和 AMS CLI。

   对于 **Windows**，请运行相应的安装程序（仅限 32 位或 64 位系统）：
   + 32 位：**ManagedCloudAPI\$1x86.msi**
   + 64 位：**ManagedCloudAPI\$1x64.msi**

   对于 **Mac/Linux**，请运行以下命令运行名为:**AWSManagedServices\$1InstallCLI.sh** 的文件：。`sh AWSManagedServices_InstallCLI.sh`**请注意，**amscm** 和 **amsskms** 目录及其内容必须与.sh 文件位于同一个目录中。AWSManagedServices\$1InstallCLI**

1. 如果您的公司证书是通过与 AWS 的联合身份验证（AMS 默认配置）使用的，则必须安装可以访问您的联合身份验证服务的凭证管理工具。例如，您可以使用此 AWS 安全博客[如何使用 SAML 2.0 和 AD FS 实现联合 API 和 CLI 访问来](https://blogs.aws.amazon.com/security/post/Tx1LDN0UBGJJ26Q/How-to-Implement-Federated-API-and-CLI-Access-Using-SAML-2-0-and-AD-FS)帮助配置您的凭证管理工具。

1. 安装完成后，运行`aws amscm help``aws amsskms help`并查看命令和选项。
**注意**  
必须安装 AMS CLI 才能使这些命令生效。要安装 AMS API 或 CLI，请前往 AMS 控制台**开发者资源**页面。有关 AMS CM API 或 AMS SKMS API 的参考资料，请参阅《用户指南》中的 “AMS 信息资源” 部分。您可能需要添加身份验证`--profile`选项；例如，`aws amsskms ams-cli-command --profile SAML`。您可能还需要添加该`--region`选项，因为所有 AMS 命令都将使用 us-east-1；例如。`aws amscm ams-cli-command --region=us-east-1`

# 在 CLI、Ruby、Python 和 Java 中使用 AMS API
<a name="sent-api-ruby-python-java"></a>

以下是 AMS API `ListChangeTypeClassificationSummaries` 操作的所有可用语言的代码片段列表。

有关 Python、Ruby 和 Java SDKs 的信息，[请参阅亚马逊 Web Services 工具](https://aws.amazon.com/tools/)，然后向下滚动到该 SDKs 部分。每个 SDK 安装程序都包含一个带有其他代码片段的自述文件。

## AMS API 到 CLI 示例
<a name="cli-list-ct-summaries"></a>

安装 AMS CLI（需要 CL AWS I；请参阅[安装或升级 AMS CLI](understand-sent-api.md#install-sent-cli)）后，您可以运行任何 AMS API 操作，方法是重新调整调用，指定哪个 AMS API `aws amscm` 或`aws amsskms`，然后使用连字符代替驼峰大小写。最后，提供证书，例如 SAML。

 要了解更多信息，请参阅[使用 AWS 命令行界面](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-using.html)。

示例：
+ API: `'ChangeTypeClassificationSummaries[].[Category,Subcategory,Item,Operation,ChangeTypeId]'`
+ CLI：`amscm list-change-type-classification-summaries --query "ChangeTypeClassificationSummaries[*].[Category,Subcategory,Item,Operation,ChangeTypeId]" --output table`

**注意**  
如果您使用 SAML 进行身份验证，请`aws --profile saml`添加到命令的开头。例如，  

```
aws --profile saml amscm list-change-type-classification-summaries --query "ChangeTypeClassificationSummaries[*].[Category,Subcategory,Item,Operation,ChangeTypeId]" --output table
```

## AMS API 到 Python 示例
<a name="python-list-ct-summaries"></a>

要在 Python 中使用 AMS API，请安装 AMS CLI 并安装 boto3。按照以下步骤进行操作：

1. 安装 AMS CLI。请参阅[安装或升级 AMS CLI](understand-sent-api.md#install-sent-cli)。

1. 安装适用于 Python 的 AWS 软件开发工具包 boto3。欲了解更多信息，请参阅这篇博客文章[现已推出 — 适用于 Python 的 AWS SDK (Boto3](https://aws.amazon.com/blogs/aws/now-available-aws-sdk-for-python-3-boto3/))。

   `import boto3`

1. 获取 AMS 变更管理客户端：

   `cm = boto3.client('amscm')`

1. 获取 AMS CTs：

   `cts = cm.list_change_type_classification_summaries()`

   `print(cts)`

### Python 示例
<a name="python-examples"></a>

以下是一些在 AMS 中使用 Python、要创建 EC2 实例、 and/or 使用 Lambda 的示例。

#### 创建一个 Python 示例 EC2
<a name="python-examples-create-ec2"></a>

此示例展示了如何在 Python 代码中使用 amscm RESTFul API 来归档和执行 RFC 流程。

1. 将 AMS CLI 安装在您可以访问的地方；您需要它提供的文件。

1. 调用 Python 库并创建 EC2 实例：

   ```
   import boto3
   import json
   import time
   
   # Create the amscm client
   cm = boto3.client('amscm')
   
   # Define the execution parameters for EC2 Create
   AMSExecParams = {
       "Description": "EC2-Create",
       "VpcId": "VPC_ID",
       "Name": "My-EC2",
       "TimeoutInMinutes": 60,
       "Parameters": {
           "InstanceAmiId": "INSTANCE_ID",
           "InstanceSubnetId": "SUBNET_ID"
       }
   }
   
   # Create the AMS RFC
   cts = cm.create_rfc(
       ChangeTypeId="ct-14027q0sjyt1h",
       ChangeTypeVersion="3.0",
       Title="Python Code RFC Create",
       ExecutionParameters=json.dumps(AMSExecParams)
   )
   
   # Extract the RFC ID from the response
   NewRfcID = cts['RfcId']
   
   # Submit the RFC
   RFC_Submit_Return=cm.submit_rfc(RfcId=NewRfcID)
   
   # Check the RFC status every 30 seconds
   RFC_Status = cm.get_rfc(RfcId=NewRfcID)
   RFC_Status_Code = RFC_Status['Rfc']['Status']['Name']
   
   while RFC_Status_Code != "Success":
       if RFC_Status_Code == "PendingApproval":
           print(RFC_Status_Code)
           time.sleep(30)
       elif RFC_Status_Code == "InProgress":
           print(RFC_Status_Code)
           time.sleep(30)
       elif RFC_Status_Code == "Failure":
           print(RFC_Status_Code)
           break
       else:
           print(RFC_Status_Code)
   
       RFC_Status = cm.get_rfc(RfcId=NewRfcID)
       RFC_Status_Code = RFC_Status['Rfc']['Status']['Name']
   ```

#### 使用 Lambda 的 Python 示例
<a name="python-examples-lambda"></a>

此示例说明如何将 AMS 模型与您的代码捆绑在一起，以便您可以将其与 Lambda 一起使用，或者 EC2; 您不会或无法安装的地方。`amscli`

**注意**  
AMS 不提供可导入的 AMS 专用的 Python SDK。`amscli`安装脚本在 CLI 的正常路径中安装 AMS 服务数据模型。对于 CLI 的使用和系统 Python 的使用，这没问题，因为两者都`awscli`从相同的默认位置`boto3`读取它们的服务模型（`~/.aws/models`）。但是，当您想在 Lambda（或任何其他非本地运行时）中通过 boto3 使用 AMS 服务时，它会中断，因为您不再拥有数据模型。以下是通过将数据模型与函数打包来解决此问题的方法。

你可以采取一些简单的步骤在 Lambda 或其他运行时（例如 EC2 Fargate 等）中运行集成了 AMS 的 Python 代码。以下工作流程显示了集成 AMS 的 Lambda 函数所需的步骤。

通过将数据模型添加到代码的部署包并更新 SDK 搜索路径，您可以模拟 SDK 体验。

**重要**  
此示例和显示的所有非 python 命令均在 Mac 计算机上进行了测试。

**工作流程示例**：

1. 安装 `amscli`。这将在您的计算机 (Mac) `~/.aws/models` 上创建一个文件夹。

1. 将模型复制到本地目录:`cp ~/.aws/models ./models`.

1. 将模型包含在代码的部署包中。

1. 更新您的函数代码，将新模型添加到 SDK 路径中。请注意，此代码必须在导入 boto3 或 botocore 之前运行！

```
# Force Python to search local directory for boto3 data models
import os
os.environ['AWS_DATA_PATH'] = './models'

import boto3
import botocore
```

**注意**  
由于示例模型位于名为的目录中`models`，因此我们添加`./models`到 AWS\$1DATA \$1PATH。如果目录已命名`/ams/boto3models`，我们将添加以下代码：

```
import os.environ['AWS_DATA_PATH'] = './ams/boto3models'

import boto3
import botocore
```

您的代码应该可以成功找到 AMS 模型。以下是关于：打包的更具体的示例，以下是 Lambda 的特定工作流程。

**AMS Lambda 工作流程示例**：

这些步骤将前面的通用示例应用于创建 AWS Lambda 函数。

1. 安装 amscli。这将在您的计算机 (Mac) `~/.aws/models` 上创建一个文件夹。

1. 将模型复制到本地目录：

   ```
   cp ~/.aws/models ./models
   ```

1. 将模型添加到函数的部署 zip 文件中：

   ```
   zip -r9 function.zip ./models
   ```

**重要**  
更新您的函数代码，将新模型添加到 SDK 路径中。请注意，此代码必须在导入 boto3 或 botocore 之前运行！

```
# Force Python to search local directory for boto3 data models
import os
os.environ['AWS_DATA_PATH'] = './models'

import boto3
import botocore
```

**注意**  
因为示例模型位于名为的目录中`models`，所以我们添加`./models`到 AWS\$1DATA \$1PATH。如果目录已命名`/ams/boto3models`，我们将添加以下代码：  

```
import os
os.environ['AWS_DATA_PATH'] = './ams/boto3models'

import boto3
import botocore
```

现在，部署你的函数：

1. 将您的函数代码添加到部署 zip 文件中（如果您尚未这样做）：

   ```
   zip -g function.zip lambda-amscm-test.py
   ```

1. 使用您创建的 zip 文件（控制台或 CLI）创建或更新您的函数：

   ```
   aws lambda update-function-code --function-name lambda-amscm-test --zip-file fileb://function.zip --region us-east-1
   ```

你的 AMS 集成的 Python Lambda 现在应该可以工作了。

**注意**  
您的函数必须具有 IAM 权限，`amscm`否则会出现权限错误。

**用于测试 amscm 的 Lambda 函数代码示例（.py 的内容）**： lambda-amscm-test

```
import json

# Force lambda to search local directory for boto3 data models
import os
os.environ['AWS_DATA_PATH'] = './models'

import boto3
import botocore


def lambda_handler(event, context):
    use_session = boto3.session.Session(region_name="us-east-1")
    try:
        cm = use_session.client("amscm")
        cts = cm.list_change_type_categories()
        print(cts)
    except botocore.exceptions.UnknownServiceError:
        print("amscm not found")

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

**测试输出（成功）**：

函数响应：

```
{
  "statusCode": 200,
  "body": "\"Hello from Lambda!\""
}

Request ID:
"1cea13c0-ed46-43b1-b102-a8ea28529c27"
```

函数日志：

```
START RequestId: 1cea13c0-ed46-43b1-b102-a8ea28529c27 Version: $LATEST
{'ChangeTypeCategories': ['Deployment', 'Internal Infrastructure Management', 'Management'], 'ResponseMetadata': {'RequestId': 'e27276a0-e081-408d-bcc2-10cf0aa19ece', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'e27276a0-e081-408d-bcc2-10cf0aa19ece', 'content-type': 'application/x-amz-json-1.1', 'content-length': '89', 'date': 'Sun, 10 May 2020 23:21:19 GMT'}, 'RetryAttempts': 0}}
END RequestId: 1cea13c0-ed46-43b1-b102-a8ea28529c27
```

## Ruby 的 AMS API 示例
<a name="ruby-list-ct-summaries"></a>

要在 Ruby 中使用 AMS API，请安装 Rub AWS y SDK 和 AMS CLI。按照以下步骤进行操作：

1. 安装 AMS CLI。请参阅[安装或升级 AMS CLI](understand-sent-api.md#install-sent-cli)。

1. 安装 AWS Ruby 开发工具包。参见 [Amazon Web Services 工具](https://aws.amazon.com/tools/)。

1. 使用以下命令配置 Ruby：

   `require 'aws-sdk'`

   `config = { `

   ` region: 'us-east-1',`

   ` credentials: Aws::Credentials.new('ACCESS_KEY','SECRET_KEY')}`

1. 获取 AMS CTs：

   `ams_cm = Aws::amscm::Client.new(config)`

   `cts = ams_cm.list_change_type_classification_summaries`

   `print(cts)`

## AMS API 转 Java 示例
<a name="java-list-ct-summaries"></a>

要在 Java 中使用 AMS API，请安装 Jav AWS a SDK 和 AMS CLI。按照以下步骤进行操作：

1. 安装 AMS CLI。请参阅[安装或升级 AMS CLI](understand-sent-api.md#install-sent-cli)。

1. 安装 AWS Java 开发工具包。参见 [Amazon Web Services 工具](https://aws.amazon.com/tools/)。

1. 使用以下命令配置 Java：

   `import com.amazonaws.auth.BasicAWSCredentials;`

   `import com.amazonaws.services.amscm.model.AWSManagedServicesCMClient;`

   `import com.amazonaws.services.amscm.model.ListChangeTypeClassificationSummariesRequest;`

   `import com.amazonaws.services.amscm.model.ListChangeTypeClassificationSummariesResult;`

   `public static void getChangeTypeClassificationSummaries() {`

1. 设置凭证。我们建议您不要对此进行硬编码。

   `final BasicAWSCredentials awsCredsCm = `

   ` new BasicAWSCredentials("ACCESS_KEY", "SECRET_KEY");`

1. 创建 AMS 变更管理客户端：

   `final AWSManagedServicesCMClient cmClient =`

   ` new AWSManagedServicesCMClient(awsCredsCm);`

1. 获取 AMS CTs：

   `final ListChangeTypeClassificationSummariesRequest listCtsRequest = new ListChangeTypeClassification SummariesRequest();`

   `final ListChangeTypeClassificationSummariesResult listCtsResult =`

   `cmClient.listChangeTypeClassificationSummaries(listCtsRequest);`

   `System.out.println("List of CTs");`

   `listCtsResult.getChangeTypeClassificationSummaries().stream()`

   `.map(x -> x.getCategory() + "/" + x.getSubcategory() + "/" + x.getItem() + "/" + x.getOperation())`

   `.forEach(System.out::println);`

   `}`