传递数据到应用程序 - 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

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

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

要将键/值数据传递到堆栈的实例,请将类似于下文的自定义 JSON 添加到堆栈。有关如何将自定义 JSON 添加到堆栈的更多信息,请参阅使用自定义 JSON

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

该示例假定您有两个应用程序,其短名称为 app1app2,每个应用程序均有三个数据值。随附的配方假设您使用应用程序的短名称来确定关联的数据,其他名称任意。有关应用程序短名称的更多信息,请参阅设置

以下示例中的配方显示了如何为每个应用程序从 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 属性

对于 deploy 中的各个应用程序,配方执行以下操作:

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

    有关 AWS OpsWorks Stacks 如何安装应用程序的更多信息,请参阅Deploy 配方

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

将数据传递到应用程序
  1. 将应用程序添加到堆栈并记录其短名称。有关更多信息,请参阅添加应用程序

  2. 将自定义 JSON 以及应用程序的数据添加到 deploy 属性,如上文中所述。有关如何将自定义 JSON 添加到堆栈的更多信息,请参阅使用自定义 JSON

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

  4. 在堆栈上安装说明书。有关更多信息,请参阅安装自定义说明书

  5. 将配方分配到应用程序服务器层的部署生命周期事件。AWS OpsWorks然后,Stacks 将在启动之后在各个新实例上运行配方。有关更多信息,请参阅执行配方

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

注意

如果数据文件必须在部署应用程序之前到位,您还可以将配方分配到层的设置生命周期事件,该事件在实例完成启动之后立即发生一次。不过,AWS 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 代码的命令:

#!/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 来更新数据值。

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