

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

# CLI 教程：部署 Tier and Tie WordPress 网站
<a name="ex-create-wp-stack"></a>

本节介绍如何使用 AMS CLI 将高可用性 (HA) WordPress 站点部署到 AMS 环境中。这组说明包括创建必要的 WordPress CodeDeploy兼容软件包（例如 zip）文件的示例。

**注意**  
本部署演练专为在 AMZN Linux 环境中使用而设计。  
基本变量参数标注为{{replaceable}}；但是，您可能需要修改其他参数以适应您的情况。

任务和所需任务摘要 RFCs：

1. 创建基础架构：

   1. [创建 RDS 堆栈 (CLI)](ex-WP-stack-rds-create.md)

   1. 创建负载均衡器

   1. 创建 Auto Scaling 组并将其绑定到负载均衡器

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

1. 创建 WordPress 应用程序包（不需要 RFC）

1. 使用以下命令部署 WordPress 应用程序包 CodeDeploy：

   1. 创建 CodeDeploy 应用程序

   1. 创建 CodeDeploy 部署组

   1. 将您的 WordPress 应用程序包上传到 S3 存储桶（不需要 RFC）

   1. 部署 CodeDeploy 应用程序

1. 验证部署

1. 拆除部署

在经过身份验证的账户中，按照命令行中的所有步骤进行操作。

## 使用 CLI 创建 RFC
<a name="ex-WP-stack-rfc-create"></a>

有关创建的详细信息 RFCs，请参阅创[建 RFCs](https://docs.aws.amazon.com/managedservices/latest/userguide/create-rfcs.html)；有关常见 RFC 参数的说明，请参阅 [RFC 常用](https://docs.aws.amazon.com/managedservices/latest/userguide/rfc-common-params.html)参数。

## 为创建 WordPress 应用程序包 CodeDeploy
<a name="ex-create-wp-package"></a>

本节提供了创建应用程序部署包的示例。

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. 在 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\_MasterUsername}}替换为 HA 堆栈 RFC 中给出的`MasterUsername`值（例如，`admin`）。  
{{DB\_MasterUserPassword}}替换为 HA 堆栈 RFC 中给出的`MasterUserPassword`值（例如，`p4ssw0rd`）。  
在 HA 堆栈 RFC 的执行输出中替换{{DB\_ENDPOINT}}为终端节点 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\_ID）或者在你之前提交的 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。

## 使用部署 WordPress 应用程序捆绑包 CodeDeploy
<a name="ex-create-wp-deploy-app"></a>

 CodeDeploy 是一项 AWS 部署服务，可自动将应用程序部署到 Amazon EC2 实例。该过程的这一部分包括创建 CodeDeploy 应用程序、创建 CodeDeploy 部署组，然后使用部署应用程序 CodeDeploy。

### 创建 CodeDeploy 应用程序
<a name="ex-create-cd-app"></a>

 CodeDeploy 应用程序只是 AWS CodeDeploy 使用的名称或容器，用于确保在部署期间引用正确的修订版、部署配置和部署组。在本例中，部署配置就是您之前创建的 WordPress 捆绑包。

所需数据：
+ `VpcId`：您正在使用的 VPC，应与之前使用的 VPC 相同。
+ `CodeDeployApplicationName`: 账户中必须是唯一的。查看 CodeDeploy 控制台以检查现有的应用程序名称。
+ `ChangeTypeId`and`ChangeTypeVersion`：本演练的更改类型 ID 是`ct-0ah3gwb9seqk2`，要找出最新版本，请运行以下命令：

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

1. 将 CodeDeploy 应用程序 CT 的执行参数 JSON 架构输出到当前文件夹中的一个文件中；示例将其命名为 Create CDApp params.json。

   ```
   aws amscm get-change-type-version --change-type-id "ct-0ah3gwb9seqk2" --query "ChangeTypeVersion.ExecutionInputSchema" --output text > CreateCDAppParams.json
   ```

1. 按如下方式修改和保存 JSON 文件；您可以删除和替换其中的内容。

   ```
   {
   "Description":                      "{{Create WordPress CodeDeploy App}}",
   "VpcId":                            "{{VPC_ID}}",
   "StackTemplateId":                  "stm-sft6rv00000000000",
   "Name":                             "{{WordPressCDApp}}",
   "TimeoutInMinutes":                 60,
   "Parameters":   {
       "CodeDeployApplicationName":    "{{WordPressCDApp}}"
       }
   }
   ```

1. 将的 JSON 模板输出 CreateRfc 到当前文件夹中的一个文件中；示例将其命名为 Create CDApp rfc.json。

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

1. 按如下方式修改和保存 JSON 文件；您可以删除和替换其中的内容。请注意，`RequestedStartTime`和现在`RequestedEndTime`是可选的；排除它们会导致 RFC 在获得批准后立即执行（这通常是自动发生的）。要提交 “计划的” RFC，请添加这些值。

   ```
   {
   "ChangeTypeVersion":    "{{1.0}}",
   "ChangeTypeId":         "ct-0ah3gwb9seqk2",
   "Title":                "{{CD-App-For-WP-Stack-RFC}}"
   }
   ```

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

   ```
   aws amscm create-rfc --cli-input-json file://CreateCDAppRfc.json --execution-parameters file://CreateCDAppParams.json
   ```

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

1. 提交 RFC：

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

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

1. 提交 RFC：

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

### 创建 CodeDeploy 部署组
<a name="ex-create-cd-dep-group"></a>

创建 CodeDeploy 部署组。

 CodeDeploy 部署组定义了一组以部署为目标的单个实例。

所需数据：
+ `VpcId`：您正在使用的 VPC，应与之前使用的 VPC 相同。
+ `CodeDeployApplicationName`：使用您之前创建的值。
+ `CodeDeployAutoScalingGroups`：使用您之前创建的 Auto Scaling 组的名称。
+ `CodeDeployDeploymentGroupName`：部署组的名称。此名称对于与部署组关联的每个应用程序来说必须是唯一的。
+ `CodeDeployServiceRoleArn`：使用示例中给出的公式。
+ `ChangeTypeId`and`ChangeTypeVersion`：本演练的更改类型 ID 是`ct-2gd0u847qd9d2`，要找出最新版本，请运行以下命令：

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

1. 将执行参数 JSON 架构输出到当前文件夹中的一个文件中；示例将其命名为 Cre CDDep GroupParams ate.json。

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

1. 按如下方式修改和保存 JSON 文件；您可以删除和替换其中的内容。

   ```
   {
   "Description":                      "{{CreateWPCDDeploymentGroup}}",
   "VpcId":                            "{{VPC_ID}}",
   "StackTemplateId":                  "stm-sp9lrk00000000000",
   "Name":                             "{{WordPressCDAppGroup}}",
   "TimeoutInMinutes":                 60,
   "Parameters":   {
       "CodeDeployApplicationName":        "{{WordPressCDApp}}",
       "CodeDeployAutoScalingGroups":      ["{{ASG_NAME}}"],
       "CodeDeployDeploymentConfigName":   "CodeDeployDefault.HalfAtATime",
       "CodeDeployDeploymentGroupName":    "{{UNIQUE_CDDepGroupNAME}}",
       "CodeDeployServiceRoleArn":         "arn:aws:iam::{{ACCOUNT_ID}}:role/aws-codedeploy-role"
       }
   }
   ```

1. 将的 JSON 模板输出 CreateRfc 到当前文件夹中的一个文件中；示例将其命名为 Cre CDDep GroupRfc ate.json。

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

1. 按如下方式修改和保存 JSON 文件；您可以删除和替换其中的内容。请注意，`RequestedStartTime`和现在`RequestedEndTime`是可选的；排除它们会导致 RFC 在获得批准后立即执行（这通常是自动发生的）。要提交 “计划的” RFC，请添加这些值。

   ```
   {
   "ChangeTypeVersion":    "{{1.0}}",
   "ChangeTypeId":         "ct-2gd0u847qd9d2",
   "Title":                "{{CD-Dep-Group-For-WP-Stack-RFC}}"
   }
   ```

1. 创建 RFC，指定创建CDDepGroupRfc 文件和执行参数文件：

   ```
   aws amscm create-rfc --cli-input-json file://CreateCDDepGroupRfc.json --execution-parameters file://CreateCDDepGroupParams.json
   ```

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

1. 提交 RFC：

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

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

1. 检查 RFC 状态：

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

### 上传 WordPress 应用程序
<a name="ex-upload-wp-package"></a>

您可以自动访问自己创建的任何 S3 存储桶实例。您可以通过 Bastions（请参阅[访问实例](https://docs.aws.amazon.com/managedservices/latest/userguide/using-bastions.html)）或 S3 控制台访问它，然后上传 CodeDeploy 捆绑包。要继续部署堆栈，捆绑包需要准备就绪。该示例使用先前创建的存储桶名称。

```
aws s3 cp wordpress/wordpress.zip s3://ACCOUNT_ID-codedeploy-bundles/
```

### 使用部署 WordPress 应用程序 CodeDeploy
<a name="ex-cd-deploy-wp-package"></a>

部署 CodeDeploy 应用程序。

拥有 CodeDeploy 应用程序包和部署组后，使用此 RFC 部署应用程序。

所需数据：
+ `VPC-ID`：您正在使用的 VPC，应与之前使用的 VPC 相同。
+ `CodeDeployApplicationName`：使用您之前创建的 CodeDeploy 应用程序的名称。
+ `CodeDeployDeploymentGroupName`：使用您之前创建的 CodeDeploy 部署组的名称。
+ `S3Location`（您上传应用程序包的位置）:`S3Bucket`: 您之前创建的，`S3BundleType`以及`S3Key`：您放在 S3 商店中的捆绑包的类型和名称。 BucketName 
+ `ChangeTypeId`and`ChangeTypeVersion`：本演练的更改类型 ID 是`ct-2edc3sd1sqmrb`，要找出最新版本，请运行以下命令：

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

1. 将 CodeDeploy 应用程序部署 CT 的执行参数 JSON 架构输出到当前文件夹中的一个文件中；示例将其命名为 Deploy P CDApp arams.json。

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

1. 按如下方式修改 JSON 文件；您可以删除和替换其中的内容。对于 `S3Bucket``BucketName`，请使用您之前创建的。

   ```
   {
   "Description":                      "{{Deploy WordPress CodeDeploy Application}}",
   "VpcId":                            "{{VPC_ID}}",
   "Name":                             "{{WP CodeDeploy Deployment Group}}",
   "TimeoutInMinutes":                 60,
   "Parameters":   {
       "CodeDeployApplicationName":        "{{WordPressCDApp}}",
       "CodeDeployDeploymentGroupName":    "{{WordPressCDDepGroup}}",
       "CodeDeployIgnoreApplicationStopFailures": {{false}},
       "CodeDeployRevision": {
         "RevisionType": "{{S3}}",
         "S3Location": {
           "S3Bucket": "{{ACCOUNT_ID.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 文件；您可以删除和替换其中的内容。

   ```
   {
   "ChangeTypeVersion":    "{{1.0}}",
   "ChangeTypeId":         "ct-2edc3sd1sqmrb",
   "Title":                "{{CD-Deploy-For-WP-Stack-RFC}}",
   "RequestedStartTime":   "{{2017-04-28T22:45:00Z}}",
   "RequestedEndTime":     "{{2017-04-28T22:45:00Z}}"
   }
   ```

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

   ```
   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 成功，则不会收到任何输出。

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

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

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

## 拆除应用程序部署
<a name="ex-delete-wp-deploy"></a>

要取消部署，您需要提交针对 RDS 数据库堆栈、应用程序负载均衡器、Auto Scaling 组、S3 存储桶以及 Code Deploy 应用程序和组（总共六个）的删除堆栈 C RFCs T。此外，您可以提交服务请求以删除 RDS 快照（它们将在十天后自动删除，但在此期间确实会花费少量费用）。收集所有 IDs 人的堆栈，然后按照以下步骤操作。

本演练提供了使用 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 扩展中的内部引号必须使用反斜杠 (\\) 进行转义。没有开始和结束时间的示例：

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