覆盖内置模板 - AWS OpsWorks

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

覆盖内置模板

重要

AWS OpsWorks Stacks 不再接受新客户。在 2024 年 5 月 26 日之前,现有客户将能够正常使用 OpsWorks 控制台、API、CLI 和 CloudFormation 资源,届时它们将停产。为准备此过渡,我们建议您尽快将堆栈过渡到AWS Systems Manager。有关更多信息,请参阅 AWS OpsWorks Stacks 生命周期终止常见问题解答将 AWS OpsWorks Stacks 应用程序迁移到 AWS Systems Manager Application Manager

注意

本主题仅适用于 Linux 堆栈。您无法在 Windows 堆栈上覆盖内置模板。

AWS OpsWorks Stacks 内置配方使用模板在实例上创建文件,主要是服务器 (如 Apache) 的配置文件。例如,apache2 配方使用 apache2.conf.erb 模板创建 Apache 服务器的主配置文件 httpd.conf (Amazon Linux) 或 apache2.conf (Ubuntu)。

这些模板中的大部分配置设置由属性表示,因此自定义配置文件的首选方法是覆盖相应的内置属性。有关示例,请参阅覆盖内置属性。但是,如果您要自定义的设置不是由内置属性表示的,或根本不在模板中,则您必须覆盖模板本身。本主题介绍如何覆盖内置模板以指定自定义 Apache 配置设置。

您可以通过将 ErrorDocument 设置添加到 httpd.conf 文件来提供对 Apache 的自定义错误响应。apache2.conf.erb 仅包含一些注释掉的示例,如下所示:

... # # Customizable error responses come in three flavors: # 1) plain text 2) local redirects 3) external redirects # # Some examples: #ErrorDocument 500 "The server made a boo boo." #ErrorDocument 404 /missing.html #ErrorDocument 404 "/cgi-bin/missing_handler.pl" #ErrorDocument 402 http://www.example.com/subscription_info.html ...

由于这些设置是硬编码注释,因此您无法通过覆盖属性来指定自定义值;您必须覆盖模板本身。但是,与属性不同,您无法通过任何方法覆盖模板文件的特定部分。您必须使用与内置版本相同的名称创建自定义说明书,将模板文件复制到同一子目录,然后根据需要修改文件。本主题说明如何覆盖 apache2.conf.erb 以提供对错误 500 的自定义响应。有关覆盖模板的一般性讨论,请参阅使用自定义模板

重要

当您覆盖内置模板时,内置配方将使用您的模板的自定义版本而不是内置版本。如果 AWS OpsWorks Stacks 更新了内置模板,自定义模板将变得不同步且可能无法正常运行。AWS OpsWorksAWS OpsWorks Stacks 不会经常进行此类更改,并且当模板发生更改时, Stacks 会列出更改并为您提供升级到新版本的选项。建议您监控 AWS OpsWorks Stacks 存储库的更改并根据需要手动更新您的自定义模板。请注意,该存储库对于每个支持的 Chef 版本都有一个单独的分支,因此,请确保您位于正常的分支中。

要开始,请创建一个自定义说明书。

创建说明书
  1. opsworks_cookbooks 目录中,创建名为 apache2 的说明书目录,然后导航到该目录。要覆盖内置模板,自定义说明书必须具有与内置说明书相同的名称,本例中为 apache2

    注意

    如果您已完成覆盖内置属性演练,则可在本例中使用相同的 apache2 说明书,然后跳过步骤 2。

  2. 创建一个包含以下内容的 metadata.rb 文件,并将该文件保存到 apache2 目录。

    name "apache2" version "0.1.0"
  3. apache2 目录中创建一个 templates/default 目录。

    注意

    templates/default 目录适用于 Amazon Linux 实例,这些实例使用默认 apache2.conf.erb 模板。Ubuntu 14.04 实例使用特定于操作系统的 apache2.conf.erb 模板,该模板位于 templates/ubuntu-14.04 目录中。如果您希望自定义项也应用于 Ubuntu 14.04 实例,则还必须覆盖该模板。

  4. 内置apache2.conf.erb模板复制到您的 templates/default 目录。打开模板文件,取消注释 ErrorDocument 500 行,然后提供自定义错误消息,如下所示:

    ... ErrorDocument 500 "A custom error message." #ErrorDocument 404 /missing.html ...
  5. 创建 opsworks_cookbooks 的名为 opsworks_cookbooks.zip.zip 存档,并将文件上传到 Amazon Simple Storage Service (Amazon S3) 存储桶。为简单起见,请公开该存档。记录该存档的 URL 以供将来使用。您也可以将说明书存储在私有 Amazon S3 存档或其他存储库类型中。有关更多信息,请参阅 说明书存储库

    发送到 Amazon S3 存储桶的内容可能包含客户内容。有关删除敏感数据的更多信息,请参阅如何清空 S3 存储桶?如何删除 S3 存储桶?

注意

为简单起见,本示例向该模板添加了一个硬编码的错误消息。要更改它,您必须修改该模板并重新安装说明书。要为自己提供更大的灵活性,您可以在自定义说明书的 属性文件中为错误字符串定义一个默认自定义属性customize.rb,然后将该属性的值分配到 ErrorDocument 500。例如,如果您将属性命名为 [:apache][:custom][:error500],则 apache2.conf.erb 中的对应行将类似于以下内容:

... ErrorDocument 500 <%= node[:apache][:custom][:error500] %> #ErrorDocument 404 /missing.html ...

您随后可以通过覆盖 [:apache][:custom][:error500] 来随时更改自定义错误消息。如果您使用自定义 JSON 覆盖属性,则您甚至不需要接触说明书。

要使用自定义模板,请创建一个堆栈并安装说明书。

使用自定义模板
  1. 打开 AWS OpsWorks Stacks 控制台,然后选择 Add Stack (添加堆栈)

  2. 指定以下标准设置:

    • 姓名 — ApacheTemplate

    • 区域-美国西部(俄勒冈州)

    • 默认 SSH 密钥 — Amazon Elastic Compute Cloud(Amazon EC2)密钥对

      如果您需要创建 Amazon EC2 密钥对,请参阅 Amazon EC2 密钥对。请注意,该密钥对必须属于与实例相同的 Amazon Web Services Region。

    选择 Advanced>>,然后选择 Use custom Chef cookbooks 指定以下设置:

    • 存储库类型 -Http 存档

    • 存储库 URL -您之前记录的说明书存档 URL。

    接受其他设置的默认值,然后选择 Add Stack 创建堆栈。

  3. 选择 Add a layer,然后将采用默认设置的 Java App Server 层添加到堆栈。

  4. 向层添加全天候实例 (采用默认设置) 并启动该实例。

    本示例中,一个 t2.micro 实例已足够。

  5. 在实例处于联机状态后,使用 SSH 连接到它httpd.conf 文件位于 /etc/httpd/conf 目录中。该文件应包含您的自定义 ErrorDocument 设置,后者将类似于以下内容:

    ... # Some examples: ErrorDocument 500 "A custom error message." #ErrorDocument 404 /missing.html #ErrorDocument 404 "/cgi-bin/missing_handler.pl" #ErrorDocument 402 http://www.example.com/subscription_info.html ...