

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

# CLI 教程：高可用性双层堆栈 (Linux/RHEL)
<a name="tut-create-ha-stack"></a>

本节介绍如何使用 AMS CLI 将高可用性 (HA) 双层堆栈部署到 AMS 环境中。

**注意**  
本部署演练已在 AMZN Linux 和 RHEL 环境中进行了测试。

任务和所需任务摘要 RFCs：

1. 创建基础架构（HA 双层堆栈）

1. 为 CodeDeploy 应用程序创建 S3 存储桶

1. 创建 WordPress 应用程序包并将其上传到 S3 存储桶

1. 使用部署应用程序 CodeDeploy

1. 访问该 WordPress 网站并登录以验证部署

# 开始前的准备工作
<a name="ha-stack-ex-before-begin"></a>

部署 \$1 高级堆栈组件 \$1 高可用性双层堆栈高级 \$1 创建 CT 可创建 Auto Scaling 组、负载均衡器、数据库以及 CodeDeploy 应用程序名称和部署组（与您为应用程序指定的名称相同）。有关信息， CodeDeploy 请参阅[什么是 CodeDeploy？](https://docs.aws.amazon.com/codedeploy/latest/userguide/welcome.html)

本演练使用高可用性双层堆栈（高级）RFC，其中包括 UserData 并描述了如何创建可部署的 WordPress CodeDeploy 捆绑包。

示例中`UserData`显示的通过查询 http://169.254.169.254/latest/meta-data/ 上提供的实例元数据服务，从正在运行的实例中获取 EC2 实例元数据，例如实例 ID、区域等。用户数据脚本中的这一行：`REGION=$(curl 169.254.169.254/latest/meta-data/placement/availability-zone/ | sed 's/[a-z]$//')`，将可用区名称从元数据服务检索到我们支持区域的 \$1REGION 变量中，并使用它来填写下载代理的 S3 存储桶的 URL。 CodeDeploy 169.254.169.254 IP 只能在 VPC 内路由（所有人都可以查询该服务）。 VPCs 有关该服务的信息，请参阅[实例元数据和用户数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)。另请注意，以身份输入 UserData 的脚本以 “root” 用户身份执行，不需要使用 “sudo” 命令。

本演练将以下参数保留为默认值（如图所示）：
+ Auto Scaling 群组：`Cooldown=300, DesiredCapacity=2, EBSOptimized=false, HealthCheckGracePeriod=600, IAMInstanceProfile=customer-mc-ec2-instance-profile, InstanceDetailedMonitoring=true, InstanceRootVolumeIops=0, InstanceRootVolumeType=standard, InstanceType=m3.medium, MaxInstances=2, MinInstances=2, ScaleDownPolicyCooldown=300, ScaleDownPolicyEvaluationPeriods=4, ScaleDownPolicyPeriod=60, ScaleDownPolicyScalingAdjustment=-1, ScaleDownPolicyStatistic=Average, ScaleDownPolicyThreshold=35, ScaleMetricName=CPUUtilization, ScaleUpPolicyCooldown=60, ScaleUpPolicyEvaluationPeriods=2, ScaleUpPolicyPeriod=60, ScaleUpPolicyScalingAdjustment=2, ScaleUpPolicyStatistic=Average, ScaleUpPolicyThreshold=75`。
+ Load Balancer：`HealthCheckInterval=30, HealthCheckTimeout=5`。
+ 数据库：`BackupRetentionPeriod=7, Backups=true, InstanceType=db.m3.medium, IOPS=0, MultiAZ=true, PreferredBackupWindow=22:00-23:00, PreferredMaintenanceWindow=wed:03:32-wed:04:02, StorageEncrypted=false, StorageEncryptionKey="", StorageType=gp2`。
+ 应用程序：`DeploymentConfigName=CodeDeployDefault.OneAtATime`。
+ S3 存储桶：`AccessControl=Private`。

其他设置：

`RequestedStartTime``RequestedEndTime`如果你想安排 RFC：你可以使用 [Time.is 来确定正确的 UT](https://time.is/UTC) C 时间。必须对所提供的示例进行适当调整。如果开始时间已过，RFC 将无法继续。或者，您可以省略这些值以创建一个 ASAP RFC，该RFC将在批准通过后立即执行。

**注意**  
您可以选择设置许多与所示不同的参数。示例中显示的这些参数的值已经过测试，但可能不适合您。

# 创建基础架构
<a name="ex-create-ha-infra-deploy"></a>

在开始之前收集以下数据可以加快部署速度。

必需的数据有堆栈：
+ AutoScalingGroup:
  + `UserData`：本教程中提供了此值。它包括为其设置资源 CodeDeploy 和启动 CodeDeploy 代理的命令。
  + `AMI-ID`：此值决定了您的 Auto Scaling 组 (ASG) 将启动哪种 EC2 实例。请务必在您的账户中选择以 “customer-” 开头且具有所需操作系统的 AMI。 IDs 使用 AMS SKMS API 参考查找 AMI，请参阅 AWS Artifact 控制台的 “**报告**” 选项卡。操作 (CLI: list-amis) 或 AMS 控制台-> 详情页面。 VPCs VPCs 本演练适用于 ASGs 配置为使用 Linux AMI。
+ 数据库：
  + 尽管示例中显示的值已经过测试，但这些参数`EngineVersion`、、和`LicenseModel`应根据您的情况进行设置。`DBEngine`
  + 部署应用程序包时需要`MasterUserPassword`这些参数`RDSSubnetIds``DBName``MasterUsername`、、、和。对于 RDSSubnet ID，请使用两个私有子网。
+ LoadBalancer:
  + 尽管示例中显示的值已经过测试，但这些参数`EngineVersion`、、和`LicenseModel`应根据您的情况进行设置。`DBEngine`
  + `ELBSubnetIds`：使用两个公有子网。
+ 应用程序：该`ApplicationName`值设置 CodeDeploy 应用程序名称和 CodeDeploy 部署组名称。你可以用它来部署你的应用程序。它在账户中必须是唯一的。要查看您的账户中的 CodeDeploy 姓名，请访问 CodeDeploy 控制台。该示例使用 “WordPress”，但是，如果您要使用该值，请确保该值尚未被使用。

此过程使用高可用性双层堆栈（高级）CT（ct-06mjngx5flwto）和创建 S3 存储 CT（ct-1a68ck03fn98r）。在经过身份验证的账户中，在命令行中执行以下步骤。

1. 启动基础架构堆栈。

   1. 将 HA 双层堆栈 CT 的执行参数 JSON 架构输出到当前文件夹中名为 CreateStackParams .json 的文件中。

      ```
      aws amscm get-change-type-version --change-type-id "ct-06mjngx5flwto" --query "ChangeTypeVersion.ExecutionInputSchema" --output text > CreateStackParams.json
      ```

   1. 修改架构。根据需要*variables*更换。例如，对于 ASG 将要创建的 EC2 实例，使用所需的操作系统。记录下来`ApplicationName`，因为您稍后将使用它来部署应用程序。请注意，您最多可以添加 50 个标签。

      ```
      {
      "Description":      "HA two tier stack for WordPress",
      "Name":             "WordPressStack",
      "TimeoutInMinutes":  360,
      "Tags": [
              {
                  "Key": "ApplicationName",
                  "Value": "WordPress"
              }
          ],
      "AutoScalingGroup": {
                  "AmiId":    "AMI-ID",
                  "UserData": "#!/bin/bash \n
                  REGION=$(curl 169.254.169.254/latest/meta-data/placement/availability-zone/ | sed 's/[a-z]$//') \n
                  yum -y install ruby httpd \n
                  chkconfig httpd on \n
                  service httpd start \n
                  touch /var/www/html/status \n
                  cd /tmp \n
                  curl -O https://aws-codedeploy-$REGION.s3.amazonaws.com/latest/install \n
                  chmod +x ./install \n
                  ./install auto \n
                  chkconfig codedeploy-agent on \n
                  service codedeploy-agent start"
          },
          "LoadBalancer": {
              "Public":               true,
              "HealthCheckTarget":    "HTTP:80/status"
          },
          "Database":     {
              "DBEngine":             "MySQL",
              "DBName":               "wordpress",
              "EngineVersion":        "8.0.16 ",
              "LicenseModel":         "general-public-license",
              "MasterUsername":       "admin",
              "MasterUserPassword":   "p4ssw0rd"
          },
          "Application":  {
          "ApplicationName":  "WordPress"
              }
      }
      ```

   1. 将 CreateRfc JSON 模板输出到当前文件夹中名为 CreateStackRfc .json 的文件中：

      ```
      aws amscm create-rfc --generate-cli-skeleton > CreateStackRfc.json
      ```

   1. 按如下方式修改 RFC 模板并保存，即可删除和替换内容。请注意，`RequestedStartTime`和现在`RequestedEndTime`是可选的；排除它们会创建一个 ASAP RFC，该RFC在获得批准后立即执行（通常会自动发生）。要提交计划的 RFC，请添加这些值。

      ```
      {
      "ChangeTypeVersion":    "3.0",
      "ChangeTypeId":         "ct-06mjngx5flwto",
      "Title":                "HA-Stack-For-WP-RFC"
      }
      ```

   1. 创建 RFC，指定 CreateStackRfc .json 文件和.js CreateStackParams on 执行参数文件：

      ```
      aws amscm create-rfc --cli-input-json file://CreateStackRfc.json --execution-parameters file://CreateStackParams.json
      ```

      您在响应中收到 RFC ID。保存 ID 以供后续步骤使用。

   1. 提交 RFC：

      ```
      aws amscm submit-rfc --rfc-id  RFC_ID
      ```

      如果 RFC 成功，则不会收到任何输出。

   1. 要检查 RFC 状态，请运行 

      ```
      aws amscm get-rfc --rfc-id RFC_ID
      ```

   记下 RFC ID。

1. 启动 S3 存储桶

   在开始之前收集以下数据可以加快部署速度。

   必需的数据 S3 存储桶：
   + `VPC-ID`：此值决定您的 S3 存储桶将位于何处。使用您之前使用的 VPC ID。
   + `BucketName`：此值设置 S3 存储桶名称，您可以使用它来上传您的应用程序包。它在账户所在区域内必须是唯一的，并且不能包含大写字母。不要求将您的账户 ID 作为其中的 BucketName 一部分，但可以更轻松地在以后识别存储桶。要查看账户中存在哪些 S3 存储桶名称，请访问您的账户的 Amazon S3 控制台。

   1. 将 S3 存储创建 CT 的执行参数 JSON 架构输出到名为 createS3 StoreParams .json 的 JSON 文件中。

      ```
      aws amscm get-change-type-version --change-type-id "ct-1a68ck03fn98r" --query "ChangeTypeVersion.ExecutionInputSchema" --output text > CreateS3StoreParams.json
      ```

   1. 按如下方式修改架构，可以删除和替换其中的内容。*VPC\$1ID*适当地更换。示例中的值已经过测试，但可能不适合您。
**提示**  
在账户所在区域内`BucketName`必须是唯一的，并且不能包含大写字母。不要求将您的账户 ID 作为其中的 BucketName 一部分，但可以更轻松地在以后识别存储桶。要查看账户中存在哪些 S3 存储桶名称，请访问您的账户的 Amazon S3 控制台。

      ```
      {
      "Description":      "S3BucketForWordPressBundle",
      "VpcId":            "VPC_ID",
      "StackTemplateId":  "stm-s2b72beb000000000",
      "Name":             "S3BucketForWP",
      "TimeoutInMinutes":  60,
      "Parameters":   {
          "AccessControl":    "Private",
          "BucketName":       "ACCOUNT_ID-BUCKET_NAME"
          }
      }
      ```

   1. 将的 JSON 模板输出 CreateRfc 到当前文件夹中名为 createS3 StoreRfc .json 的文件中：

      ```
      aws amscm create-rfc --generate-cli-skeleton > CreateS3StoreRfc.json
      ```

   1. 修改并保存 createS3 StoreRfc .json 文件，你可以删除和替换其中的内容。请注意，`RequestedStartTime`和现在`RequestedEndTime`是可选的；排除它们会创建一个 ASAP RFC，该RFC在获得批准后立即执行（通常会自动发生）。要提交计划的 RFC，请添加这些值。

      ```
      {
      "ChangeTypeVersion":    "1.0",
      "ChangeTypeId":         "ct-1a68ck03fn98r",
      "Title":                "S3-Stack-For-WP-RFC"
      }
      ```

   1. 创建 RFC，指定 createS3 StoreRfc .json 文件和 createS3 .json StoreParams 执行参数文件：

      ```
      aws amscm create-rfc --cli-input-json file://CreateS3StoreRfc.json  --execution-parameters file://CreateS3StoreParams.json
      ```

      您会在回复 RfcId 中收到新 RFC 的信息。保存 ID 以供后续步骤使用。

   1. 提交 RFC：

      ```
      aws amscm submit-rfc --rfc-id RFC_ID
      ```

      如果 RFC 成功，则不会收到任何输出。

   1. 要检查 RFC 状态，请运行 

      ```
      aws amscm get-rfc --rfc-id RFC_ID
      ```

# 创建、上传和部署应用程序
<a name="ex-create-app"></a>

首先，创建 WordPress 应用程序包，然后 CodeDeploy CTs 使用创建和部署应用程序。

1. 下载 WordPress、解压缩文件并创建. /scripts 目录。

   Linux 命令：

   ```
   wget https://github.com/WordPress/WordPress/archive/master.zip
   ```

   Windows：粘贴`https://github.com/WordPress/WordPress/archive/master.zip`到浏览器窗口并下载 zip 文件。

   创建用于组装软件包的临时目录。

   Linux：

   ```
   mkdir /tmp/WordPress
   ```

   Windows：创建一个 “WordPress” 目录，稍后将使用该目录路径。

1. 将 WordPress 源代码解压缩到 “WordPress” 目录并创建一个。 /scripts 目录。

   Linux：

   ```
   unzip master.zip -d /tmp/WordPress_Temp
   cp -paf /tmp/WordPress_Temp/WordPress-master/* /tmp/WordPress
   rm -rf /tmp/WordPress_Temp
   rm -f master
   cd /tmp/WordPress
   mkdir scripts
   ```

   Windows：转到你创建的 “WordPress” 目录并在那里创建一个 “脚本” 目录。

   如果您在 Windows 环境中，请务必将脚本文件的中断类型设置为 Unix (LF)。在 Notepad \$1\$1 中，这是窗口右下角的一个选项。

1. 在 WordPress 目录中创建 CodeDeploy **appsec.yml** 文件（如果复制示例，请检查缩进，每个空格都很重要）。重要：确保将 WordPress 文件（在本例中为 WordPress 目录中）复制到预期目标 (/var/www/html/WordPress) 的 “源” 路径是正确的。在示例中，appsec.yml 文件位于文件所在的目录中，因此只需要 “/”。 WordPress 另外，即使你在 Auto Scaling 组中使用了 RHEL AMI，也要保留 “操作系统：linux” 一行不变。appspec.yml 文件示例：

   ```
   version: 0.0
   os: linux
   files:
     - source: /
       destination: /var/www/html/WordPress
   hooks:
     BeforeInstall:
       - location: scripts/install_dependencies.sh
         timeout: 300
         runas: root
     AfterInstall:
       - location: scripts/config_wordpress.sh
         timeout: 300
         runas: root
     ApplicationStart:
       - location: scripts/start_server.sh
         timeout: 300
         runas: root
     ApplicationStop:
       - location: scripts/stop_server.sh
         timeout: 300
         runas: root
   ```

1. 在中创建 bash 文件脚本。 WordPress /scripts 目录。

   首先，`config_wordpress.sh`使用以下内容创建（如果您愿意，可以直接编辑 wp-config.php 文件）。
**注意**  
*DBName*替换为 HA 堆栈 RFC 中给出的值（例如，`wordpress`）。  
*DB\$1MasterUsername*替换为 HA 堆栈 RFC 中给出的`MasterUsername`值（例如，`admin`）。  
*DB\$1MasterUserPassword*替换为 HA 堆栈 RFC 中给出的`MasterUserPassword`值（例如，`p4ssw0rd`）。  
在 HA 堆栈 RFC 的执行输出中替换*DB\$1ENDPOINT*为终端节点 DNS 名称（例如`srt1cz23n45sfg.clgvd67uvydk.us-east-1.rds.amazonaws.com`）。你可以通过[GetRfc](https://docs.aws.amazon.com/managedservices/latest/ApiReference-cm/API_GetRfc.html)操作（CLI：get-rfc--rfc-id RFC\$1ID）或之前提交的 HA Stack RFC 的 AMS 控制台 RFC 详情页面中找到这一点。

   ```
   #!/bin/bash
   chmod -R 755 /var/www/html/WordPress
   cp /var/www/html/WordPress/wp-config-sample.php /var/www/html/WordPress/wp-config.php
   cd /var/www/html/WordPress
   sed -i "s/database_name_here/DBName/g" wp-config.php
   sed -i "s/username_here/DB_MasterUsername/g" wp-config.php
   sed -i "s/password_here/DB_MasterUserPassword/g" wp-config.php
   sed -i "s/localhost/DB_ENDPOINT/g" wp-config.php
   ```

1. 在同一个目录中创建`install_dependencies.sh`包含以下内容的内容：

   ```
   #!/bin/bash
   yum install -y php
   yum install -y php-mysql
   yum install -y mysql
   service httpd restart
   ```
**注意**  
HTTPS 是在启动时作为用户数据的一部分安装的，以便运行状况检查从一开始就起作用。

1. 在同一个目录中创建`start_server.sh`包含以下内容的内容：
   + 对于亚马逊 Linux 实例，请使用以下命令：

     ```
     #!/bin/bash
     service httpd start
     ```
   + 对于 RHEL 实例，请使用以下命令（额外的命令是允许 SELINUX 接受的策略）： WordPress

     ```
     #!/bin/bash
     setsebool -P  httpd_can_network_connect_db 1
     setsebool -P  httpd_can_network_connect 1
     chcon -t httpd_sys_rw_content_t /var/www/html/WordPress/wp-content -R
     restorecon -Rv /var/www/html
     service httpd start
     ```

1. 在同一个目录中创建`stop_server.sh`包含以下内容的内容：

   ```
   #!/bin/bash
   service httpd stop
   ```

1. 创建 zip 捆绑包。

   Linux：

   ```
   $ cd /tmp/WordPress
   $ zip -r wordpress.zip .
   ```

   Windows：前往 “WordPress” 目录选择所有文件并创建一个 zip 文件，一定要将其命名为 wordpress.zip。

1. 将应用程序包上传到 S3 存储桶。

   要继续部署堆栈，捆绑包需要准备就绪。

   您可以自动访问自己创建的任何 S3 存储桶实例。您可以通过堡垒或 S3 控制台访问它，然后上传 WordPress 捆绑包 drag-and-drop或浏览并选择 zip 文件。

   您也可以在 shell 窗口中使用以下命令；请确保您的 zip 文件路径正确：

   ```
   aws s3 cp wordpress.zip s3://BUCKET_NAME/
   ```

1. 部署 WordPress 应用程序包。

   在开始之前收集以下数据可以加快部署速度。

   必填数据：
   + `VPC-ID`：此值决定您的 S3 存储桶将位于何处。使用您之前使用的 VPC ID。
   + `CodeDeployApplicationName`和`CodeDeployApplicationName`：你在 HA 2 层堆栈 RFC 中使用的`ApplicationName`值设置 CodeDeployApplicationName 和。 CodeDeployDeploymentGroupName该示例使用 “WordPress”，但您可能使用了不同的值。
   + `S3Location`: 对于 `S3Bucket``BucketName`，请使用您之前创建的。`S3BundleType`和来自`S3Key`您放在 S3 商店中的捆绑包。

   1. 将 CodeDeploy 应用程序部署 CT 的执行参数 JSON 架构输出到名为 Deploy p CDApp arams.json 的 JSON 文件中。

      ```
      aws amscm get-change-type-version --change-type-id "ct-2edc3sd1sqmrb" --query "ChangeTypeVersion.ExecutionInputSchema" --output text > DeployCDAppParams.json
      ```

   1. 按如下方式修改架构并将其另存为，您可以删除和替换内容。

      ```
      {
      "Description":                       "DeployWPCDApp",
      "VpcId":                             "VPC_ID",
      "Name":                              "WordPressCDAppDeploy",
      "TimeoutInMinutes":                  60,
      "Parameters":   {
          "CodeDeployApplicationName":                "WordPress",
          "CodeDeployDeploymentGroupName":            "WordPress",
          "CodeDeployIgnoreApplicationStopFailures":   false,
          "CodeDeployRevision": {
            "RevisionType": "S3",
            "S3Location": {
              "S3Bucket":     "BUCKET_NAME",
              "S3BundleType": "zip",
              "S3Key":        "wordpress.zip" }
              }
          }
      }
      ```

   1. 将的 JSON 模板输出 CreateRfc 到当前文件夹中名为 Deploy CDApp rfc.json 的文件中：

      ```
      aws amscm create-rfc --generate-cli-skeleton > DeployCDAppRfc.json
      ```

   1. 修改并保存 Deplo CDApp y rfc.json 文件，你可以删除和替换其中的内容。请注意，`RequestedStartTime`和现在`RequestedEndTime`是可选的；排除它们会创建一个 ASAP RFC，该RFC在获得批准后立即执行（通常会自动发生）。要提交计划的 RFC，请添加这些值。

      ```
      {
      "ChangeTypeVersion":    "1.0",
      "ChangeTypeId":         "ct-2edc3sd1sqmrb",
      "Title":                "CD-Deploy-For-WP-RFC"
      }
      ```

   1. 创建 RFC，指定 Deploy CDApp Rfc 文件和 De CDApp ploy Params 执行参数文件：

      ```
      aws amscm create-rfc --cli-input-json file://DeployCDAppRfc.json  --execution-parameters file://DeployCDAppParams.json
      ```

      您会在回复 RfcId 中收到新 RFC 的信息。保存 ID 以供后续步骤使用。

   1. 提交 RFC：

      ```
      aws amscm submit-rfc --rfc-id RFC_ID
      ```

      如果 RFC 成功，则不会收到任何输出。

   1. 要检查 RFC 状态，请运行

      ```
      aws amscm get-rfc --rfc-id RFC_ID
      ```

# 验证应用程序部署
<a name="ex-validate-app-deploy"></a>

导航到先前创建的负载均衡器的终端节点 (ELB CName)， WordPress 部署的路径为：/。WordPress例如：

```
http://stack-ID-FOR-ELB.us-east-1.elb.amazonaws.com/WordPress
```

# 拆除应用程序部署
<a name="ex-tear-down-app-deploy"></a>

完成本教程后，您将需要取消部署，这样您就无需为资源付费。

以下是一个通用的堆栈删除操作。您需要提交两次，一次用于 HA 2 层堆栈，一次用于 S3 存储桶堆栈。最后，提交服务请求，要求删除 S3 存储桶的所有快照（在服务请求中包括 S3 存储桶堆栈 ID）。它们会在 10 天后自动删除，但提早删除它们可以节省一点成本。

本演练提供了使用 AMS 控制台删除 S3 堆栈的示例；此过程适用于使用 AMS 控制台删除任何堆栈。
**注意**  
如果删除 S3 存储桶，则必须先将其中的对象清空。

必填数据：
+ `StackId`: 要使用的堆栈。你可以通过查看 AMS Console **Stack** s 页面来找到它，该页面可通过左侧导航栏中的链接获得。使用 AMS SKMS API/CLI 运行有关 AMS SKMS API 参考，请参阅 AWS Artifact 控制台中的 “**报告**” 选项卡。操作（在 CLI 中`list-stack-summaries`）。
+ 本演练的更改类型 ID 为`ct-0q0bic0ywqk6c`，版本为 “1.0”，要查找最新版本，请运行以下命令：

  ```
  aws amscm list-change-type-version-summaries --filter Attribute=ChangeTypeId,Value=ct-0q0bic0ywqk6c
  ```

*内联创建*：
+ 使用内联提供的执行参数发出 create RFC 命令（内联提供执行参数时使用转义引号）。E

  ```
  aws amscm create-rfc --change-type-id "ct-0q0bic0ywqk6c" --change-type-version "1.0" --title "Delete My Stack" --execution-parameters "{\"StackId\":\"STACK_ID\"}"
  ```
+ 使用创建 RFC 操作中返回的 RFC 编号提交 RFC。在提交之前，RFC 仍处于该`Editing`状态，不会被付诸行动。

  ```
  aws amscm submit-rfc --rfc-id RFC_ID
  ```
+ 监控 RFC 状态并查看执行输出：

  ```
  aws amscm get-rfc --rfc-id RFC_ID
  ```

*模板创建*：

1. 将 RFC 模板输出到当前文件夹中的一个文件中；示例将其命名为 DeleteStackRfc .json：

   ```
   aws amscm create-rfc --generate-cli-skeleton > DeleteStackRfc.json
   ```

1. 修改并保存 DeleteStackRfc .json 文件。由于删除堆栈只有一个执行参数，因此执行参数可以在 DeleteStackRfc .json 文件本身中（无需创建带有执行参数的单独的 JSON 文件）。

    ExecutionParameters JSON 扩展中的内部引号必须使用反斜杠 (\$1) 进行转义。没有开始和结束时间的示例：

   ```
   {
   "ChangeTypeVersion":    "1.0",
   "ChangeTypeId":         "ct-0q0bic0ywqk6c",
   "Title":                "Delete-My-Stack-RFC"
   "ExecutionParameters":  "{
           \"StackId\":\"STACK_ID\"}"
   }
   ```

1. 创建 RFC：

   ```
   aws amscm create-rfc --cli-input-json file://DeleteStackRfc.json 
   ```

   您会在回复 RfcId 中收到新 RFC 的信息。例如：

   ```
   {
   "RfcId": "daaa1867-ffc5-1473-192a-842f6b326102"
   }
   ```

   保存 ID 以供后续步骤使用。

1. 提交 RFC：

   ```
   aws amscm submit-rfc --rfc-id RFC_ID
   ```

   如果 RFC 成功，则不会在命令行收到任何确认。

1. 要监控请求的状态并查看执行输出，请执行以下操作：

   ```
   aws amscm get-rfc --rfc-id RFC_ID --query "Rfc.{Status:Status.Name,Exec:ExecutionOutput}" --output table
   ```