

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

AWS Managed Services (AMS) API 與其他 APIs 類似。 AWS 您可以在 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、部署新執行個體、更新和刪除執行個體、取得 CTs的相關資訊，以及建立 AMIs。HTTP 端點為：

  `https://amscm.us-east-1.amazonaws.com`
+ SKMS：使用此 API 取得基礎設施的相關資訊，包括 VPCs、堆疊、子網路和 AMIs。HTTP 端點為：

  `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](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html)、[macOS](https://docs.aws.amazon.com/cli/latest/userguide/cli-install-macos.html)、[虛擬環境](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-virtualenv.html)、 [Bundled Installer (Linux、macOS 或 Unix) ](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-bundle.html)的說明。

   安裝之後，請執行 `aws help`來驗證安裝。

1. 安裝 AWS CLI 後，若要安裝或升級 AMS CLI，請下載 AMS **AMS CLI** 或 **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。
   + SDK zip：提供所有 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** 目錄及其內容必須與 **AWSManagedServices\$1InstallCLI.sh** 檔案位於相同的目錄中。

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，請參閱[適用於 Amazon Web Services 的工具](https://aws.amazon.com/tools/)並向下捲動至SDKs區段。每個 SDK 安裝程式都包含具有其他程式碼片段的 README。

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

安裝 AMS CLI （需要 AWS CLI；請參閱 [安裝或升級 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. 安裝 boto3，適用於 Python 的 AWS SDK。如需詳細資訊，請參閱此部落格文章[現已推出 – AWS SDK for Python (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 執行個體和/或使用 Lambda 的一些範例。

#### 建立 EC2 的 Python 範例
<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 模型。做為更具體的 re： packaging 範例，以下是 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 函數程式碼範例 (lambda-amscm-test.py 的內容）**：

```
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
```

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

若要搭配 Ruby 使用 AMS API，請安裝 AWS Ruby 開發套件和 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，請安裝 AWS Java 開發套件和 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);`

   `}`