

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 傳遞資料到應用程式
<a name="apps-data"></a>

**重要**  
 AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止，並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問，請透過 [AWS re：Post](https://repost.aws/) 或透過 [AWS Premium Support](https://aws.amazon.com/support) 聯絡 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. 在應用程式的 `app_data.yml` 目錄中的 `shared/config` 子目錄內，建立名為 `[:deploy_to]` 的檔案。

   如需 Stacks OpsWorks 如何安裝應用程式的詳細資訊，請參閱 [部署配方](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. 將配方指派給應用程式伺服器層的部署生命週期事件。 OpsWorks 堆疊接著會在開機後在每個新執行個體上執行配方。如需詳細資訊，請參閱[執行配方](workingcookbook-executing.md)。

1. 部署應用程式，同時也會安裝包含您資料的堆疊組態和部署屬性。

**注意**  
若資料檔案必須在應用程式部署前便存在，您也可以將配方指派給 layer 的安裝生命週期事件。該事件只會在執行個體完成開機後執行一次。不過， 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 在堆疊的執行個體上執行部署配方。配方會使用已更新堆疊組態及部署屬性的屬性，因此您的自訂配方會使用目前的值更新資料檔案。