

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

# 演练：创建自定义扩展 AWS AppConfig
<a name="working-with-appconfig-extensions-creating-custom"></a>

要创建自定义 AWS AppConfig 扩展模块，请完成以下任务。在后面的主题中将更详细地介绍每个任务。

**注意**  
你可以在以下网址查看自定义 AWS AppConfig 扩展程序的示例 GitHub：  
[Sample extension that prevents deployments with a `blocked day` moratorium calendar using Systems Manager Change Calendar](https://github.com/aws-samples/aws-appconfig-change-calendar-extn)
[Sample extension that prevents secrets from leaking into configuration data using git-secrets](https://github.com/aws-samples/aws-appconfig-git-secrets-extn)
[Sample extension that prevents personally identifiable information (PII) from leaking into configuration data using Amazon Comprehend](https://github.com/aws-samples/aws-appconfig-pii-extn)

**1. [创建 AWS Lambda 函数](https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions-creating-custom-lambda.html)**  
对于大多数用例，要创建自定义扩展，必须创建一个 AWS Lambda 函数来执行扩展中定义的任何计算和处理。此规则的一个例外是，您创建了 [AWS 创作的通知扩展程序](https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions-about-predefined.html)的*自定义*版本来添加或删除操作点。有关此例外的更多详细信息，请参阅 [步骤 3：创建自定义 AWS AppConfig 扩展](working-with-appconfig-extensions-creating-custom-extensions.md)。

**2. [为您的自定义扩展程序配置权限](https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions-creating-custom-permissions.html)**  
若要为自定义扩展程序配置权限，可以执行下列操作之一：  
+ 创建包含`InvokeFunction`权限的 AWS Identity and Access Management (IAM) 服务角色。
+ 使用 Lambda [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html)API 操作创建资源策略。
此预排描述如何创建 IAM 服务角色。

**3. [创建扩展](https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions-creating-custom-extensions.html)**  
您可以使用 AWS AppConfig 控制台或从 AWS CLI、 AWS Tools for PowerShell或 SDK 中调用 [CreateExtension](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_CreateExtension.html)API 操作来创建扩展。本演练使用控制台。

**4. [创建扩展关联](https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions-creating-custom-association.html)**  
您可以使用 AWS AppConfig 控制台或从 AWS CLI、 AWS Tools for PowerShell或 SDK 调用 [CreateExtensionAssociation](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_CreateExtensionAssociation.html)API 操作来创建扩展关联。本演练使用控制台。

**5. 执行调用扩展程序的操作**  
创建关联后，当扩展定义的操作点出现在该资源上时，将 AWS AppConfig 调用该扩展。例如，如果关联包含 `PRE_CREATE_HOSTED_CONFIGURATION_VERSION` 操作的扩展程序，则每次创建新的托管配置版本时都会调用该扩展程序。

本节中的主题介绍创建自定义 AWS AppConfig 扩展程序所涉及的每个任务。每个任务都在一个使用案例的上下文中进行描述，在该用例中，客户希望创建一个扩展程序，该扩展程序会自动将配置备份到 Amazon Simple Storage Service (Amazon S3) 存储桶。每当创建 (`PRE_CREATE_HOSTED_CONFIGURATION_VERSION`) 或部署 (`PRE_START_DEPLOYMENT`) 托管配置时，扩展程序就会运行。

**Topics**
+ [步骤 1：为自定义扩展程序创建 Lambda 函数 AWS AppConfig](working-with-appconfig-extensions-creating-custom-lambda.md)
+ [步骤 2：为自定义 AWS AppConfig 扩展程序配置权限](working-with-appconfig-extensions-creating-custom-permissions.md)
+ [步骤 3：创建自定义 AWS AppConfig 扩展](working-with-appconfig-extensions-creating-custom-extensions.md)
+ [步骤 4：为自定义扩展程序创建 AWS AppConfig 扩展关联](working-with-appconfig-extensions-creating-custom-association.md)

# 步骤 1：为自定义扩展程序创建 Lambda 函数 AWS AppConfig
<a name="working-with-appconfig-extensions-creating-custom-lambda"></a>

对于大多数用例，要创建自定义扩展，必须创建一个 AWS Lambda 函数来执行扩展中定义的任何计算和处理。本节包括自定义 AWS AppConfig 扩展的 Lambda 函数示例代码。本部分还包括有效负载请求和响应参考详细信息。有关创建 Lambda 函数的更多信息，请参阅 *AWS Lambda 开发人员指南*中的 [Lambda 入门](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)。

## 代码示例
<a name="working-with-appconfig-extensions-creating-custom-lambda-code-sample"></a>

以下 Lambda 函数的示例代码在调用时会自动将 AWS AppConfig 配置备份到 Amazon S3 存储桶。每当创建或部署新配置时，都会备份该配置。该示例使用扩展程序参数，因此不必在 Lambda 函数中对存储桶名称进行硬编码。通过使用扩展程序参数，用户可以将扩展程序附加到多个应用程序，并将配置备份到不同的存储桶。代码示例包含用于进一步解释该函数的注释。

**扩展程序的 Lambda 函数示例 AWS AppConfig **

```
from datetime import datetime
import base64
import json

import boto3


def lambda_handler(event, context):
    print(event)
    
    # Extensions that use the PRE_CREATE_HOSTED_CONFIGURATION_VERSION and PRE_START_DEPLOYMENT 
    # action points receive the contents of AWS AppConfig configurations in Lambda event parameters.
    # Configuration contents are received as a base64-encoded string, which the lambda needs to decode 
    # in order to get the configuration data as bytes. For other action points, the content 
    # of the configuration isn't present, so the code below will fail.
    config_data_bytes = base64.b64decode(event["Content"])
    
    # You can specify parameters for extensions. The CreateExtension API action lets you define  
    # which parameters an extension supports. You supply the values for those parameters when you 
    # create an extension association by calling the CreateExtensionAssociation API action.
    # The following code uses a parameter called S3_BUCKET to obtain the value specified in the 
    # extension association. You can specify this parameter when you create the extension 
    # later in this walkthrough.
    extension_association_params = event.get('Parameters', {})
    bucket_name = extension_association_params['S3_BUCKET']
    write_backup_to_s3(bucket_name, config_data_bytes)
    
    # The PRE_CREATE_HOSTED_CONFIGURATION_VERSION and PRE_START_DEPLOYMENT action points can 
    # modify the contents of a configuration. The following code makes a minor change 
    # for the purposes of a demonstration.
    old_config_data_string = config_data_bytes.decode('utf-8')
    new_config_data_string = old_config_data_string.replace('hello', 'hello!')
    new_config_data_bytes = new_config_data_string.encode('utf-8')
    
    # The lambda initially received the configuration data as a base64-encoded string 
    # and must return it in the same format.
    new_config_data_base64string = base64.b64encode(new_config_data_bytes).decode('ascii')
    
    return {
        'statusCode': 200,
        # If you want to modify the contents of the configuration, you must include the new contents in the 
        # Lambda response. If you don't want to modify the contents, you can omit the 'Content' field shown here.
        'Content': new_config_data_base64string
    }


def write_backup_to_s3(bucket_name, config_data_bytes):
    s3 = boto3.resource('s3')
    new_object = s3.Object(bucket_name, f"config_backup_{datetime.now().isoformat()}.txt")
    new_object.put(Body=config_data_bytes)
```

如果要在本演练中使用此示例，请使用名称 **MyS3ConfigurationBackUpExtension** 保存它，并复制该函数的 Amazon 资源名称（ARN）。在下一节中创建 AWS Identity and Access Management (IAM) 代入角色时，您将指定 ARN。您可以在创建扩展程序时指定 ARN 和名称。

## 有效负载参考
<a name="working-with-appconfig-extensions-creating-custom-lambda-payload"></a>

本节包括使用自定义 AWS AppConfig 扩展程序的有效载荷请求和响应参考详细信息。

**请求结构**  
*AtDeploymentTick*

```
{
    'InvocationId': 'o2xbtm7',
    'Parameters': {
        'ParameterOne': 'ValueOne',
        'ParameterTwo': 'ValueTwo'
    },
    'Type': 'OnDeploymentStart',
    'Application': {
        'Id': 'abcd123'
    },
    'Environment': {
        'Id': 'efgh456'
    },
    'ConfigurationProfile': {
        'Id': 'ijkl789',
        'Name': 'ConfigurationName'
    },
    'DeploymentNumber': 2,
    'Description': 'Deployment description',
    'ConfigurationVersion': '2',
    'DeploymentState': 'DEPLOYING',
    'PercentageComplete': '0.0'
}
```

**请求结构**  
*PreCreateHostedConfigurationVersion*

```
{
    'InvocationId': 'vlns753', // id for specific invocation
    'Parameters': {
        'ParameterOne': 'ValueOne',
        'ParameterTwo': 'ValueTwo'
    },
    'ContentType': 'text/plain',
    'ContentVersion': '2',
    'Content': 'SGVsbG8gZWFydGgh', // Base64 encoded content
    'Application': {
        'Id': 'abcd123',
        'Name': 'ApplicationName'
    },
    'ConfigurationProfile': {
        'Id': 'ijkl789',
        'Name': 'ConfigurationName'
    },
    'Description': '',
    'Type': 'PreCreateHostedConfigurationVersion',
    'PreviousContent': {
        'ContentType': 'text/plain',
        'ContentVersion': '1',
        'Content': 'SGVsbG8gd29ybGQh'
    }
}
```

*PreStartDeployment*

```
{
    'InvocationId': '765ahdm',
    'Parameters': {
        'ParameterOne': 'ValueOne',
        'ParameterTwo': 'ValueTwo'
    },
    'ContentType': 'text/plain',
    'ContentVersion': '2',
    'Content': 'SGVsbG8gZWFydGgh',
    'Application': {
        'Id': 'abcd123',
        'Name': 'ApplicationName'
    },
    'Environment': {
        'Id': 'ibpnqlq',
        'Name': 'EnvironmentName'
    },
    'ConfigurationProfile': {
        'Id': 'ijkl789',
        'Name': 'ConfigurationName'
    },
    'DeploymentNumber': 2,
    'Description': 'Deployment description',
    'Type': 'PreStartDeployment'
}
```

**异步事件**  


*OnStartDeployment, OnDeploymentStep, OnDeployment*

```
{
    'InvocationId': 'o2xbtm7',
    'Parameters': {
        'ParameterOne': 'ValueOne',
        'ParameterTwo': 'ValueTwo'
    },
    'Type': 'OnDeploymentStart',
    'Application': {
        'Id': 'abcd123'
    },
    'Environment': {
        'Id': 'efgh456'
    },
    'ConfigurationProfile': {
        'Id': 'ijkl789',
        'Name': 'ConfigurationName'
    },
    'DeploymentNumber': 2,
    'Description': 'Deployment description',
    'ConfigurationVersion': '2'
}
```

**响应结构**  
以下示例显示了您的 Lambda 函数在响应自定义 AWS AppConfig 扩展程序的请求时返回的内容。

*PRE\$1\$1 同步事件 - 成功响应*

如果要转换内容，请使用以下命令：

```
"Content": "SomeBase64EncodedByteArray"
```

*AT\$1\$1 同步事件 - 成功响应*

如果您想控制部署的后续步骤（继续部署或回滚部署），请在响应中设置 `Directive` 和 `Description` 属性。

```
"Directive": "ROLL_BACK"
"Description" "Deployment event log description"
```

`Directive` 支持两个值：`CONTINUE` 或 `ROLL_BACK`。在您的有效载荷响应中使用这些枚举来控制部署的后续步骤。

*同步事件 - 成功响应*

如果要转换内容，请使用以下命令：

```
"Content": "SomeBase64EncodedByteArray"
```

如果不想转换内容，则不返回任何内容。

*异步事件 - 成功响应*

无返回内容。

*所有错误事件*

```
{
        "Error": "BadRequestError",
        "Message": "There was malformed stuff in here",
        "Details": [{
            "Type": "Malformed",
            "Name": "S3 pointer",
            "Reason": "S3 bucket did not exist"
        }]
    }
```

# 步骤 2：为自定义 AWS AppConfig 扩展程序配置权限
<a name="working-with-appconfig-extensions-creating-custom-permissions"></a>

使用以下过程创建和配置 AWS Identity and Access Management (IAM) 服务角色（或*代入角色*）。 AWS AppConfig 使用此角色来调用 Lambda 函数。

**创建 IAM 服务角色并 AWS AppConfig 允许代入该角色**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**角色**，然后选择**创建角色**。

1. 在**选择可信实体类型**下，选择**自定义信任策略**。

1. 将以下 JSON 策略粘贴到**自定义信任策略**字段中。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "appconfig.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

   选择**下一步**。

1. 在**附加权限**页面上，选择**创建策略**。此时将在新选项卡中打开**创建策略**页面。

1. 选择 **JSON** 选项卡，然后将以下权限策略粘贴到编辑器中。`lambda:InvokeFunction` 操作用于 `PRE_*` 操作点。`lambda:InvokeAsync` 操作用于 `ON_*` 操作点。*Your Lambda ARN*替换为您的 Lambda 的亚马逊资源名称 (ARN)。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "VisualEditor0",
         "Effect": "Allow",
         "Action": [
           "lambda:InvokeFunction",
           "lambda:InvokeAsync"
         ],
         "Resource": "arn:aws:lambda:us-east-1:111122223333:function:function-name"
       }
     ]
   }
   ```

------

1. 选择**下一步：标签**。

1. 在 **添加标签 （可选）** 页面上，添加一个或多个键值对，然后选择**下一步： 审核**。

1. 在 **Review policy**（检查策略）页面上输入一个名称和描述，然后选择 **Create policy**（创建策略）。

1. 在自定义信任策略的浏览器选项卡上，选择刷新图标，然后搜索您刚刚创建的权限策略。

1. 选择权限策略对应的复选框，然后选择**下一步**。

1. 在**名称、审查和创建**页面上，在**角色名称**框中输入名称，然后输入描述。

1. 选择 **Create role (创建角色)**。系统将让您返回到 **角色** 页面。在横幅中选择**查看角色**。

1. 复制 ARN。您可以在创建扩展程序时指定此 ARN。

# 步骤 3：创建自定义 AWS AppConfig 扩展
<a name="working-with-appconfig-extensions-creating-custom-extensions"></a>



扩展程序定义了它在 AWS AppConfig 工作流程中执行的一个或多个操作。例如， AWS 创作的`AWS AppConfig deployment events to Amazon SNS`扩展程序包括向 Amazon SNS 主题发送通知的操作。每个操作都是在您与之交互 AWS AppConfig 或代表您执行流程时 AWS AppConfig 调用的。这些被称为*行动要点*。 AWS AppConfig 扩展支持以下操作要点：

**PRE\$1\$1 操作点**：在 `PRE_*` 操作点上配置的扩展操作在请求验证之后应用，但在 AWS AppConfig 执行与操作点名称对应的活动之前。这些操作调用与请求同时处理。如果发出多个请求，则操作调用将按顺序运行。另请注意，`PRE_*` 操作点接收并可以更改配置的内容。 `PRE_*` 操作点还可以响应错误并防止操作发生。
+ `PRE_CREATE_HOSTED_CONFIGURATION_VERSION`
+ `PRE_START_DEPLOYMENT`

**ON\$1\$1 操作点**：扩展也可以使用`ON_*`操作点与 AWS AppConfig 工作流程并行运行。 `ON_*`操作点是异步调用的。 `ON_*`操作点不接收配置的内容。如果扩展程序在 `ON_*` 操作点期间遇到错误，服务将忽略该错误并继续工作流。
+ `ON_DEPLOYMENT_START`
+ `ON_DEPLOYMENT_STEP`
+ `ON_DEPLOYMENT_BAKING`
+ `ON_DEPLOYMENT_COMPLETE`
+ `ON_DEPLOYMENT_ROLLED_BACK`

**AT\$1\$1 操作点**：在 `AT_*` 操作点上配置的扩展操作是同步调用的，并与 AWS AppConfig 工作流并行。如果扩展在 `AT_*` 操作点期间遇到错误，服务将停止工作流并回滚部署。
+ `AT_DEPLOYMENT_TICK`

`AT_DEPLOYMENT_TICK` 操作点支持第三方监控集成。`AT_DEPLOYMENT_TICK` 在配置部署处理编排期间被调用。如果您使用第三方监控解决方案（例如 Datadog 或 New Relic），则可以创建一个 AWS AppConfig 扩展程序来检查`AT_DEPLOYMENT_TICK`操作点的警报，并作为安全护栏，在部署触发警报时将其撤回。

如果您使用第三方监控解决方案，例如Datadog或New Relic，则可以创建一个 AWS AppConfig 扩展程序来检查`AT_DEPLOYMENT_TICK`操作点的警报，并作为安全护栏，在部署触发警报时将其撤回。有关更多信息，请参阅以下 Datadog 和 New Relic 集成示例： GitHub
+ [Datadog](https://github.com/aws-samples/aws-appconfig-tick-extn-for-datadog)
+ [New Relic](https://github.com/aws-samples/sample-aws-appconfig-tick-extn-for-newrelic)

有关 AWS AppConfig 扩展的更多信息，请参阅以下主题：
+ [使用扩展程序扩展 AWS AppConfig 工作流程](working-with-appconfig-extensions.md)
+ [演练：创建自定义扩展 AWS AppConfig](working-with-appconfig-extensions-creating-custom.md)

**示例 扩展程序**  
以下示例扩展程序定义了一个调用 `PRE_CREATE_HOSTED_CONFIGURATION_VERSION` 操作点的操作。在 `Uri` 字段中，该操作指定在本演练前面创建的 `MyS3ConfigurationBackUpExtension` Lambda 函数的 Amazon 资源名称（ARN）。该操作还指定了本演练前面创建的 AWS Identity and Access Management (IAM) 代入角色 ARN。

** AWS AppConfig 扩展示例**

```
{
    "Name": "MySampleExtension",
    "Description": "A sample extension that backs up configurations to an S3 bucket.",
    "Actions": {
        "PRE_CREATE_HOSTED_CONFIGURATION_VERSION": [
            {
                "Name": "PreCreateHostedConfigVersionActionForS3Backup",
                "Uri": "arn:aws:lambda:aws-region:111122223333:function:MyS3ConfigurationBackUpExtension",
                "RoleArn": "arn:aws:iam::111122223333:role/ExtensionsTestRole"
            }
        ]
    },
    "Parameters" : {
        "S3_BUCKET": {
            "Required": false
        }
    }
}
```

**注意**  
要查看创建扩展程序时的请求语法和字段描述，请参阅 *AWS AppConfig API 参考*中的[CreateExtension](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_CreateExtension.html)主题。

**创建扩展程序（控制台）**

1. 在 [https://console.aws.amazon.com/systems-manager/appconfig](https://console.aws.amazon.com/systems-manager/appconfig/)/上打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **AWS AppConfig**。

1. 在 **扩展程序** 选项卡上，选择 **创建扩展程序**。

1. 对于 **扩展程序名称**，输入唯一的名称。在本演练中，请输入 **MyS3ConfigurationBackUpExtension**。（可选）输入描述。

1. 在 **操作** 部分中，选择 **添加新操作**。

1. 对于 **操作名称**，输入唯一的名称。在本演练中，请输入 **PreCreateHostedConfigVersionActionForS3Backup**。此名称描述操作使用的操作点和扩展程序目的。

1. 在**操作点**列表中，选择 PRE\$1C **REATE\$1HOSTED\$1CONFIGURATION\$1VERSION**。

1. **对于 **Uri**，选择 **Lambda 函数**，然后在 Lambda 函数列表中选择该函数。**如果您没有看到自己的函数，请确认您与创建函数的 AWS 区域 位置相同。

1. 对于 **IAM 角色**，选择您之前在本演练中创建的角色。

1. 在 **扩展参数（可选）** 部分中，选择**添加新参数**。

1. 对于**参数名称**，请输入名称。在本演练中，请输入 **S3\$1BUCKET**。

1. 重复步骤 5-11，为 `PRE_START_DEPLOYMENT` 操作点创建第二个操作。

1. 选择 **创建扩展程序**。

# 自定义 AWS 创作的附加通知信息
<a name="working-with-appconfig-extensions-creating-custom-notification"></a>

您无需创建 Lambda 或扩展即可使用 [AWS 编写的通知扩展程序](https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions-about-predefined.html)。您只需创建一个扩展程序关联，然后执行调用其中一个支持的操作点的操作即可。默认情况下， AWS 创作的附加通知信息支持以下操作点：
+ `ON_DEPLOYMENT_START`
+ `ON_DEPLOYMENT_COMPLETE`
+ `ON_DEPLOYMENT_ROLLED_BACK`

如果创建 `AWS AppConfig deployment events to Amazon SNS` 扩展程序和 `AWS AppConfig deployment events to Amazon SQS` 扩展程序的自定义版本，则可以指定要接收其通知的操作点。

**注意**  
`AWS AppConfig deployment events to EventBridge` 扩展不支持 `PRE_*` 操作点。如果要移除分配给创 AWS 作版本的一些默认操作点，则可以创建自定义版本。

如果您创建 AWS 创作的通知扩展程序的自定义版本，则无需创建 Lambda 函数。您只需在新扩展程序版本的 `Uri` 字段中指定 Amazon 资源名称（ARN）。
+ 对于自定义附加 EventBridge 通知信息，请在字段中输入 EventBridge 默认事件的 ARN。`Uri`
+ 对于自定义 Amazon SNS 通知扩展，请在 `Uri` 字段中输入 Amazon SNS 主题的 ARN。
+ 对于自定义 Amazon SQS 通知扩展，请在 `Uri` 字段中输入 Amazon SQS 消息队列的 ARN。

# 步骤 4：为自定义扩展程序创建 AWS AppConfig 扩展关联
<a name="working-with-appconfig-extensions-creating-custom-association"></a>

要创建扩展或配置创 AWS 作的扩展，您需要定义在使用特定 AWS AppConfig 资源时调用扩展的操作点。例如，您可以选择运行 `AWS AppConfig deployment events to Amazon SNS` 扩展程序，并在为特定应用程序启动配置部署时接收有关 Amazon SNS 主题的通知。定义哪些操作点调用特定 AWS AppConfig 资源的扩展称为*扩展关联*。扩展关联是扩展与 AWS AppConfig 资源（例如应用程序或配置配置文件）之间的指定关系。

单个 AWS AppConfig 应用程序可以包含多个环境和配置文件。如果将扩展程序与应用程序或环境相关联，则会为与应用程序或环境资源相关的所有工作流程 AWS AppConfig 调用该扩展（如果适用）。

例如，假设你有一个名为的 AWS AppConfig 应用程序 MobileApps ，其中包含一个名为的配置文件 AccessList。假设该 MobileApps 应用程序包括测试版、集成和生产环境。您可以为创 AWS 作的 Amazon SNS 通知扩展信息创建扩展关联，并将该扩展程序与应用程序关联。 MobileApps 每当将应用程序的配置部署到三个环境中的任何一个时，都会调用 Amazon SNS 通知扩展程序。

使用以下过程通过 AWS AppConfig 控制台创建 AWS AppConfig 扩展关联。

**创建扩展程序关联（控制台）**

1. 在 [https://console.aws.amazon.com/systems-manager/appconfig](https://console.aws.amazon.com/systems-manager/appconfig/)/上打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **AWS AppConfig**。

1. 在**扩展程序**选项卡上，为扩展程序选择一个选项按钮，然后选择**添加到资源**。在本演练中，请选择 **MyS ConfigurationBackUpExtension** 3。

1. 在**扩展资源详细信息**部分的**资源类型**中，选择一种 AWS AppConfig 资源类型。根据您选择的资源， AWS AppConfig 会提示您选择其他资源。在本演练中，请选择**应用程序**。

1. 在列表中选择应用程序。

1. 在**参数**部分中，验证**键**字段中是否列出了 **S3\$1BUCKET**。在**值**字段中，粘贴 Lambda 扩展程序的 ARN。例如：`arn:aws:lambda:aws-region:111122223333:function:MyS3ConfigurationBackUpExtension`。

1. 选择**创建与资源的关联**。

创建关联后，可以通过创建一个新的配置文件来调用 `MyS3ConfigurationBackUpExtension` 扩展程序，该配置文件会对其 `SourceUri` 指定 `hosted`。在创建新配置的工作流程中， AWS AppConfig 会遇到`PRE_CREATE_HOSTED_CONFIGURATION_VERSION`操作点。遇到此操作点会调用 `MyS3ConfigurationBackUpExtension` 扩展，该扩展程序会自动将新创建的配置备份到此扩展程序关联中 `Parameter` 部分指定的 S3 存储桶。