

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

# 外部引擎用于 AWS Service Catalog
<a name="external-engine"></a>

在中 AWS Service Catalog，*外部引擎*通过`EXTERNAL`产品类型表示。该`EXTERNAL`产品类型允许集成第三方配置引擎，例如 Terraform。您可以使用外部引擎将 Service Catalog 的功能扩展到原生 AWS CloudFormation 模板之外，从而允许使用其他基础设施即代码 (IaC) 工具。

该`EXTERNAL`产品类型允许您使用熟悉的 Service Catalog 界面管理和部署资源，同时利用所选 IaC 工具的特定功能和语法。

要在 Service Catalog 中启用`EXTERNAL`产品类型，您必须在账户中定义一组标准资源。这些资源被称为引*擎*。Service Catalog 在工件解析和置备操作的特定时刻将任务委派给引擎。

*配置工件*代表 Service Catalog 中产品的特定版本，允许您管理和部署一致的资源。

当您为`EXTERNAL`产品类型的配置对象调用 AWS Service Catalog[DescribeProvisioningArtifact](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_DescribeProvisioningArtifact.html)或[DescribeProvisioningParameters](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_DescribeProvisioningParameters.html)操作时，Service Catalog 会调用引擎中的一个 AWS Lambda 函数。这是从提供的置备工件中提取参数列表并将其返回到所必需的 AWS Service Catalog。这些参数稍后将作为配置过程的一部分使用。

当您通过调用`EXTERNAL`配置对象时 [ProvisionProduct](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_ProvisionProduct.html)，Service Catalog 会首先在内部执行一些操作，然后向引擎中的 Amazon SQS 队列发送消息。接下来，引擎扮演提供的*启动角色*（您作为启动约束分配给产品的 IAM 角色），根据提供的配置项目配置资源，并调用 [NotifyProvisionProductEngineWorkflowResult](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_NotifyProvisionProductEngineWorkflowResult.html)API 来报告成功或失败。

对[UpdateProvisionedProduct](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_UpdateProvisionedProduct.html)和的呼叫处理方式类似，每个呼叫[TerminateProvisionedProduct](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_TerminateProvisionedProduct.html)都有不同的队列和 Notify APIs：
+ [NotifyProvisionProductEngineWorkflowResult](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_NotifyProvisionProductEngineWorkflowResult.html)
+ [NotifyUpdateProvisionedProductEngineWorkflowResult](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_NotifyUpdateProvisionedProductEngineWorkflowResult.html)
+ [NotifyTerminateProvisionedProductEngineWorkflowResult](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_NotifyTerminateProvisionedProductEngineWorkflowResult.html).

**Topics**
+ [注意事项](#external-engine-considerations)
+ [参数解析](#external-engine-parameters)
+ [预置](#external-engine-provisioning)
+ [Updating](#external-engine-updating)
+ [正在终止](#external-engine-terminating)
+ [标签](#external-engine-tagging)

## 注意事项
<a name="external-engine-considerations"></a>

**每个中心账户只能使用一个外部引擎**

每个 Service Catalog 中心账户只能使用一个`EXTERNAL`配置引擎。Service Catalog *hub-and-spoke*模型允许中心账户创建基准产品并共享产品组合，而分支账户则可以导入产品组合并利用产品。

此限制是因为`EXTERNAL`只能路由到一个账户中的一个引擎。如果管理员想要拥有多个外部引擎，则管理员必须在不同的中心帐户中设置外部引擎（以及产品组合和产品）。

**外部引擎仅支持有启动限制的启动角色**

`EXTERNAL`配置对象仅支持使用启动*限制*指定的启动角色进行置备。启动约束指定 Service Catalog 在最终用户启动、更新或终止产品时所扮演的 IAM 角色。有关启动限制的更多信息，请参阅[AWS Service Catalog 启动限制](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/constraints-launch.html)。

## 参数解析
<a name="external-engine-parameters"></a>

`EXTERNAL`配置对象可以是任何格式。这意味着，在创建`EXTERNAL`产品类型时，引擎需要从提供的置备工件中提取参数列表并将其返回到 Service Catalog。这是通过在您的账户中创建一个 Lambda 函数来完成的，该函数可以接受以下请求格式、处理配置项目并返回以下响应格式。

**重要**  
必须为 Lambda 函数命名。`ServiceCatalogExternalParameterParser`

**请求语法：**

```
{
    "artifact": {
        "path": "string",
        "type": "string"
    },
    "launchRoleArn": "string"
}
```


****  

| **字段** | **Type** | **必填** | **描述** | 
| --- | --- | --- | --- | 
| 项目 | 对象 | 是 | 要解析的工件的详细信息。 | 
| 工件/路径 | 字符串 | 是 | 解析器下载工件的位置。例如，对于AWS\$1S3，这是亚马逊 S3 的 URI。 | 
| 工件/类型 | 字符串 | 是 | 神器类型。允许的值：AWS\$1S3。 | 
| LaunchRole | 字符串 | 否 | 下载项目时要扮演的启动角色的 Amazon 资源名称 (ARN)。如果未提供启动角色，则使用 Lambda 的执行角色。 | 

**响应语法：**

```
{
    "parameters": [
        {
            "key": "string"
            "defaultValue": "string",
            "type": "string",
            "description": "string",
            "isNoEcho": boolean
        },
    ]
}
```


****  

| **字段** | **Type** | **必填** | **描述** | 
| --- | --- | --- | --- | 
| 参数 | 列表 | 是 | Service Catalog 要求最终用户在置备产品或更新预配置产品时提供的参数列表。如果在构件中未定义任何参数，则返回一个空列表。 | 
| 键 | 字符串 | 是 | 参数键。 | 
| defaultValue | 字符串 | 否 | 如果最终用户未提供值，则为参数的默认值。 | 
| 类型 | 字符串 | 是 | 引擎参数值的预期类型。例如，字符串、布尔值或映射。允许的值因每个引擎而异。Service Catalog 将每个参数值作为字符串传递给引擎。 | 
| 描述 | 字符串 | 否 | 参数的描述。建议将其设置为用户友好型。 | 
| isNoEcho | 布尔值 | 否 | 确定参数值是否未在日志中回显。默认值为 false（参数值会被回显）。 | 

## 预置
<a name="external-engine-provisioning"></a>

对于该[ProvisionProduct](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_ProvisionProduct.html)操作，Service Catalog 将资源的实际配置委托给引擎。该引擎负责与您选择的 IaC 解决方案（例如 Terraform）接口，以配置工件中定义的资源。引擎还负责将结果通知 Service Catalog。

Service Catalog 会将所有配置请求发送到您的账户中名为的 Amazon SQS 队列。`ServiceCatalogExternalProvisionOperationQueue`

**请求语法：**

```
{
    "token": "string",
    "operation": "string",
    "provisionedProductId": "string",
    "provisionedProductName": "string",
    "productId": "string",
    "provisioningArtifactId": "string",
    "recordId": "string",
    "launchRoleArn": "string",
    "artifact": {
        "path": "string",
        "type": "string"
    },
    "identity": {
        "principal": "string",
        "awsAccountId": "string",
        "organizationId": "string"
    },
    "parameters": [
        {
            "key": "string",
            "value": "string"
        }
    ],
    "tags": [
        {
            "key": "string",
            "value": "string"
        }
    ]
}
```


****  

| **字段** | **Type** | **必填** | **描述** | 
| --- | --- | --- | --- | 
| token | 字符串 | 是 | 标识此操作的标记。必须将令牌返回到 Service Catalog 才能通知执行结果。 | 
| operation | 字符串 | 是 | 此字段必须PROVISION\$1PRODUCT用于此操作。 | 
| provisionedProductId | 字符串 | 是 | 预配置产品的 ID。 | 
| provisionedProductName | 字符串 | 是 | 预配置产品的名称。 | 
| 产品编号 | 字符串 | 是 | 产品的 ID。 | 
| provisioningArtifactId | 字符串 | 是 | 置备工件的 ID。 | 
| recordId | 字符串 | 是 | 此操作的 Service Catalog 记录的 ID。 | 
| launchRoleArn | 字符串 | 是 | 用于配置资源的 IAM 角色的亚马逊资源名称 (ARN)。 | 
| 项目 | 对象 | 是 | 定义资源配置方式的工件的详细信息。 | 
| 工件/路径 | 字符串 | 是 | 引擎下载工件的位置。例如，对于AWS\$1S3，这是亚马逊 S3 的 URI。 | 
| 工件/类型 | 字符串 | 是 | 神器类型。允许的值：AWS\$1S3。 | 
| 身份 | 字符串 | 否 | 该字段目前未被使用。 | 
| 参数 | 列表 | 是 | 用户输入到 Service Catalog 作为此操作输入的参数键值对列表。 | 
| 标签 | 列表 | 是 | 作为标签输入到 key-value-pairs Service Catalog 的用户列表，以应用于已配置的资源。 | 

**工作流程结果通知：**

使用 [NotifyProvisionProductEngineWorkflowResult ](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_NotifyProvisionProductEngineWorkflowResult .html)API 详细信息页面上指定的响应对象调用 API。

## Updating
<a name="external-engine-updating"></a>

对于该[UpdateProvisionedProduct](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_UpdateProvisionedProduct.html)操作，Service Catalog 将资源的实际更新委托给引擎。引擎负责与您选择的 IaC 解决方案（例如 Terraform）接口，以更新工件中定义的资源。引擎还负责将结果通知 Service Catalog。

Service Catalog 将所有更新请求发送到您名为的账户中的亚马逊 SQS 队列。`ServiceCatalogExternalUpdateOperationQueue`

**请求语法：**

```
{
    "token": "string",
    "operation": "string",
    "provisionedProductId": "string",
    "provisionedProductName": "string",
    "productId": "string",
    "provisioningArtifactId": "string",
    "recordId": "string",
    "launchRoleArn": "string",
    "artifact": {
        "path": "string",
        "type": "string"
    },
    "identity": {
        "principal": "string",
        "awsAccountId": "string",
        "organizationId": "string"
    },
    "parameters": [
        {
            "key": "string",
            "value": "string"
        }
    ],
    "tags": [
        {
            "key": "string",
            "value": "string"
        }
    ]
}
```


****  

| **字段** | **Type** | **必填** | **描述** | 
| --- | --- | --- | --- | 
| token | 字符串 | 是 | 标识此操作的标记。必须将令牌返回到 Service Catalog 才能通知执行结果。 | 
| operation | 字符串 | 是 | 此字段必须UPDATE\$1PROVISION\$1PRODUCT用于此操作。 | 
| provisionedProductId | 字符串 | 是 | 预配置产品的 ID。 | 
| provisionedProductName | 字符串 | 是 | 预配置产品的名称。 | 
| 产品编号 | 字符串 | 是 | 产品的 ID。 | 
| provisioningArtifactId | 字符串 | 是 | 置备工件的 ID。 | 
| recordId | 字符串 | 是 | 此操作的 Service Catalog 记录的 ID。 | 
| launchRoleArn | 字符串 | 是 | 用于配置资源的 IAM 角色的亚马逊资源名称 (ARN)。 | 
| 项目 | 对象 | 是 | 定义资源配置方式的工件的详细信息。 | 
| 工件/路径 | 字符串 | 是 | 引擎下载工件的位置。例如，对于AWS\$1S3，这是亚马逊 S3 的 URI。 | 
| 工件/类型 | 字符串 | 是 | 神器类型。允许的值：AWS\$1S3。 | 
| 身份 | 字符串 | 否 | 该字段目前未被使用。 | 
| 参数 | 列表 | 是 | 用户输入到 Service Catalog 作为此操作输入的参数键值对列表。 | 
| 标签 | 列表 | 是 | 作为标签输入到 key-value-pairs Service Catalog 的用户列表，以应用于已配置的资源。 | 

**工作流程结果通知：**

使用 [NotifyUpdateProvisionedProductEngineWorkflowResult](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_NotifyUpdateProvisionedProductEngineWorkflowResult.html)API 详细信息页面上指定的响应对象调用 API。

## 正在终止
<a name="external-engine-terminating"></a>

对于该[TerminateProvisionedProduct](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_TerminateProvisionedProduct.html)操作，Service Catalog 将资源的实际终止委托给引擎。引擎负责与您选择的 IaC 解决方案（例如 Terraform）接口，以终止工件中定义的资源。引擎还负责将结果通知 Service Catalog。

Service Catalog 将所有终止请求发送到您的账户中名为的亚马逊 SQS 队列。`ServiceCatalogExternalTerminateOperationQueue`

**请求语法：**

```
{
    "token": "string",
    "operation": "string",
    "provisionedProductId": "string",
    "provisionedProductName": "string",
    "recordId": "string",
    "launchRoleArn": "string",
    "identity": {
        "principal": "string",
        "awsAccountId": "string",
        "organizationId": "string"
    }
}
```


****  

| **字段** | **Type** | **必填** | **描述** | 
| --- | --- | --- | --- | 
| token | 字符串 | 是 | 标识此操作的标记。必须将令牌返回到 Service Catalog 才能通知执行结果。 | 
| operation | 字符串 | 是 | 此字段必须TERMINATE\$1PROVISION\$1PRODUCT用于此操作。 | 
| provisionedProductId | 字符串 | 是 | 预配置产品的 ID。 | 
| provisionedProductName | 字符串 | 是 | 预配置产品的名称。 | 
| recordId | 字符串 | 是 | 此操作的 Service Catalog 记录的 ID。 | 
| launchRoleArn | 字符串 | 是 | 用于配置资源的 IAM 角色的亚马逊资源名称 (ARN)。 | 
| 身份 | 字符串 | 否 | 该字段目前未被使用。 | 

**工作流程结果通知：**

使用 [NotifyTerminateProvisionedProductEngineWorkflowResult](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_NotifyTerminateProvisionedProductEngineWorkflowResult.html)API 详细信息页面上指定的响应对象调用 API。

## 标签
<a name="external-engine-tagging"></a>

要通过 Resource Groups 管理标签，您的启动角色需要以下其他权限声明：

```
{
    "Effect": "Allow",
    "Action": [
        "resource-groups:CreateGroup",
        "resource-groups:ListGroupResources"
    ],
    "Resource": "*"
},
{
    "Effect": "Allow",
    "Action": [
        "tag:GetResources",
        "tag:GetTagKeys",
        "tag:GetTagValues",
        "tag:TagResources",
        "tag:UntagResources"
    ],
    "Resource": "*"
}
```

**注意**  
启动角色还需要对构件中特定资源的标记权限，例如`ec2:CreateTags`。