AWS OpsWorks
ユーザーガイド (API バージョン 2013-02-18)

AWS OpsWorks スタックのデータバッグのリファレンス

AWS OpsWorks スタックでは、レシピに対して各種設定を Chef データバッグコンテンツとして公開しています。このリファレンスでは、このデータバッグコンテンツを一覧で示します。

データバッグは Chef の概念です。データバッグはインスタンスで JSON データとして保存されるグローバル変数です。JSON データは Chef からアクセス可能です。たとえば、データバッグにはアプリケーションのソース URL、インスタンスのホスト名、関連するスタックの VPC ID などのグローバル変数を保存できます。AWS OpsWorks スタックは各スタックのインスタンスにデータバッグを保存します。Linux インスタンスでは、AWS OpsWorks スタックはデータバッグを /var/chef/runs/run-ID/data_bags ディレクトリに保存します。Windows インスタンスでは、&OPS; スタックはデータバッグを drive:\chef\runs\run-id\data_bags ディレクトリに保存します。どちらの場合も、run-ID はインスタンスでの Chef の実行ごとに AWS OpsWorks スタックが割り当てる一意の ID です。これらのディレクトリにはデータバッグ (サブディレクトリ) のセットが含まれています。各データバッグには、ゼロ個以上のデータバッグアイテムが含まれ、これらはデータバッグコンテンツのセットを含む JSON 形式のファイルです。

注記

AWS OpsWorks スタックでは、暗号化されたデータバッグはサポートされていません。パスワードや証明書などの機密データを暗号化された形式で保存するには、プライベート S3 バケットに保存することをお勧めします。これで、Amazon SDK for Ruby を使用するカスタムレシピを作成できます。例については、「Ruby の SDK の使用」を参照してください。

データバッグのコンテンツには、次のいずれかを含めることができます。

  • 標準の Ruby 構文に従う String コンテンツ。一重引用符または二重引用符を使用できますが、一部の特殊文字を含む文字列は二重引用符が必要です。詳細については、Ruby のドキュメントのサイトを参照してください。

  • true または false (引用符なし) である Boolean コンテンツ。

  • 値が 42.5 のような整数または 10 進数 (引用符なし) である Number コンテンツ。

  • [ '80', '443' ] のように角括弧に囲まれたカンマ区切り形式の値 (引用符なし) である List コンテンツ。

  • "my-app": {"elastic_ip": null,...} など、追加のデータバッグコンテンツを含む JSON オブジェクト

Chef レシピは、Chef 検索を通じて、または直接データバッグ、データバッグ項目、およびデータバッグコンテンツにアクセスできます。以下では、両方のアクセス方法を使用する方法を説明します (ただし、Chef 検索をお勧めします)。

Chef 検索を通じてデータバッグにアクセスするには、search メソッドを使用し、目的の検索インデックスを指定します。AWS OpsWorks スタックには、次の検索インデックスが用意されています。

検索インデックス名がわかれば、その検索インデックスのデータバッグのコンテンツにアクセスできます。たとえば、次のレシピコードは aws_opsworks_app 検索インデックスを使用して、aws_opsworks_app データバッグ (aws_opsworks_app ディレクトリ) の最初のデータバッグ項目 (最初の JSON ファイル) のコンテンツを取得します。次に、コードは 2 つのメッセージを Chef ログに書き込みます。1 つはアプリケーションの短縮名のデータバッグコンテンツ (JSON ファイルの文字列) で、もう 1 つはアプリケーションのソース 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-chef-12-linux-demo/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 を指定して、レシピを実行中のインスタンスを表すことができます。次のレシピコードは、対応するデータバッグ項目のコンテンツを使用して、対応するインスタンスに対して AWS OpsWorks スタックが生成した ID およびオペレーティングシステムとともに、メッセージを Chef ログに書き込みます。

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_bag および 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

これらの 2 つの方法のうち、Chef 検索を使用することをお勧めします。このガイドの関連する例では、すべてこの方法を示します。