

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

# 传递数据到应用程序
<a name="apps-data"></a>

**重要**  
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止，新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问，请通过 re [AWS : Post 或通过 Pre](https://repost.aws/) mium Su [AWS pp](https://aws.amazon.com/support) ort 与 AWS 支持 团队联系。

将键/值对之类的数据传递到服务器上的应用程序通常会很有用。为此，请使用[自定义 JSON](workingstacks-json.md) 添加数据到堆栈。 OpsWorks Stacks 将每个生命周期事件的数据添加到每个实例的节点对象。

不过请注意，虽然配方可以使用 Chef 属性从节点对象获取自定义 JSON 数据，但应用程序不能。将自定义 JSON 数据传输到一个或多个应用程序的方法之一是，实施从 `node` 对象提取数据的自定义配方并将其写入到应用程序可读取的文件中。本主题中的示例显示了如何将数据写入 YAML 文件，但您可以为其他格式 (例如 JSON 或 XML) 使用相同的基本方法。

要将键/值数据传递到堆栈的实例，请将类似于下文的自定义 JSON 添加到堆栈。有关如何将自定义 JSON 添加到堆栈的更多信息，请参阅[使用自定义 JSON](workingstacks-json.md)。

```
{
  "my_app_data": {
    "app1": {
      "key1": "value1",
      "key2": "value2",
      "key3": "value3"
    },
    "app2": {
      "key1": "value1",
      "key2": "value2",
      "key3": "value3"
    }
  }
}
```

该示例假定您有两个应用程序，其短名称为 `app1` 和 `app2`，每个应用程序均有三个数据值。随附的配方假设您使用应用程序的短名称来确定关联的数据，其他名称任意。有关应用程序短名称的更多信息，请参阅[设置](workingapps-creating.md#workingapps-creating-settings)。

以下示例中的配方显示了如何为每个应用程序从 `deploy` 属性提取数据并将其放到 `.yml` 文件中。该配方假定您的自定义 JSON 包含每个应用程序的数据。

```
node[:deploy].each do |app, deploy|
  file File.join(deploy[:deploy_to], 'shared', 'config', 'app_data.yml') do
    content YAML.dump(node[:my_app_data][app].to_hash)
  end
end
```

`deploy` 属性为每个应用程序包含一个属性，使用该应用程序的短名称命名。每个应用程序属性包含一组属性，表示有关应用程序的各种信息。此示例使用应用程序的部署目录，由 `[:deploy][:app_short_name][:deploy_to]` 属性表示。有关 `[:deploy]` 的更多信息，请参阅[deploy 属性](attributes-json-deploy.md)。

对于 `deploy` 中的各个应用程序，配方执行以下操作：

1. 在应用程序 `[:deploy_to]` 目录的 `shared/config` 子目录中创建名为 `app_data.yml` 的文件。

   有关 OpsWorks Stacks 如何安装应用程序的更多信息，请参阅[Deploy 配方](create-custom-deploy.md)。

1. 将应用程序的自定义 JSON 值转换为 YAML，并将格式化数据写入 `app_data.yml`。

**将数据传递到应用程序**

1. 将应用程序添加到堆栈并记录其短名称。有关更多信息，请参阅 [添加应用程序](workingapps-creating.md)。

1. 将自定义 JSON 以及应用程序的数据添加到 `deploy` 属性，如上文中所述。有关如何将自定义 JSON 添加到堆栈的更多信息，请参阅[使用自定义 JSON](workingstacks-json.md)。

1. 使用基于前例中的代码创建说明书并将配方添加到其中，根据需要修改在自定义 JSON 中使用的属性名称。有关如何创建说明书和配方的更多信息，请参阅[说明书和诀窍](workingcookbook.md)。如果您已有此堆栈的自定义说明书，则还可以将配方添加到现有的说明书，甚至可以将代码添加到现有的部署说明书。

1. 在堆栈上安装说明书。有关更多信息，请参阅 [安装自定义说明书](workingcookbook-installingcustom-enable.md)。

1. 将配方分配给应用服务器层的 Deploy 生命周期事件。 OpsWorks 然后，Stacks 将在每个新实例启动后对其运行配方。有关更多信息，请参阅 [执行配方](workingcookbook-executing.md)。

1. 部署应用程序，这还将安装当前包含您数据的堆栈配置和部署属性。

**注意**  
如果数据文件必须在部署应用程序之前到位，您还可以将配方分配到层的设置生命周期事件，该事件在实例完成启动之后立即发生一次。但是， OpsWorks Stacks 尚未创建部署目录，因此您的配方应在创建数据文件之前明确创建所需的目录。以下示例明确创建应用程序的 `/shared/config` 目录，然后在该目录中创建数据文件。  

```
node[:deploy].each do |app, deploy|

 directory "#{deploy[:deploy_to]}/shared/config" do
      owner "deploy"
      group "www-data"
      mode 0774
      recursive true
      action :create
    end

  file File.join(deploy[:deploy_to], 'shared', 'config', 'app_data.yml') do
    content YAML.dump(node[:my_app_data][app].to_hash)
  end
end
```

要加载数据，您可以使用类似于以下 [Sinatra](http://www.sinatrarb.com/) 代码的命令：

```
#!/usr/bin/env ruby
# encoding: UTF-8
require 'sinatra'
require 'yaml'

get '/' do
  YAML.load(File.read(File.join('..', '..', 'shared', 'config', 'app_data.yml')))
End
```

您可以随时更新自定义 JSON 来更新应用程序的数据值，如下所示。

**更新应用程序数据**

1. 编辑自定义 JSON 来更新数据值。

1. 再次部署应用程序，这会指示 OpsWorks Stacks 在堆栈的实例上运行 Deploy 配方。配方将使用来自更新后堆栈配置和部署属性的属性，因此您的自定义配方将使用当前值更新数据文件。