

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

# OpsWorks Stacks 資料包參考
<a name="data-bags"></a>

**重要**  
 AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止，並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問，請透過 [AWS re：Post](https://repost.aws/) 或透過 [AWS Premium Support](https://aws.amazon.com/support) 聯絡 AWS 支援 團隊。

OpsWorks Stacks 以 Chef 資料包內容的形式向配方公開各種設定。此參考清單列出資料包的內容。

「資料包」**是一種 Chef 概念。資料包為以 JSON 資料存放在執行個體上的全域變數。JSON 資料可從 Chef 進行存取。例如，資料包可以存放全域變數，例如應用程式的來源 URL、執行個體的主機名稱，以及相關聯的堆疊 VPC 識別符。 OpsWorks Stacks 會將其資料包存放在每個堆疊的執行個體上。在 Linux 執行個體上， OpsWorks Stacks 會將資料包存放在 `/var/chef/runs/run-ID/data_bags`目錄中。在 Windows 執行個體上，它會將資料包存放在 `drive:\chef\runs\run-id\data_bags` 目錄中。在這兩種情況下，*run-ID* 都是 Stacks OpsWorks 指派給執行個體上每個 Chef 執行的唯一 ID。這些目錄包含一組資料包 (子目錄)。每個資料包都包含零或多個資料包項目，即包含資料包內容組的 JSON 格式檔案。

**注意**  
OpsWorks Stacks 不支援加密的資料包。若要以加密形式存放機密資料 (例如密碼或憑證)，建議您將它存放在私有 S3 儲存貯體中。然後，您可以建立自訂配方，定義其使用[適用於 Ruby 的 Amazon 開發套件](https://aws.amazon.com/documentation/sdk-for-ruby/)擷取資料。如需範例，請參閱 [使用適用於 Ruby 的 SDK](cookbooks-101-opsworks-s3.md)。

資料包內容可包含下列任何項目：
+ **字串**內容遵循標準 Ruby 語法，可使用單引號或雙引號，雖然包含特定特殊字元的字串必須使用雙引號。如需詳細資訊，請前往 [Ruby](http://www.ruby-lang.org/en/documentation/) 文件網站。
+ **布林值**內容，為 `true` 或 `false` (無引號)。
+ **數字**內容，為整數或小數，例如 `4` 或 `2.5` (無引號)。
+ **清單**內容，其格式為以中括弧圍起的逗點分隔值 (無引號)，例如 `[ '80', '443' ]`
+ **JSON 物件**，包含額外的資料包內容，例如 `"my-app": {"elastic_ip": null,...}`。

Chef 配方可透過 Chef 搜尋或直接存取資料包、資料包項目，以及資料包內容。下列內容說明如何使用兩種存取方式 (雖然 Chef 搜尋為偏好選項)。

若要透過 Chef 搜尋存取資料包，請使用[搜尋](https://docs.chef.io/dsl_recipe.html#search)方法，指定所需的搜尋索引。 OpsWorks Stacks 提供下列搜尋索引：
+ [aws\$1opsworks\$1app](data-bag-json-app.md)，代表堆疊的一組部署應用程式。
+ [aws\$1opsworks\$1command](data-bag-json-command.md)，代表在堆疊上執行的一組命令。
+ [aws\$1opsworks\$1ecs\$1cluster](data-bag-json-ecs-cluster.md)，代表堆疊的一組 Amazon Elastic Container Service (Amazon ECS) 叢集執行個體。
+ [aws\$1opsworks\$1elastic\$1load\$1balancer](data-bag-json-elb.md)，代表堆疊的一組 Elastic Load Balancing 負載平衡器。
+ [aws\$1opsworks\$1instance](data-bag-json-instance.md)，代表堆疊的一組執行個體。
+ [aws\$1opsworks\$1layer](data-bag-json-layer.md)，代表堆疊的一組 layer。
+ [aws\$1opsworks\$1rds\$1db\$1instance](data-bag-json-rds.md)，代表堆疊的一組 Amazon Relational Database Service (Amazon RDS) 執行個體。
+ [aws\$1opsworks\$1stack](data-bag-json-stack.md)，代表堆疊。
+ [aws\$1opsworks\$1user](data-bag-json-user.md)，代表堆疊的一組使用者。

在您了解搜尋索引名稱之後，您便可以存取該搜尋索引的資料包內容。例如，下列配方程式碼使用 `aws_opsworks_app` 搜尋索引取得 `aws_opsworks_app` 資料包 (`aws_opsworks_app` 目錄) 中第一個資料包項目 (第一個 JSON 檔案) 的內容。然後，程式碼將兩個訊息寫入 Chef 日誌，一個有應用程式短名資料包內容 (JSON 檔案中的字串)，另一個有應用程式來源 URL 資料包內容 (JSON 檔案中的另一個字串)：

```
app = search("aws_opsworks_app").first
Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********")
Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********")
```

其中 `['shortname']` 和 `['app_source']['url']` 指定對應 JSON 檔案中的下列資料包內容：

```
{
  ...
  "shortname": "mylinuxdemoapp",
  ...
  "app_source": {
    ...
    "url": "https://s3.amazonaws.com/opsworks-demo-assets/opsworks-linux-demo-nodejs.tar.gz",
  },
  ...  
}
```

如需您可以搜尋的資料包內容清單，請參閱本節中的參考主題。

您也可以逐一查看資料包中的一組資料包項目。例如，下列配方程式碼 (與先前範例相似) 會在有超過一個資料包項目時，逐一查看資料包中的每個資料包項目。

```
search("aws_opsworks_app").each do |app|
  Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********")
  Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********")
end
```

若您知道特定資料包內容存在，您可以使用下列語法尋找對應的資料包項目：

```
search("search_index", "key:value").first
```

例如，下列配方程式碼使用 `aws_opsworks_app` 搜尋索引尋找包含應用程式短名 `mylinuxdemoapp` 的資料包項目。程式碼接著會使用資料包項目的內容將對應應用程式短名和來源 URL 寫入 Chef 日誌：

```
app = search("aws_opsworks_app", "shortname:mylinuxdemoapp").first
Chef::Log.info("********** For the app with the short name '#{app['shortname']}', the app's URL is '#{app['app_source']['url']}' **********")
```

僅適用於 `aws_opsworks_instance` 搜尋索引，您可以指定 `self:true` 代表正在執行配方的執行個體。下列配方程式碼使用對應的資料包項目內容，搭配對應的執行個體 Stacks 產生的 ID 和作業系統，將訊息寫入 Chef OpsWorks 日誌：

```
instance = search("aws_opsworks_instance", "self:true").first
Chef::Log.info("********** For instance '#{instance['instance_id']}', the instance's operating system is '#{instance['os']}' **********")
```

除了使用 Chef 搜尋存取資料包、資料包項目和資料包內容之外，您也可以直接存取他們。若要執行此作業，請使用 [data\$1bag](https://docs.chef.io/dsl_recipe.html#data-bag) 和 [data\$1bag\$1item](https://docs.chef.io/dsl_recipe.html#data-bag-item) 方法分別存取資料包和資料包項目。例如，下列配方程式碼會執行與先前範例一模一樣的動作，但是它會直接存取單一資料包項目，並會在超過一個的時候存取多個資料包項目：

```
# Syntax: data_bag_item("the data bag name", "the file name in the data bag without the file extension")
app = data_bag_item("aws_opsworks_app", "mylinuxdemoapp")
Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********")
Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********")
    
data_bag("aws_opsworks_app").each do |data_bag_item|
  app = data_bag_item("aws_opsworks_app", data_bag_item)
  Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********")
  Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********")
end
```

在這兩種方法中，我們建議您使用 Chef 搜尋。所有本指南中的相關範例都會示範此方法。

**Topics**
+ [應用程式資料包 (aws\$1opsworks\$1app)](data-bag-json-app.md)
+ [命令資料包 (aws\$1opsworks\$1command)](data-bag-json-command.md)
+ [Amazon ECS 叢集資料包 (aws\$1opsworks\$1ecs\$1cluster)](data-bag-json-ecs-cluster.md)
+ [Elastic Load Balancing 資料包 (aws\$1opsworks\$1elastic\$1load\$1balancer)](data-bag-json-elb.md)
+ [執行個體資料包 (aws\$1opsworks\$1instance)](data-bag-json-instance.md)
+ [Layer 資料包 (aws\$1opsworks\$1layer)](data-bag-json-layer.md)
+ [Amazon RDS 資料包 (aws\$1opsworks\$1rds\$1db\$1instance)](data-bag-json-rds.md)
+ [堆疊資料包 (aws\$1opsworks\$1stack)](data-bag-json-stack.md)
+ [使用者資料包 (aws\$1opsworks\$1user)](data-bag-json-user.md)